OpenVR瞬移问题(正向计算)

OpenVR Teleportation Problem (Forward direction calculation)

所以我正在尝试在我的 VR 应用程序(而不是在 Unity 中)中实现传送。我能够从

获取每个控制器的姿势矩阵
if (auto error = vr::VRInput()->GetPoseActionDataForNextFrame(hand[eHand].pose_handle, vr::TrackingUniverseStanding, &poseData, sizeof(poseData), vr::k_ulInvalidInputValueHandle) != vr::VRInputError_None
        || !poseData.bActive || !poseData.pose.bPoseIsValid)
    {
        std::cerr << "pose invalid " << error << std::endl;
    }
    else
    {
        hand[eHand].pose = ConvertSteamVRMatrixToMatrix4(poseData.pose.mDeviceToAbsoluteTracking);
    }

然后我使用 glm::decompose() 来获取位置和方向(方向必须共轭)。然后我尝试通过将方向矩阵乘以 vec4(0,0,1,0) 来从中获取前向,但结果向量不正确。我的逻辑有问题吗?

原来我的方法有一些问题。首先,OpenVR 将控制器的前向定义为 vec4(0,0,-1,0),其次,它是相对于 HMD 相机定义的。为了在场景中移动,我使用第二个相机矩阵进行平移和旋转。因此必须考虑到这一点。

我的最终计算如下

auto forward = glm::normalize(glm::inverse(nonHMDViewMat) *
                              vr.GetControllerPose(Right) * glm::vec4(0,0,-1,0));

其中 vr.GetControllerPose(右)returns 手中的矩阵 [eHand].pose 为右手。