我正在用openvr和opengl编写一个应用程序,我想让相机朝它看的方向移动。因此,当你戴上hmd并朝某个方向看时,虚拟相机应该朝那个方向飞行,这样你就可以四处移动了。
所以hmd的位置是由openvr通过调用VRCompositor()->WaitGetPoses
提供的,这应该类似于视图矩阵的逆,所以如果我提取矩阵的第三个coulmn,我应该得到视图方向,然后我可以沿着该方向平移我的模型矩阵来移动场景。
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时,平移会发生变化。
我也尝试了unity的https://www.youtube.com/watch?v=QREKO1sf8b8教程,我让unity移动起来,但是我不能将代码转换回我的opengl应用程序中运行。我尝试实现euler和四元数转换,但没有成功。
我觉得我需要用一个额外的矩阵来转换我的方向向量,这样它就会一直指向正确的方向,但是我不知道如何o_o
有没有人知道错误是什么,或者知道如何实现这个运动?
发布于 2020-02-14 13:10:30
好的,我发现了一个错误,我需要将方向与hmd姿势的倒数相乘,所以vec4 direction = inverse(m_mat4HMDPose) * vec4(0.0, 0.0, 1.0, 0.0);
https://stackoverflow.com/questions/60210716
复制相似问题