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);
        }
Example #2
0
        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);
        }
Example #3
0
        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);
            }
        }