using UnityEngine; using VRSDK.Collections; namespace VRSDK { public class HistoryBuffer : MonoBehaviour { [SerializeField] private int bufferSize = 10; private Buffer velocityHistory; private Buffer angularVelocityHistory; private Buffer localPositionHistory; private Buffer positionHistory; private Buffer rotationHistory; private Vector3 lastLocalPosition = Vector3.zero; public Buffer PositionHistory { get { return positionHistory; } } public Buffer LocalPositionHistory { get { return localPositionHistory; } } public Buffer AngularVelocityHistory { get { return angularVelocityHistory; } } public Buffer RotationHistory { get { return rotationHistory; } } public Buffer VelocityHistory { get { return velocityHistory; } } private void Awake() { velocityHistory = new Buffer( bufferSize ); angularVelocityHistory = new Buffer( bufferSize ); localPositionHistory = new Buffer( bufferSize ); positionHistory = new Buffer( bufferSize ); rotationHistory = new Buffer(bufferSize); lastLocalPosition = transform.localPosition; } private void Update() { UpdateVelocityHistory(); UpdateAngularVelocityHistory(); UpdateLocalPositionHistory(); UpdatePositionHistory(); UpdateRotationHistory(); } private void UpdateVelocityHistory() { velocityHistory.Add( (lastLocalPosition - transform.localPosition) / Time.deltaTime ); lastLocalPosition = transform.localPosition; } private void UpdateRotationHistory() { rotationHistory.Add( transform.rotation ); } private void UpdateAngularVelocityHistory() { if (rotationHistory.Count < 2) return; float delta = Time.deltaTime; float angleDegrees = 0.0f; Vector3 unitAxis = Vector3.zero; Quaternion rotation = Quaternion.identity; rotation = ( rotationHistory[rotationHistory.Count - 1] ) * Quaternion.Inverse( rotationHistory[rotationHistory.Count - 2] ); rotation.ToAngleAxis( out angleDegrees, out unitAxis ); Vector3 angular = unitAxis * ( ( angleDegrees * Mathf.Deg2Rad ) / delta ); angularVelocityHistory.Add( angular); } private void UpdateLocalPositionHistory() { localPositionHistory.Add(transform.localPosition); } private void UpdatePositionHistory() { positionHistory.Add( transform.position ); } } }