public Matrix4x4 GetLocalToWorldMatrix() { InputTracking.GetNodeStates(_nodeStates); var centerEyeNodeIndex = _nodeStates.FindIndex(x => x.nodeType == XRNode.CenterEye); var headNodeIndex = _nodeStates.FindIndex(x => x.nodeType == XRNode.Head); if (centerEyeNodeIndex < 0 || headNodeIndex < 0) { return(_lastLocalToWorldTransform); } var centerEyeNode = _nodeStates[centerEyeNodeIndex]; var headNode = _nodeStates[headNodeIndex]; Vector3 headPosition; Vector3 centerEyePosition; if (!centerEyeNode.TryGetPosition(out centerEyePosition) || !headNode.TryGetPosition(out headPosition)) { return(_lastLocalToWorldTransform); } var centerEyeToHeadTranslation = Matrix4x4.Translate(headPosition - centerEyePosition); if (_useOpenVR) { Quaternion centerEyeRotation; if (!centerEyeNode.TryGetRotation(out centerEyeRotation)) { return(_lastLocalToWorldTransform); } var cameraToHmdOffsetTransform = GetCameraLocalToWorldMatrix() * Matrix4x4.TRS(centerEyePosition, centerEyeRotation, Vector3.one).inverse; var headPose = _openVRManager.GetHeadPoseFor(secondsAgo: _estimatedEyeTrackerLatency_s); _lastLocalToWorldTransform = centerEyeToHeadTranslation * (cameraToHmdOffsetTransform * headPose); } else { var sample = _history[(_history.Length + _writeIndex - 1 - _headPoseDelayInFrames) % _history.Length]; if (sample.timestamp_us == 0) { return(GetCameraLocalToWorldMatrix()); } _lastLocalToWorldTransform = centerEyeToHeadTranslation * sample.matrix; } return(_lastLocalToWorldTransform); }
public Matrix4x4 GetLocalToWorldMatrix() { if (_useOpenVR) { var centerEyeToCameraTransform = CoordinatesHelper.GetCenterEyeToCameraTransform(); var headPose = _openVRManager.GetHeadPoseFor(secondsAgo: _estimatedEyeTrackerLatency_s); // OpenVR head pose does not include camera offset so it needs to be added _lastLocalToWorldTransform = centerEyeToCameraTransform * headPose; } else { var sample = _history[(_history.Length + _writeIndex - 1 - _headPoseDelayInFrames) % _history.Length]; if (sample.timestamp_us == 0) { return(GetCameraLocalToWorldMatrix()); } _lastLocalToWorldTransform = sample.matrix; } return(_lastLocalToWorldTransform); }
public Matrix4x4 GetLocalToWorldMatrix() { var centerEyeToHeadOffsetTransform = Matrix4x4.Translate(InputTracking.GetLocalPosition(XRNode.Head) - InputTracking.GetLocalPosition(XRNode.CenterEye)); if (_useOpenVR) { var pos = InputTracking.GetLocalPosition(XRNode.CenterEye); var rot = InputTracking.GetLocalRotation(XRNode.CenterEye); var cameraToHmdOffsetTransform = GetCameraLocalToWorldMatrix() * Matrix4x4.TRS(pos, rot, Vector3.one).inverse; var headPose = _openVRManager.GetHeadPoseFor(secondsAgo: _estimatedEyeTrackerLatency_s); return(centerEyeToHeadOffsetTransform * (cameraToHmdOffsetTransform * headPose)); } else { var sample = _history[(_history.Length + _writeIndex - 1 - _headPoseDelayInFrames) % _history.Length]; if (sample.timestamp_us == 0) { return(GetCameraLocalToWorldMatrix()); } return(centerEyeToHeadOffsetTransform * sample.matrix); } }