Browse Source

Translation working, rotation work in progress

Johannes Kreutz 2 years ago
parent
commit
84d3ce15a9

+ 7 - 0
track-client/TrackClient/Assets/TrackpointApp/Configuration.cs

@@ -0,0 +1,7 @@
+namespace TrackpointApp
+{
+    public class Configuration
+    {
+        public const int divisor = 100;
+    }
+}

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

@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: ceb1ebfaeb8e44b69599b0524807965d
+timeCreated: 1624393561

+ 37 - 3
track-client/TrackClient/Assets/TrackpointApp/SteamVRTrack.cs

@@ -1,14 +1,18 @@
 using System;
 using System.Collections;
 using System.Collections.Generic;
-using Newtonsoft.Json;
 using UnityEngine;
 using Valve.VR;
+using JsonConvert = Valve.Newtonsoft.Json.JsonConvert;
+using TrackpointApp;
 
 public class SteamVRTrack : TrackpointMesh
 {
     public string filePath;
+    public int rotationCorrection;
+    private const int divisor = Configuration.divisor;
 
+    private GameObject rotationObject;
     private GameObject meshObject;
     private TrackpointMesh trackpointMesh;
     private SteamVR_TrackedObject tracking;
@@ -16,9 +20,11 @@ public class SteamVRTrack : TrackpointMesh
     // Start is called before the first frame update
     void Start()
     {
+        rotationObject = new GameObject();
         meshObject = new GameObject();
+        rotationObject.transform.parent = this.transform;
         trackpointMesh = meshObject.AddComponent<TrackpointMesh>();
-        trackpointMesh.transform.parent = this.transform;
+        trackpointMesh.transform.parent = rotationObject.transform;
         trackpointMesh.setup(filePath, TrackingSystem.SteamVRTrack);
         setupTrackpointTranslationAndRotation();
         tracking = gameObject.AddComponent<SteamVR_TrackedObject>();
@@ -28,6 +34,34 @@ public class SteamVRTrack : TrackpointMesh
     void setupTrackpointTranslationAndRotation()
     {
         string metadata = trackpointMesh.getMetaData(TrackingSystem.SteamVRTrack);
-        trackpointMesh.transform.localPosition = new Vector3(0.0f, 0.0f, 3.0f);
+        List<trackpoints> metaObject = JsonConvert.DeserializeObject<List<trackpoints>>(metadata);
+        if (metaObject.Count != 1)
+        {
+            Debug.Log("TrackpointApp Error: Only one tracker per element supported for SteamVR.");
+            return;
+        }
+        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.up);
+        Quaternion result = rotateObjectToTrackpoint * correction;
+        rotationObject.transform.rotation = result;
     }
 }
+
+public class trackpoints
+{
+    public float[] point
+    {
+        get;
+        set;
+    }
+
+    public float[] normal
+    {
+        get;
+        set;
+    }
+}

+ 2 - 1
track-client/TrackClient/Assets/TrackpointApp/TrackpointMesh.cs

@@ -2,6 +2,7 @@ using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 using Lib3MF;
+using TrackpointApp;
 
 public enum TrackingSystem {
     OptiTrack = 0,
@@ -12,7 +13,7 @@ public enum TrackingSystem {
 public class TrackpointMesh : MonoBehaviour
 {
     private const string META_NAMESPACE = "tk-ar-tracking";
-    private const int divisor = 100;
+    private const int divisor = Configuration.divisor;
     
     private CModel model;
     private CMeshObject fileMesh;