6 namespace HoloToolkit.Unity.InputModule.Utilities.Interactions
19 #region private members 20 private float handRefDistance;
21 private float objRefDistance;
22 private const float DistanceScale = 2f;
23 private static readonly Vector3 initialMove =
new Vector3(0, -0.2f, 0);
29 private Quaternion m_gazeAngularOffset;
34 private Vector3 m_draggingPosition;
41 public void Setup(Vector3 startHandPositionMeters, Transform manipulationRoot)
43 var newHandPosition = startHandPositionMeters;
46 var pivotPosition = GetHandPivotPosition();
48 handRefDistance = Vector3.Distance(newHandPosition, pivotPosition);
49 objRefDistance = Vector3.Distance(manipulationRoot.position, pivotPosition);
51 var objDirectoin = Vector3.Normalize(manipulationRoot.position - pivotPosition);
52 var handDirection = Vector3.Normalize(newHandPosition - pivotPosition);
56 objDirectoin =
CameraCache.
Main.transform.InverseTransformDirection(objDirectoin);
57 handDirection =
CameraCache.
Main.transform.InverseTransformDirection(handDirection);
60 m_gazeAngularOffset = Quaternion.FromToRotation(handDirection, objDirectoin);
61 m_draggingPosition = manipulationRoot.position;
70 public Vector3
Update(Vector3 centroid, Vector3 manipulationObjectPosition)
72 var newHandPosition = centroid;
73 var pivotPosition = GetHandPivotPosition();
76 var newHandDirection = Vector3.Normalize(newHandPosition - pivotPosition);
77 newHandDirection =
CameraCache.
Main.transform.InverseTransformDirection(newHandDirection);
80 var targetDirection = Vector3.Normalize(m_gazeAngularOffset * newHandDirection);
81 targetDirection =
CameraCache.
Main.transform.TransformDirection(targetDirection);
84 var currentHandDistance = Vector3.Magnitude(newHandPosition - pivotPosition);
85 var distanceRatio = currentHandDistance / handRefDistance;
86 var distanceOffset = distanceRatio > 0 ? (distanceRatio - 1f) * DistanceScale : 0;
87 var targetDistance = objRefDistance + distanceOffset;
89 var newPosition = pivotPosition + (targetDirection * targetDistance);
91 var newDistance = Vector3.Distance(newPosition, pivotPosition);
94 newPosition = pivotPosition + Vector3.Normalize(newPosition - pivotPosition) * 4f;
97 m_draggingPosition = newPosition;
99 return m_draggingPosition;