Example #1
0
        /// <summary>
        /// Captures the position and rotation of the current subject.
        /// </summary>
        /// <param name="time">Time of the capture.</param>
        /// <remarks>
        /// This function determines whether or not it can drop previous captures to save space. If the subject is moving in a predictable fashion, then it might drop some positional frames for the sake of memory. This will not reduce the quality of the recording.
        /// </remarks>
        public void Capture(float time)
        {
            if (capturedPositions.Count > 1)
            {
                VectorCapture beforeLastPosition = capturedPositions.Last.Previous.Value;
                VectorCapture lastPosition       = capturedPositions.Last.Value;

                Vector3 lastPositionalVelocity = (lastPosition.Vector - beforeLastPosition.Vector) / (lastPosition.Time - beforeLastPosition.Time);
                Vector3 curPositionalVelocity  = (subject.transform.position - lastPosition.Vector) / (time - lastPosition.Time);

                if (V3Equal(lastPositionalVelocity, curPositionalVelocity))
                {
                    capturedPositions.RemoveLast();
                }
            }
            capturedPositions.AddLast(new VectorCapture(time, subject.transform.position));


            if (capturedRotations.Count > 1)
            {
                VectorCapture beforeLastRotation = capturedRotations.Last.Previous.Value;
                VectorCapture lastRotation       = capturedRotations.Last.Value;

                Vector3 lastRotationalVelocity = (lastRotation.Vector - beforeLastRotation.Vector) / (lastRotation.Time - beforeLastRotation.Time);
                Vector3 curRotationalVelocity  = (subject.transform.rotation.eulerAngles - lastRotation.Vector) / (time - lastRotation.Time);

                if (V3Equal(lastRotationalVelocity, curRotationalVelocity))
                {
                    capturedRotations.RemoveLast();
                }
            }
            capturedRotations.AddLast(new VectorCapture(time, subject.transform.rotation.eulerAngles));
        }
Example #2
0
        private static VectorCapture[] FromTransport(Google.Protobuf.Collections.RepeatedField <Transport.VectorCapture> transportCapture)
        {
            var vectorCapture = new VectorCapture[transportCapture.Count];

            for (int i = 0; i < transportCapture.Count; i++)
            {
                vectorCapture[i] = new VectorCapture(transportCapture[i].Time, new Vector3(transportCapture[i].X, transportCapture[i].Y, transportCapture[i].Z));
            }
            return(vectorCapture);
        }