SteamVRTrack.cs 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. using Valve.VR;
  6. using JsonConvert = Valve.Newtonsoft.Json.JsonConvert;
  7. using TrackpointApp;
  8. public class SteamVRTrack : TrackpointMesh
  9. {
  10. public string filePath;
  11. public int rotationCorrection;
  12. private const int divisor = Configuration.divisor;
  13. private GameObject rotationObject;
  14. private GameObject meshObject;
  15. private TrackpointMesh trackpointMesh;
  16. private SteamVR_TrackedObject tracking;
  17. // Start is called before the first frame update
  18. void Start()
  19. {
  20. rotationObject = new GameObject();
  21. meshObject = new GameObject();
  22. rotationObject.transform.parent = this.transform;
  23. trackpointMesh = meshObject.AddComponent<TrackpointMesh>();
  24. trackpointMesh.transform.parent = rotationObject.transform;
  25. trackpointMesh.setup(filePath, TrackingSystem.SteamVRTrack);
  26. setupTrackpointTranslationAndRotation();
  27. tracking = gameObject.AddComponent<SteamVR_TrackedObject>();
  28. tracking.index = (SteamVR_TrackedObject.EIndex)1;
  29. }
  30. void setupTrackpointTranslationAndRotation()
  31. {
  32. string metadata = trackpointMesh.getMetaData(TrackingSystem.SteamVRTrack);
  33. List<trackpoints> metaObject = JsonConvert.DeserializeObject<List<trackpoints>>(metadata);
  34. if (metaObject.Count != 1)
  35. {
  36. Debug.Log("TrackpointApp Error: Only one tracker per element supported for SteamVR.");
  37. return;
  38. }
  39. float[] point = metaObject[0].point;
  40. float[] normal = metaObject[0].normal;
  41. trackpointMesh.transform.localPosition = new Vector3(-(point[0] / divisor), -(point[1] / divisor), -(point[2] / divisor));
  42. Vector3 unityNormal = new Vector3(normal[0], normal[2], normal[1]);
  43. Quaternion rotateObjectToTrackpoint = Quaternion.FromToRotation(Vector3.up, unityNormal);
  44. Quaternion correction = Quaternion.AngleAxis(rotationCorrection, Vector3.back);
  45. Quaternion result = correction * rotateObjectToTrackpoint;
  46. rotationObject.transform.rotation = result;
  47. }
  48. }
  49. public class trackpoints
  50. {
  51. public float[] point
  52. {
  53. get;
  54. set;
  55. }
  56. public float[] normal
  57. {
  58. get;
  59. set;
  60. }
  61. }