AR Design
UBC EML collab with UBC SALA - visualizing IoT data in AR
TwoHandMoveLogic.cs
Go to the documentation of this file.
1 // Copyright (c) Microsoft Corporation. All rights reserved.
2 // Licensed under the MIT License. See LICENSE in the project root for license information.
3 
4 using UnityEngine;
5 
6 namespace HoloToolkit.Unity.InputModule.Utilities.Interactions
7 {
17  public class TwoHandMoveLogic
18  {
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);
24  #endregion
25 
29  private Quaternion m_gazeAngularOffset;
30 
34  private Vector3 m_draggingPosition;
35 
41  public void Setup(Vector3 startHandPositionMeters, Transform manipulationRoot)
42  {
43  var newHandPosition = startHandPositionMeters;
44 
45  // The pivot is just below and in front of the head.
46  var pivotPosition = GetHandPivotPosition();
47 
48  handRefDistance = Vector3.Distance(newHandPosition, pivotPosition);
49  objRefDistance = Vector3.Distance(manipulationRoot.position, pivotPosition);
50 
51  var objDirectoin = Vector3.Normalize(manipulationRoot.position - pivotPosition);
52  var handDirection = Vector3.Normalize(newHandPosition - pivotPosition);
53 
54  // We transform the forward vector of the object, the direction of the object, and the direction of the hand
55  // to camera space so everything is relative to the user's perspective.
56  objDirectoin = CameraCache.Main.transform.InverseTransformDirection(objDirectoin);
57  handDirection = CameraCache.Main.transform.InverseTransformDirection(handDirection);
58 
59  // Store the original rotation between the hand an object
60  m_gazeAngularOffset = Quaternion.FromToRotation(handDirection, objDirectoin);
61  m_draggingPosition = manipulationRoot.position;
62  }
63 
70  public Vector3 Update(Vector3 centroid, Vector3 manipulationObjectPosition)
71  {
72  var newHandPosition = centroid;
73  var pivotPosition = GetHandPivotPosition();
74 
75  // Compute the pivot -> hand vector in camera space
76  var newHandDirection = Vector3.Normalize(newHandPosition - pivotPosition);
77  newHandDirection = CameraCache.Main.transform.InverseTransformDirection(newHandDirection);
78 
79  // The direction the object should face is the current hand direction rotated by the original hand -> object rotation.
80  var targetDirection = Vector3.Normalize(m_gazeAngularOffset * newHandDirection);
81  targetDirection = CameraCache.Main.transform.TransformDirection(targetDirection);
82 
83  // Compute how far away the object should be based on the ratio of the current to original hand distance
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;
88 
89  var newPosition = pivotPosition + (targetDirection * targetDistance);
90 
91  var newDistance = Vector3.Distance(newPosition, pivotPosition);
92  if (newDistance > 4f)
93  {
94  newPosition = pivotPosition + Vector3.Normalize(newPosition - pivotPosition) * 4f;
95  }
96 
97  m_draggingPosition = newPosition;
98 
99  return m_draggingPosition;
100  }
101 
106  public static Vector3 GetHandPivotPosition()
107  {
108  Vector3 pivot = CameraCache.Main.transform.position + initialMove - CameraCache.Main.transform.forward * 0.2f; // a bit lower and behind
109  return pivot;
110  }
111  }
112 }
void Setup(Vector3 startHandPositionMeters, Transform manipulationRoot)
Initialize system with controller/hand states- starting position and current Transform.
Implements a movement logic that uses the model of angular rotations along a sphere whose radius vari...
The purpose of this class is to provide a cached reference to the main camera. Calling Camera...
Definition: CameraCache.cs:12
static Camera Main
Returns a cached reference to the main camera and uses Camera.main if it hasn't been cached yet...
Definition: CameraCache.cs:20
Vector3 Update(Vector3 centroid, Vector3 manipulationObjectPosition)
Updates gameobject with new position information of controller/hand