1

我正在用 openvr 和 opengl 编写一个应用程序,我希望相机朝着它所看的方向移动。因此,当您戴上头显并朝某个方向看时,虚拟相机应该朝那个方向飞行,这样您就可以四处移动。

因此,hmd 的位置由 openvr 提供并调用VRCompositor()->WaitGetPoses,这应该类似于视图矩阵的逆矩阵,所以如果我提取矩阵的第三列,我应该得到视图方向,然后我可以翻译我的模型矩阵沿该方向移动场景。

m_mat4HMDPose = VRCompositor()->WaitGetPoses;
m_mat4HMDPose = inverse(m_mat4HMDPose);
vec4 direction = m_mat4HMDPose * vec4(0.0, 0.0, -1.0, 0.0);
model = translate(model, vec3(direction.x, direction.y, direction.z));

这似乎不是完全错误的,但这并不适用于所有方向。有时我向左看,但我被翻译到右边,反之亦然。这也发生在上/下,当我绕 z 轴旋转 hmd 时,平移会发生变化。

我还尝试按照本教程https://www.youtube.com/watch?v=QREKO1sf8b8进行统一,并且我使运动与统一一起工作,但我无法将代码转换回与我的 opengl 应用程序一起运行。我试图实现欧拉和四元数转换,但没有成功。

我觉得我需要用一个额外的矩阵来转换我的方向向量,所以它会一直指向正确的方向,但我无法弄清楚 o_o

有谁知道错误是什么,或者知道如何实施这项运动?

4

1 回答 1

1

好的,我发现了错误,我需要将方向与 hmd 姿势的倒数相乘,所以vec4 direction = inverse(m_mat4HMDPose) * vec4(0.0, 0.0, 1.0, 0.0);

于 2020-02-14T13:10:29.803 回答