Browse Source

Generalize class model, implement basic OptiTrack support

Johannes Kreutz 2 years ago
parent
commit
d2893f2978

+ 72 - 0
track-client/TrackClient/Assets/TrackpointApp/AbstractTrackingSystem.cs

@@ -0,0 +1,72 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using Newtonsoft.Json;
+using UnityEngine;
+
+namespace TrackpointApp
+{
+    public class AbstractTrackingSystem : MonoBehaviour
+    {
+        public string filePath;
+        private const int divisor = Configuration.divisor;
+        
+        private GameObject rotationObject;
+        private GameObject meshObject;
+        private List<ActionPoint> actionPoints = new List<ActionPoint>();
+        protected TrackpointMesh trackpointMesh;
+
+        protected void generalSetup()
+        {
+            rotationObject = new GameObject();
+            rotationObject.name = "TrackingRotation";
+            meshObject = new GameObject();
+            meshObject.name = "TrackingMesh";
+            rotationObject.transform.parent = this.transform;
+            trackpointMesh = meshObject.AddComponent<TrackpointMesh>();
+            trackpointMesh.transform.parent = rotationObject.transform;
+        }
+
+        protected void setupTrackpointTranslation(TrackpointData trackpoint)
+        {
+            float[] point = trackpoint.point;
+            trackpointMesh.transform.localPosition = new Vector3(-(point[0] / divisor), -(point[1] / divisor), -(point[2] / divisor));
+        }
+
+        protected void setupTrackpointRotation(TrackpointData trackpoint, int rotationCorrection)
+        {
+            float[] normal = trackpoint.normal;
+            Vector3 unityNormal = new Vector3(normal[0], normal[2], normal[1]);
+            Quaternion rotateObjectToTrackpoint = Quaternion.FromToRotation(Vector3.up, unityNormal);
+            Quaternion correction = Quaternion.AngleAxis(rotationCorrection, Vector3.back);
+            Quaternion result = correction * rotateObjectToTrackpoint;
+            rotationObject.transform.rotation = result;
+        }
+        
+        protected void setupActionPoints()
+        {
+            string metadata = trackpointMesh.getActionPointMetaData();
+            if (metadata != "")
+            {
+                Dictionary<String, TrackpointData> metaObject =
+                    JsonConvert.DeserializeObject<Dictionary<String, TrackpointData>>(metadata);
+                if (metaObject.Count() <= 0) return;
+                foreach (KeyValuePair<String, TrackpointData> actionPoint in metaObject)
+                {
+                    GameObject anchor = new GameObject();
+                    anchor.name = "ActionPoint " + actionPoint.Key;
+                    anchor.transform.parent = trackpointMesh.transform;
+                    float[] point = actionPoint.Value.point;
+                    float[] normal = actionPoint.Value.normal;
+                    anchor.transform.localPosition =
+                        new Vector3(point[0] / divisor, point[1] / divisor, point[2] / divisor);
+                    Vector3 unityNormal = new Vector3(normal[0], normal[1], normal[2]);
+                    anchor.transform.localRotation = Quaternion.FromToRotation(Vector3.up, unityNormal);
+                    ActionPoint actionPointObject = anchor.AddComponent<ActionPoint>();
+                    actionPointObject.setup();
+                    actionPoints.Add(actionPointObject);
+                }
+            }
+        }
+    }
+}

+ 3 - 0
track-client/TrackClient/Assets/TrackpointApp/AbstractTrackingSystem.cs.meta

@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 1b5400c57d5d4d87bf4ca917f79076ee
+timeCreated: 1625596850

+ 45 - 0
track-client/TrackClient/Assets/TrackpointApp/OptiTrack.cs

@@ -0,0 +1,45 @@
+using System;
+using System.Collections.Generic;
+using Newtonsoft.Json;
+
+namespace TrackpointApp
+{
+    public class OptiTrack : AbstractTrackingSystem
+    {
+        private void Start()
+        {
+            generalSetup();
+            trackpointMesh.setup(filePath, TrackingSystem.OptiTrack);
+            TrackpointData data = loadMetaData();
+            setupTrackpointTranslation(data);
+            setupTrackpointRotation(data, 0);
+            setupActionPoints();
+        }
+
+        TrackpointData loadMetaData()
+        {
+            string metadata = trackpointMesh.getMetaData(TrackingSystem.SteamVRTrack);
+            List<TrackpointData> metaObject = JsonConvert.DeserializeObject<List<TrackpointData>>(metadata);
+            TrackpointData result = new TrackpointData();
+
+            float x = 0.0f;
+            float y = 0.0f;
+            float z = 0.0f;
+            int c = 0;
+            
+            foreach (TrackpointData data in metaObject)
+            {
+                x += data.point[0];
+                y += data.point[1];
+                z += data.point[2];
+                c++;
+            }
+            
+            result.point[0] = x / c;
+            result.point[1] = y / c;
+            result.point[2] = z / c;
+
+            return result;
+        }
+    }
+}

+ 3 - 0
track-client/TrackClient/Assets/TrackpointApp/OptiTrack.cs.meta

@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 0a8ef8c5e1ae4248add836a975743114
+timeCreated: 1625596832

+ 15 - 71
track-client/TrackClient/Assets/TrackpointApp/SteamVRTrack.cs

@@ -1,98 +1,42 @@
-using System;
-using System.Collections;
 using System.Collections.Generic;
-using System.Linq;
+using Newtonsoft.Json;
 using UnityEngine;
 using Valve.VR;
-using JsonConvert = Valve.Newtonsoft.Json.JsonConvert;
 using TrackpointApp;
 
-public class SteamVRTrack : MonoBehaviour
+public class SteamVRTrack : AbstractTrackingSystem
 {
-    public string filePath;
     public int rotationCorrection;
-    private const int divisor = Configuration.divisor;
-
-    private GameObject rotationObject;
-    private GameObject meshObject;
-    private List<ActionPoint> actionPoints = new List<ActionPoint>();
-    private TrackpointMesh trackpointMesh;
+    
     private SteamVR_TrackedObject tracking;
 
     // Start is called before the first frame update
     void Start()
     {
-        rotationObject = new GameObject();
-        rotationObject.name = "TrackingRotation";
-        meshObject = new GameObject();
-        meshObject.name = "TrackingMesh";
-        rotationObject.transform.parent = this.transform;
-        trackpointMesh = meshObject.AddComponent<TrackpointMesh>();
-        trackpointMesh.transform.parent = rotationObject.transform;
+        generalSetup();
         trackpointMesh.setup(filePath, TrackingSystem.SteamVRTrack);
-        setupTrackpointTranslationAndRotation();
+        TrackpointData data = loadMetaData();
+        if (data == null)
+        {
+            return;
+        }
+        setupTrackpointTranslation(data);
+        setupTrackpointRotation(data, rotationCorrection);
         setupActionPoints();
         tracking = gameObject.AddComponent<SteamVR_TrackedObject>();
         tracking.index = (SteamVR_TrackedObject.EIndex)1;
     }
 
-    void setupTrackpointTranslationAndRotation()
+    TrackpointData loadMetaData()
     {
         string metadata = trackpointMesh.getMetaData(TrackingSystem.SteamVRTrack);
-        List<trackpoints> metaObject = JsonConvert.DeserializeObject<List<trackpoints>>(metadata);
+        List<TrackpointData> metaObject = JsonConvert.DeserializeObject<List<TrackpointData>>(metadata);
         if (metaObject.Count != 1)
         {
             Debug.Log("TrackpointApp Error: Only one tracker per element supported for SteamVR.");
-            return;
+            return null;
         }
-        float[] point = metaObject[0].point;
-        float[] normal = metaObject[0].normal;
-        trackpointMesh.transform.localPosition = new Vector3(-(point[0] / divisor), -(point[1] / divisor), -(point[2] / divisor));
-        Vector3 unityNormal = new Vector3(normal[0], normal[2], normal[1]);
-        Quaternion rotateObjectToTrackpoint = Quaternion.FromToRotation(Vector3.up, unityNormal);
-        Quaternion correction = Quaternion.AngleAxis(rotationCorrection, Vector3.back);
-        Quaternion result = correction * rotateObjectToTrackpoint;
-        rotationObject.transform.rotation = result;
-    }
 
-    void setupActionPoints()
-    {
-        string metadata = trackpointMesh.getActionPointMetaData();
-        if (metadata != "")
-        {
-            Dictionary<String, trackpoints> metaObject =
-                JsonConvert.DeserializeObject<Dictionary<String, trackpoints>>(metadata);
-            if (metaObject.Count() <= 0) return;
-            foreach (KeyValuePair<String, trackpoints> actionPoint in metaObject)
-            {
-                GameObject anchor = new GameObject();
-                anchor.name = "ActionPoint " + actionPoint.Key;
-                anchor.transform.parent = trackpointMesh.transform;
-                float[] point = actionPoint.Value.point;
-                float[] normal = actionPoint.Value.normal;
-                anchor.transform.localPosition =
-                    new Vector3(point[0] / divisor, point[1] / divisor, point[2] / divisor);
-                Vector3 unityNormal = new Vector3(normal[0], normal[1], normal[2]);
-                anchor.transform.localRotation = Quaternion.FromToRotation(Vector3.up, unityNormal);
-                ActionPoint actionPointObject = anchor.AddComponent<ActionPoint>();
-                actionPointObject.setup();
-                actionPoints.Add(actionPointObject);
-            }
-        }
-    }
-}
-
-public class trackpoints
-{
-    public float[] point
-    {
-        get;
-        set;
-    }
-
-    public float[] normal
-    {
-        get;
-        set;
+        return metaObject[0];
     }
 }

+ 14 - 0
track-client/TrackClient/Assets/TrackpointApp/TrackpointData.cs

@@ -0,0 +1,14 @@
+public class TrackpointData
+{
+    public float[] point
+    {
+        get;
+        set;
+    }
+
+    public float[] normal
+    {
+        get;
+        set;
+    }
+}

+ 3 - 0
track-client/TrackClient/Assets/TrackpointApp/TrackpointData.cs.meta

@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 55988530521c446a85c1b4d2ce997cec
+timeCreated: 1625596594