Tanoda
ControllerToIris.cs
Go to the documentation of this file.
1using System;
2using System.Collections;
3using System.Collections.Generic;
4using System.Text;
5using GILES;
6using UnityEngine;
8#if !UNITY_WEBGL
9using Valve.VR;
10#endif
11
12public class ControllerToIris : MonoBehaviour
13{
14 public List<GameObject> controllersTrackers;
15 public GameObject iris;
16 public Vector3 offsetPos = Vector3.zero;
17 public Vector3 offsetRotation = Vector3.zero;
18 public int lerpCount = 32;
19 public GameObject cosmosController;
20 public bool forceCosmos = false;
21 public bool staticPosition = false;
22 public bool forceTrackerPositionOnFound = false;
23 //#if UNITY_EDITOR
24 public bool developerLateReposition = true;
25 //#endif
26 public UnityEvent IsViveCosmos, IsNotCosmos;
27 [HideInInspector]
28 public Vector3 lateRepositionOffset = Vector3.zero;
29
30 private readonly Queue<Quaternion> rotList = new Queue<Quaternion>();
31 private readonly Queue<Vector3> posList = new Queue<Vector3>();
32 private bool setupOk = false;
33 private bool isCosmos = false;
34
35
36
37 public static string GetHmdTypeSteamVRToString()
38 {
39#if !UNITY_WEBGL
40 if (SteamVR.initializedState == SteamVR.InitializedStates.InitializeSuccess)
41 return Valve.VR.SteamVR.instance.hmd_ModelNumber;
42#endif
43 return "";
44 }
45
46 IEnumerator Start()
47 {
48 if (!iris)
49 iris = gameObject;
50 offsetPos = iris.transform.position - controllersTrackers[0].transform.position;
51 isCosmos = forceCosmos;
52 //offsetRotation = iris.transform.eulerAngles - controllersTrackers[0].transform.eulerAngles;
53 //offsetRotation = new Vector3(ClampAngle(offsetRotation.x),ClampAngle(offsetRotation.y),ClampAngle(offsetRotation.z));
55 {
57 {
58 yield return new WaitForSeconds(0.1f);
59 while (LoadingManager.instance.isLoading)
60 {
61 yield return new WaitForSeconds(0.1f);
62 }
63 }
64
65 lateRepositionOffset = iris.transform.localPosition - new Vector3(-1.715f, 1.557f, -0.611f);
66 iris.transform.localPosition = new Vector3(-1.715f, 1.557f, -0.611f);
67 iris.transform.localEulerAngles = new Vector3(-0.241f, 89.41f, 180f);
68 }
69
70 if (GetHmdTypeSteamVRToString().Contains("cosmos"))
71 {
72 isCosmos = true;
73 offsetPos = iris.transform.position - cosmosController.transform.position;
74 controllersTrackers[0].SetActive(false);
75 if (!staticPosition)
76 {
77 cosmosController.SetActive(true);
78 iris.transform.SetParent(controllersTrackers[1].transform);
79 iris.transform.localPosition = new Vector3(-0.1248557f, -0.182729f, -0.6226097f);
80 iris.transform.localEulerAngles = new Vector3(-77.204f, -11.844f, 210.55f);
81 }
82 else
83 {
84
85//#if UNITY_EDITOR
87 {
88 yield return new WaitForSeconds(0.1f);
89 while (LoadingManager.instance.isLoading)
90 {
91 yield return new WaitForSeconds(0.1f);
92 }
93 }
94//#endif
95 iris.transform.localPosition = new Vector3(-1.720f, 1.557f, -0.615f);
96 iris.transform.localEulerAngles = new Vector3(-0.241f, 89.41f, 180f);
97 }
98//#if !UNITY_EDITOR
99// Destroy(this);
100//#endif
101 IsViveCosmos.Invoke();
102 yield break;
103 }
104
105#if !UNITY_WEBGL
106 var sb = new StringBuilder(128);
107 ETrackedPropertyError error = ETrackedPropertyError.TrackedProp_Success;
108 for (uint i = 0; i < 12; i++)
109 {
110 sb.Clear();
111 OpenVR.System.GetStringTrackedDeviceProperty(i, ETrackedDeviceProperty.Prop_RenderModelName_String, sb,
112 128, ref error);
113
114 var deviceclass = OpenVR.System.GetTrackedDeviceClass(i);
115 if (error == ETrackedPropertyError.TrackedProp_Success)
116 {
117 if (sb.ToString().Contains("cosmos"))
118 {
119 isCosmos = true;
120 offsetPos = iris.transform.position - cosmosController.transform.position;
121 controllersTrackers[0].SetActive(false);
122 if (!staticPosition)
123 {
124 cosmosController.SetActive(true);
125 iris.transform.SetParent(controllersTrackers[1].transform);
126 iris.transform.localPosition = new Vector3(-0.1248557f, -0.182729f, -0.6226097f);
127 iris.transform.localEulerAngles = new Vector3(-77.204f, -11.844f, 210.55f);
128 }
129 else
130 {
131 iris.transform.localPosition = new Vector3(-1.715f, 1.557f, -0.611f);
132 iris.transform.localEulerAngles = new Vector3(-0.241f, 89.41f, 180f);
133 }
134//#if !UNITY_EDITOR
135// Destroy(this);
136//#endif
137 IsViveCosmos.Invoke();
138 yield break;
139 }
140 }
141
142 //if ("LHR-AB7E910A" == sb.ToString())
143 if (deviceclass == ETrackedDeviceClass.GenericTracker)
144 {
145 Debug.Log(sb.ToString());
146 GameObject.Find("SteamVR_Tracker").GetComponent<SteamVR_TrackedObject>().index =
147 (SteamVR_TrackedObject.EIndex) i;
148 setupOk = true;
149 break;
150 }
151 }
152
153 if (forceTrackerPositionOnFound && setupOk)
154 {
155 yield return new WaitForEndOfFrame();
156 iris.transform.position = controllersTrackers[0].transform.position;
157 }
158
159#endif
160 IsNotCosmos.Invoke();
161 }
162
163 void Update()
164 {
165 if (staticPosition)
166 return;
167
168#if !UNITY_WEBGL
169 if (!isCosmos && !setupOk)
170 {
171 var sb = new StringBuilder();
172 ETrackedPropertyError error = ETrackedPropertyError.TrackedProp_Success;
173 for (uint i = 0; i < 12; i++)
174 {
175 sb.Clear();
176
177 var deviceclass = OpenVR.System.GetTrackedDeviceClass(i);
178 if (error == ETrackedPropertyError.TrackedProp_Success)
179 {
180 if (sb.ToString().Contains("cosmos"))
181 {
182 isCosmos = true;
183 IsViveCosmos.Invoke();
184 break;
185 }
186 if (deviceclass == ETrackedDeviceClass.GenericTracker)
187 {
188 Debug.Log(sb.ToString());
189 GameObject.Find("SteamVR_Tracker").GetComponent<SteamVR_TrackedObject>().index =
190 (SteamVR_TrackedObject.EIndex) i;
191 setupOk = true;
192 break;
193 }
194 }
195 }
196 }
197
198 foreach (var tracker in controllersTrackers)
199 {
200 if (!IsZero(tracker.transform.localPosition))
201 {
202 var transformRotation = tracker.transform.rotation;
203 transformRotation.eulerAngles = new Vector3(tracker.transform.rotation.eulerAngles.x, tracker.transform.rotation.eulerAngles.y, 180);
204 rotList.Enqueue(transformRotation);
205 while (rotList.Count > lerpCount)
206 {
207 rotList.Dequeue();
208 }
209 posList.Enqueue(tracker.transform.position);
210 while (posList.Count > lerpCount)
211 {
212 posList.Dequeue();
213 }
214 iris.transform.position = Average(posList.ToArray()) /*+ offsetPos*/;
215 //var rot = iris.transform.eulerAngles.x * Vector3.right + iris.transform.eulerAngles.z * Vector3.forward +
216 // tracker.transform.eulerAngles.x * Vector3.up + offsetRotation;
217 //rot.x = ClampAngle(rot.x);
218 //rot.y = ClampAngle(rot.y);
219 //rot.z = ClampAngle(rot.z);
220 iris.transform.rotation = Average(rotList.ToArray());
221 //iris.transform.eulerAngles -= offsetRotation;
222 break;
223 }
224 }
225#endif
226 }
227
228 Quaternion Average(Quaternion[] quats)
229 {
230
231 Quaternion avg = new Quaternion(0,0,0,0);
232 foreach (var q in quats)
233 {
234 if (Quaternion.Dot (q, avg) > 0)
235 {
236 avg.x += q.x;
237 avg.y += q.y;
238 avg.z += q.z;
239 avg.w += q.w;
240 }
241 else
242 {
243 avg.x += -q.x;
244 avg.y += -q.y;
245 avg.z += -q.z;
246 avg.w += -q.w;
247 }
248 }
249
250 var mag = Mathf.Sqrt(avg.x* avg.x + avg.y* avg.y + avg.z * avg.z + avg.w * avg.w);
251
252 if (mag > 0.0001)
253 {
254 avg.x /= mag;
255 avg.y /= mag;
256 avg.z /= mag;
257 avg.w /= mag;
258 }
259 else
260 avg = quats[0];
261
262 return avg;
263 }
264
265 private Vector3 Average(Vector3[] positions)
266 {
267 if (positions.Length == 0)
268 return Vector3.zero;
269 float x = 0f;
270 float y = 0f;
271 float z = 0f;
272 foreach (Vector3 pos in positions)
273 {
274 x += pos.x;
275 y += pos.y;
276 z += pos.z;
277 }
278 return new Vector3(x / positions.Length, y / positions.Length, z / positions.Length);
279 }
280
281 float ClampAngle(float angle)
282 {
283 while (angle > 180.0f)
284 angle -= 360.0f;
285 while (angle < -180.0f)
286 angle += 360.0f;
287
288 return angle;
289 }
290
291 bool IsZero(Vector3 value)
292 {
293 if (value.z == 0.0f)
294 if (value.y == 0.0f || value.y == 1.0f)
295 if (value.x == 0.0f || value.x == 0.25f || value.x == -0.25f)
296 return true;
297 return false;
298 }
299}
UnityEngine.Debug Debug
Definition: TanodaServer.cs:19
GameObject cosmosController
static string GetHmdTypeSteamVRToString()
bool forceTrackerPositionOnFound
Vector3 lateRepositionOffset
UnityEvent IsNotCosmos
List< GameObject > controllersTrackers
UnityEvent IsViveCosmos