8 using System.Collections;
10 namespace Valve.VR.InteractionSystem
13 [RequireComponent( typeof( Interactable ) )]
16 public Transform startPosition;
17 public Transform endPosition;
19 public bool repositionGameObject =
true;
20 public bool maintainMomemntum =
true;
21 public float momemtumDampenRate = 5.0f;
23 private float initialMappingOffset;
24 private int numMappingChangeSamples = 5;
25 private float[] mappingChangeSamples;
26 private float prevMapping = 0.0f;
27 private float mappingChangeRate;
28 private int sampleCount = 0;
34 mappingChangeSamples =
new float[numMappingChangeSamples];
41 if ( linearMapping == null )
43 linearMapping = GetComponent<LinearMapping>();
46 if ( linearMapping == null )
51 initialMappingOffset = linearMapping.value;
53 if ( repositionGameObject )
55 UpdateLinearMapping( transform );
61 private void HandHoverUpdate(
Hand hand )
63 if ( hand.GetStandardInteractionButtonDown() )
65 hand.HoverLock( GetComponent<Interactable>() );
67 initialMappingOffset = linearMapping.value - CalculateLinearMapping( hand.transform );
69 mappingChangeRate = 0.0f;
72 if ( hand.GetStandardInteractionButtonUp() )
74 hand.HoverUnlock( GetComponent<Interactable>() );
76 CalculateMappingChangeRate();
79 if ( hand.GetStandardInteractionButton() )
81 UpdateLinearMapping( hand.transform );
87 private void CalculateMappingChangeRate()
90 mappingChangeRate = 0.0f;
91 int mappingSamplesCount = Mathf.Min( sampleCount, mappingChangeSamples.Length );
92 if ( mappingSamplesCount != 0 )
94 for (
int i = 0; i < mappingSamplesCount; ++i )
96 mappingChangeRate += mappingChangeSamples[i];
98 mappingChangeRate /= mappingSamplesCount;
104 private void UpdateLinearMapping( Transform tr )
106 prevMapping = linearMapping.value;
107 linearMapping.value = Mathf.Clamp01( initialMappingOffset + CalculateLinearMapping( tr ) );
109 mappingChangeSamples[sampleCount % mappingChangeSamples.Length] = ( 1.0f / Time.deltaTime ) * ( linearMapping.value - prevMapping );
112 if ( repositionGameObject )
114 transform.position = Vector3.Lerp( startPosition.position, endPosition.position, linearMapping.value );
120 private float CalculateLinearMapping( Transform tr )
122 Vector3 direction = endPosition.position - startPosition.position;
123 float length = direction.magnitude;
124 direction.Normalize();
126 Vector3 displacement = tr.position - startPosition.position;
128 return Vector3.Dot( displacement, direction ) / length;
135 if ( maintainMomemntum && mappingChangeRate != 0.0f )
138 mappingChangeRate = Mathf.Lerp( mappingChangeRate, 0.0f, momemtumDampenRate * Time.deltaTime );
139 linearMapping.value = Mathf.Clamp01( linearMapping.value + ( mappingChangeRate * Time.deltaTime ) );
141 if ( repositionGameObject )
143 transform.position = Vector3.Lerp( startPosition.position, endPosition.position, linearMapping.value );