Browse Source

Add ActionPoint support in unity part

Johannes Kreutz 2 years ago
parent
commit
2e3b89e225

+ 3 - 3
track-client/TrackClient/Assets/Scenes/SampleScene.unity

@@ -152,8 +152,8 @@ MonoBehaviour:
   m_Script: {fileID: 11500000, guid: 1bc1b324900d1ce4abf1157a1a9b937d, type: 3}
   m_Name: 
   m_EditorClassIdentifier: 
-  filePath: ..\..\testdata\glasExport2.3mf
-  rotationCorrection: 0
+  filePath: ..\..\testdata\glasExport.3mf
+  rotationCorrection: 225
 --- !u!4 &222388454
 Transform:
   m_ObjectHideFlags: 0
@@ -338,7 +338,7 @@ Transform:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 963194225}
   m_LocalRotation: {x: 0, y: 1, z: 0, w: 0}
-  m_LocalPosition: {x: 0, y: -0.5, z: 3}
+  m_LocalPosition: {x: 0, y: -0.5, z: 1}
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_Children: []
   m_Father: {fileID: 0}

+ 30 - 0
track-client/TrackClient/Assets/TrackpointApp/ActionPoint.cs

@@ -0,0 +1,30 @@
+using UnityEngine;
+
+namespace TrackpointApp
+{
+    public class ActionPoint : MonoBehaviour
+    {
+        private GameObject cylinder;
+        private const int divisor = Configuration.divisor;
+        
+        public void setup()
+        {
+            cylinder = GameObject.CreatePrimitive(PrimitiveType.Cylinder);
+            cylinder.transform.parent = this.transform;
+            size(2.5f / divisor, 2.0f / divisor);
+            cylinder.GetComponent<Renderer>().material.color = Color.blue;
+        }
+
+        private void size(float radius, float length)
+        {
+            float actualLength = cylinder.GetComponent<Renderer>().bounds.size.y;
+            float actualDiameter = cylinder.GetComponent<Renderer>().bounds.size.x;
+            Vector3 rescale = cylinder.transform.localScale;
+            rescale.y = length * rescale.y / actualLength;
+            float xzFactor = radius * 2 * rescale.x / actualDiameter;
+            rescale.x = xzFactor;
+            rescale.z = xzFactor;
+            cylinder.transform.localScale = rescale;
+        }
+    }
+}

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

@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 03c1fb70544d40f4a6cd1626fd5e99a0
+timeCreated: 1624977182

+ 1 - 1
track-client/TrackClient/Assets/TrackpointApp/Configuration.cs

@@ -2,6 +2,6 @@
 {
     public class Configuration
     {
-        public const int divisor = 100;
+        public const int divisor = 1000;
     }
 }

+ 25 - 1
track-client/TrackClient/Assets/TrackpointApp/SteamVRTrack.cs

@@ -6,7 +6,7 @@ using Valve.VR;
 using JsonConvert = Valve.Newtonsoft.Json.JsonConvert;
 using TrackpointApp;
 
-public class SteamVRTrack : TrackpointMesh
+public class SteamVRTrack : MonoBehaviour
 {
     public string filePath;
     public int rotationCorrection;
@@ -14,6 +14,7 @@ public class SteamVRTrack : TrackpointMesh
 
     private GameObject rotationObject;
     private GameObject meshObject;
+    private List<ActionPoint> actionPoints = new List<ActionPoint>();
     private TrackpointMesh trackpointMesh;
     private SteamVR_TrackedObject tracking;
     
@@ -21,12 +22,15 @@ public class SteamVRTrack : TrackpointMesh
     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;
         trackpointMesh.setup(filePath, TrackingSystem.SteamVRTrack);
         setupTrackpointTranslationAndRotation();
+        setupActionPoints();
         tracking = gameObject.AddComponent<SteamVR_TrackedObject>();
         tracking.index = (SteamVR_TrackedObject.EIndex)1;
     }
@@ -49,6 +53,26 @@ public class SteamVRTrack : TrackpointMesh
         Quaternion result = correction * rotateObjectToTrackpoint;
         rotationObject.transform.rotation = result;
     }
+
+    void setupActionPoints()
+    {
+        string metadata = trackpointMesh.getActionPointMetaData();
+        Dictionary<String, trackpoints> metaObject = JsonConvert.DeserializeObject<Dictionary<String, trackpoints>>(metadata);
+        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[2], normal[1]);
+            anchor.transform.rotation = Quaternion.FromToRotation(Vector3.up, unityNormal);
+            ActionPoint actionPointObject = anchor.AddComponent<ActionPoint>();
+            actionPointObject.setup();
+            actionPoints.Add(actionPointObject);
+        }
+    }
 }
 
 public class trackpoints

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

@@ -105,6 +105,13 @@ public class TrackpointMesh : MonoBehaviour
         CMetaData metaData = metaDataGroup.GetMetaDataByKey(META_NAMESPACE, key);
         return metaData.GetValue();
     }
+
+    public string getActionPointMetaData()
+    {
+        CMetaDataGroup metaDataGroup = model.GetMetaDataGroup();
+        CMetaData metaData = metaDataGroup.GetMetaDataByKey(META_NAMESPACE, "trackpoints-actionpoints");
+        return metaData.GetValue();
+    }
     
     CMeshObject getMesh(CMeshObjectIterator iterator, TrackingSystem trackingSystem)
     {