AR Design
UBC EML collab with UBC SALA - visualizing IoT data in AR
SolverInBetween.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
7 {
11  public class SolverInBetween : Solver
12  {
13  [SerializeField]
14  [Tooltip("Distance along the center line the object will be located. 0.5 is halfway, 1.0 is at the second transform, 0.0 is at the first transform.")]
15  [Range(0f, 1f)]
16  private float partwayOffset = 0.5f;
17 
21  public float PartwayOffset
22  {
23  get { return partwayOffset; }
24  set { partwayOffset = Mathf.Clamp(value, 0.0f, 1.0f); }
25  }
26 
27  [SerializeField]
28  [Tooltip("Tracked object to calculate position and orientation for the second object. If you want to manually override and use a scene object, use the TransformTarget field.")]
29  [HideInInspector]
30  private SolverHandler.TrackedObjectToReferenceEnum trackedObjectForSecondTransform = SolverHandler.TrackedObjectToReferenceEnum.Head;
31 
35  public SolverHandler.TrackedObjectToReferenceEnum TrackedObjectForSecondTransform
36  {
37  get { return trackedObjectForSecondTransform; }
38  set
39  {
40  trackedObjectForSecondTransform = value;
41  if (secondSolverHandler != null)
42  {
43  secondSolverHandler.TrackedObjectToReference = value;
44  }
45  }
46  }
47 
48  [SerializeField]
49  [Tooltip("This transform overrides any Tracked Object as the second point in the In Between.")]
50  [HideInInspector]
51  private Transform secondTransformOverride = null;
52 
53  private SolverHandler secondSolverHandler;
54 
55  private void OnValidate()
56  {
57  UpdateSecondSolverHandler();
58  }
59 
60  protected void Start()
61  {
62  // We need to get the secondSolverHandler ready before we tell them both to seek a tracked object.
63  secondSolverHandler = gameObject.AddComponent<SolverHandler>();
64  secondSolverHandler.UpdateSolvers = false;
65  UpdateSecondSolverHandler();
66  }
67 
68  public override void SolverUpdate()
69  {
70  if (solverHandler != null && secondSolverHandler != null)
71  {
72  if (solverHandler.TransformTarget != null && secondSolverHandler.TransformTarget != null)
73  {
74  AdjustPositionForOffset(solverHandler.TransformTarget, secondSolverHandler.TransformTarget);
75  }
76  }
77  }
78 
79  private void AdjustPositionForOffset(Transform targetTransform, Transform secondTransform)
80  {
81  if (targetTransform != null && secondTransform != null)
82  {
83  Vector3 centerline = targetTransform.position - secondTransform.position;
84  GoalPosition = secondTransform.position + (centerline * partwayOffset);
85  UpdateWorkingPosToGoal();
86  }
87  }
88 
89  private void UpdateSecondSolverHandler()
90  {
91  if (secondSolverHandler != null)
92  {
93  if (secondTransformOverride != null)
94  {
95  secondSolverHandler.TransformTarget = secondTransformOverride;
96  }
97  else
98  {
99  secondSolverHandler.TrackedObjectToReference = trackedObjectForSecondTransform;
100  }
101  }
102  }
103 
108  {
109  UpdateSecondSolverHandler();
110  }
111  }
112 }
SolverBase is the base abstract class for all Solvers to derive from. It provides state tracking...
Definition: Solver.cs:15
TrackedObjectToReferenceEnum TrackedObjectToReference
InBetween solver positions an object in-between two tracked transforms.
void AttachSecondTransformToNewTrackedObject()
This should only be called from the SolverInBetweenEditor to cause the secondary SolverHandler to rea...