6 using System.Collections.Generic;
10 #if UNITY_2017_2_OR_NEWER 38 [Tooltip(
"Tracked object to calculate position and orientation from. If you want to manually override and use a scene object, use the TransformTarget field")]
43 get {
return trackedObjectToReference; }
46 if (trackedObjectToReference != value)
48 trackedObjectToReference = value;
50 AttachToNewTrackedObject();
56 [Tooltip(
"Add an additional offset of the tracked object to base the solver on. Useful for tracking something like a halo position above your head or off the side of a controller. Cannot be updated once Play begins.")]
57 private Vector3 additionalOffset;
60 [Tooltip(
"Add an additional rotation on top of the tracked object. Useful for tracking what is essentially the up or right/left vectors. Cannot be updated once Play begins.")]
61 private Vector3 additionalRotation;
63 public Vector3 AdditionalOffset
65 get {
return additionalOffset; }
68 additionalOffset = value;
69 TrackTransform(TransformTarget);
73 public Vector3 AdditionalRotation
75 get {
return additionalRotation; }
78 additionalRotation = value;
79 TrackTransform(TransformTarget);
84 [Tooltip(
"Manual override for TrackedObjectToReference if you want to use a scene object. Leave empty if you want to use Head or Motion controllers")]
85 private Transform transformTarget;
87 public Transform TransformTarget
89 get {
return transformTarget; }
90 set { transformTarget = value; }
93 public Vector3 GoalPosition {
get;
set; }
95 public Quaternion GoalRotation {
get;
set; }
97 public Vector3 GoalScale {
get;
set; }
101 public float DeltaTime {
get;
set; }
103 private float LastUpdateTime {
get;
set; }
105 protected List<Solver> m_Solvers =
new List<Solver>();
108 private bool updateSolvers =
true;
109 public bool UpdateSolvers {
get {
return updateSolvers; }
set { updateSolvers = value; } }
111 private GameObject transformWithOffset;
115 m_Solvers.AddRange(GetComponents<Solver>());
117 GoalScale = Vector3.one;
122 if (!TransformTarget)
124 AttachToNewTrackedObject();
128 private void Update()
130 DeltaTime = Time.realtimeSinceStartup - LastUpdateTime;
131 LastUpdateTime = Time.realtimeSinceStartup;
134 private void LateUpdate()
138 for (
int i = 0; i < m_Solvers.Count; ++i)
140 Solver solver = m_Solvers[i];
154 if (transformWithOffset != null)
156 Destroy(transformWithOffset);
162 if (!TransformTarget)
164 TrackTransform(ElementTransform);
170 TransformTarget = null;
172 if (transformWithOffset != null)
174 Destroy(transformWithOffset);
175 transformWithOffset = null;
181 switch (TrackedObjectToReference)
184 #if UNITY_WSA && UNITY_2017_2_OR_NEWER 186 Handedness = InteractionSourceHandedness.Unknown;
191 #if UNITY_WSA && UNITY_2017_2_OR_NEWER 192 Handedness = InteractionSourceHandedness.Left;
196 #if UNITY_WSA && UNITY_2017_2_OR_NEWER 197 Handedness = InteractionSourceHandedness.Right;
203 private void TrackTransform(Transform newTrackedTransform)
205 TransformTarget = MakeOffsetTransform(newTrackedTransform);
208 private Transform MakeOffsetTransform(Transform parentTransform)
210 if (transformWithOffset == null)
212 transformWithOffset =
new GameObject();
213 transformWithOffset.transform.parent = parentTransform;
216 transformWithOffset.transform.localPosition = AdditionalOffset;
217 transformWithOffset.transform.localRotation = Quaternion.Euler(AdditionalRotation);
218 transformWithOffset.name =
string.Format(
"{0} on {1} with offset {2}, {3}", gameObject.name, TrackedObjectToReference.ToString(), AdditionalOffset, AdditionalRotation);
220 transformWithOffset.transform.Rotate(0, 180, 0);
222 return transformWithOffset.transform;
228 public Vector3 Current {
get;
set; }
229 public Vector3 Goal {
get;
set; }
230 public float SmoothTime {
get;
set; }
236 SmoothTime = smoothingTime;
241 Current = Vector3.Lerp(Current, Goal, (Math.Abs(SmoothTime) < Mathf.Epsilon) ? 1.0f : deltaTime / SmoothTime);
253 public Quaternion Current {
get;
set; }
254 public Quaternion Goal {
get;
set; }
255 public float SmoothTime {
get;
set; }
261 SmoothTime = smoothingTime;
266 Current = Quaternion.Slerp(Current, Goal, (Math.Abs(SmoothTime) < Mathf.Epsilon) ? 1.0f : deltaTime / SmoothTime);