HeadTrackedPoseDriver.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. using FFalcon.XR.Runtime;
  2. using FfalconXR.Native;
  3. using RayNeo;
  4. using RayNeo.Native;
  5. using System;
  6. using System.Collections.Generic;
  7. using UnityEngine;
  8. using UnityEngine.SpatialTracking;
  9. namespace FfalconXR
  10. {
  11. public class HeadTrackedPoseDriver : TrackedPoseDriver
  12. {
  13. private static HeadTrackedPoseParams m_params = new HeadTrackedPoseParams();
  14. public static void ResetQuaternion()
  15. {
  16. m_params.ResetQuaternionAction?.Invoke();
  17. }
  18. override protected void Awake()
  19. {
  20. Api.EnableSlamHeadTracker();
  21. m_params.AwakeDriver(this, ResetTrackedPos);
  22. base.Awake();
  23. }
  24. protected override void OnDestroy()
  25. {
  26. m_params.DestroyDriver(this, ResetTrackedPos);
  27. base.OnDestroy();
  28. }
  29. protected override void SetLocalTransform(Vector3 newPosition, Quaternion newRotation, PoseDataFlags poseFlags)
  30. {
  31. base.SetLocalTransform(newPosition, m_params.GetRotation(newRotation), poseFlags);
  32. }
  33. public void ResetTrackedPos()
  34. {
  35. m_params.ResetRotation();
  36. }
  37. #if UNITY_EDITOR
  38. private Quaternion m_debugQuaternion = Quaternion.Euler(0, 0, 0);
  39. private Vector3 m_debugTrans = Vector3.zero;
  40. public static void SetQuaternion(Quaternion q)
  41. {
  42. foreach (var item in m_params.DriverInstanceSet)
  43. {
  44. item.m_debugQuaternion = q;
  45. }
  46. }
  47. public static void SetPosition(Vector3 t)
  48. {
  49. foreach (var item in m_params.DriverInstanceSet)
  50. {
  51. item.m_debugTrans = t;
  52. }
  53. }
  54. protected override void PerformUpdate()
  55. {
  56. SetLocalTransform(m_debugTrans, m_debugQuaternion, PoseDataFlags.Rotation | PoseDataFlags.Position);
  57. }
  58. #else
  59. #endif
  60. }
  61. internal class HeadTrackedPoseParams
  62. {
  63. public Quaternion CameraInverseQuaternion = Quaternion.identity;
  64. public Quaternion RotationRawData = Quaternion.identity;
  65. public Action ResetQuaternionAction;
  66. public HashSet<HeadTrackedPoseDriver> DriverInstanceSet = new HashSet<HeadTrackedPoseDriver>();
  67. public void AwakeDriver(HeadTrackedPoseDriver hdk, Action resetAction)
  68. {
  69. DriverInstanceSet.Add(hdk);
  70. ResetQuaternionAction += resetAction;
  71. }
  72. public void DestroyDriver(HeadTrackedPoseDriver hdk, Action resetAction)
  73. {
  74. DriverInstanceSet.Remove(hdk);
  75. ResetQuaternionAction -= resetAction;
  76. }
  77. public Quaternion GetRotation(Quaternion rawQuat)
  78. {
  79. #if UNITY_EDITOR
  80. #else
  81. if (!FfalconApi.CurrentIsMecury())
  82. {
  83. Vector3 euler = rawQuat.eulerAngles;
  84. euler = new Vector3(euler.x, euler.y, euler.z - 90);
  85. rawQuat = Quaternion.Euler(euler);
  86. }
  87. #endif
  88. RotationRawData = rawQuat;
  89. return CameraInverseQuaternion * RotationRawData;
  90. }
  91. public void ResetRotation()
  92. {
  93. CameraInverseQuaternion = Quaternion.Inverse(RotationRawData);
  94. }
  95. }
  96. }