123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- using System.Numerics;
- namespace NRKernal
- {
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
-
-
- public class ControllerTracker : MonoBehaviour
- {
-
- public ControllerHandEnum defaultHandEnum;
-
- public NRPointerRaycaster raycaster;
-
- public Transform modelAnchor;
-
- private bool m_IsEnabled;
-
- private bool m_Is6dof;
-
- private Vector3 m_DefaultLocalOffset;
-
- private Matrix4x4 m_CachedWorldMatrix = Matrix4x4.identity;
-
-
- private Transform CameraCenter
- {
- get
- {
- return NRInput.CameraCenter;
- }
- }
-
- private void Awake()
- {
- m_DefaultLocalOffset = transform.localPosition;
- raycaster.RelatedHand = defaultHandEnum;
- }
-
- private void OnEnable()
- {
- NRInput.OnControllerRecentering += OnRecentering;
- NRInput.OnControllerStatesUpdated += OnControllerStatesUpdated;
- NRHMDPoseTracker.OnWorldPoseReset += OnWorldPoseReset;
- }
-
- private void OnDisable()
- {
- NRInput.OnControllerRecentering -= OnRecentering;
- NRInput.OnControllerStatesUpdated -= OnControllerStatesUpdated;
- NRHMDPoseTracker.OnWorldPoseReset -= OnWorldPoseReset;
- }
- private void Start()
- {
- m_Is6dof = NRInput.GetControllerAvailableFeature(ControllerAvailableFeature.CONTROLLER_AVAILABLE_FEATURE_POSITION)
- && NRInput.GetControllerAvailableFeature(ControllerAvailableFeature.CONTROLLER_AVAILABLE_FEATURE_ROTATION);
- }
-
- private void OnControllerStatesUpdated()
- {
- UpdateTracker();
- }
-
- private void UpdateTracker()
- {
- if (CameraCenter == null)
- return;
- m_IsEnabled = NRInput.CheckControllerAvailable(defaultHandEnum) && !NRInput.Hands.IsRunning;
- raycaster.gameObject.SetActive(m_IsEnabled && NRInput.RaycastersActive && NRInput.RaycastMode == RaycastModeEnum.Laser);
- modelAnchor.gameObject.SetActive(m_IsEnabled);
- if (m_IsEnabled)
- {
- TrackPose();
- }
- }
-
- private void TrackPose()
- {
- Pose poseInAPIWorld = new Pose(NRInput.GetPosition(defaultHandEnum), NRInput.GetRotation(defaultHandEnum));
- Pose pose = ApplyWorldMatrix(poseInAPIWorld);
- transform.position = m_Is6dof ? pose.position : CameraCenter.TransformPoint(m_DefaultLocalOffset);
- transform.rotation = pose.rotation;
- }
-
- private Pose ApplyWorldMatrix(Pose pose)
- {
- var objectMatrix = ConversionUtility.GetTMatrix(pose.position, pose.rotation);
- var object_in_world = m_CachedWorldMatrix * objectMatrix;
- return new Pose(ConversionUtility.GetPositionFromTMatrix(object_in_world),
- ConversionUtility.GetRotationFromTMatrix(object_in_world));
- }
-
-
-
- private void OnRecentering()
- {
- Plane horizontal_plane = new Plane(Vector3.up, Vector3.zero);
- Vector3 horizontalFoward = horizontal_plane.ClosestPointOnPlane(CameraCenter.forward).normalized;
- var horizontalRotEuler = Quaternion.LookRotation(horizontalFoward, Vector3.up).eulerAngles;
-
-
-
- var verticalDegree = NRSessionManager.Instance.NRHMDPoseTracker.GetCachedWorldPitch();
-
- Quaternion correctRot = Quaternion.Euler(verticalDegree, 0, 0) * Quaternion.Euler(0, horizontalRotEuler.y, 0);
-
- Vector3 position = m_Is6dof ? transform.position : Vector3.zero;
- m_CachedWorldMatrix = ConversionUtility.GetTMatrix(position, correctRot);
- NRDebugger.Info("[ControllerTracker] OnRecentering : forward={0}, horRot={1}, vertRot={2}, correctRot={3}",
- CameraCenter.forward.ToString("F4"), horizontalRotEuler.ToString("F4"), verticalDegree.ToString("F4"), correctRot.eulerAngles.ToString("F4"));
- }
- private void OnWorldPoseReset()
- {
- NRInput.RecenterController();
- }
- }
- }
|