/// <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)); }
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); }