Opengl 自由飞行相机-绕X轴奇怪旋转

Opengl 自由飞行相机-绕X轴奇怪旋转,opengl,camera,rotation,lwjgl,rotational-matrices,Opengl,Camera,Rotation,Lwjgl,Rotational Matrices,所以我几乎用矢量和gluLookAt之类的东西实现了一个自由飞行相机。 在所有4个方向上的移动和围绕Y轴的旋转工作良好 对于围绕Y轴的旋转我计算眼睛和中心向量之间的向量,然后使用如下旋转矩阵旋转: Vector temp = vecmath.vector(center.x() - eye.x(), center.y() - eye.y(), center.z() - eye.z()); float vecX = (temp.x()*

所以我几乎用矢量和gluLookAt之类的东西实现了一个自由飞行相机。
在所有4个方向上的移动和围绕Y轴的旋转工作良好

对于围绕Y轴的旋转我计算眼睛和中心向量之间的向量,然后使用如下旋转矩阵旋转:

      Vector temp = vecmath.vector(center.x() - eye.x(),
                    center.y() - eye.y(), center.z() - eye.z());

     float vecX = (temp.x()*(float) Math.cos(-turnSpeed)) + (temp.z()* (float)Math.sin(-turnSpeed));
     float vecY = temp.y();
     float vecZ = (temp.x()*(float) -Math.sin(-turnSpeed))+ (temp.z()*(float)Math.cos(-turnSpeed));

     center = vecmath.vector(vecX, vecY, vecZ);  
最后,我将中心设置为新计算的向量。
现在,当我试着做同样的事情,围绕X轴旋转时,它确实会旋转矢量,但方式非常奇怪,有点像是在波浪线中移动。
我使用与上一次旋转相同的逻辑,仅使用x旋转矩阵:

     Vector temp = vecmath.vector(center.x() - eye.x(),
                            center.y() - eye.y(), center.z() - eye.z());

     float vecX = temp.x();
     float vecY = (temp.y()*(float) Math.cos(turnSpeed)) + (temp.z()* (float)-Math.sin(turnSpeed));
     float vecZ = (temp.y()*(float) Math.sin(turnSpeed)) + (temp.z()*(float)Math.cos(turnSpeed));

     center = vecmath.vector(vecX, vecY, vecZ);  

但这为什么不起作用呢?也许我在别的地方做错了什么?

您面临的问题与我第一次尝试执行相机移动时遇到的问题完全相同。出现此问题的原因是,如果您首先转向,使您正沿着X轴向下看,然后尝试通过围绕X轴旋转来“倾斜”摄影机,您实际上会围绕您正在看的方向旋转

我发现处理相机移动的最好方法是在单独的变量中累积角度,每次都完全从原点旋转。如果你这样做,你可以先绕X轴旋转“倾斜”,然后再绕Y轴旋转。按此顺序操作可确保倾斜始终围绕相机的正确轴。大概是这样的:

public void pan(float turnSpeed)
{
    totalPan += turnSpeed;

    updateOrientation();
}

public void tilt(float turnSpeed)
{
    totalTilt += turnSpeed;

    updateOrientation();
}

private void updateOrientation()
{
     float afterTiltX = 0.0f; // Not used. Only to make things clearer
     float afterTiltY = (float) Math.sin(totalTilt));
     float afterTiltZ = (float) Math.cos(totalTilt));

     float vecX = (float)Math.sin(totalPan) * afterTiltZ;
     float vecY = afterTiltY;
     float vecZ = (float)Math.cos(totalPan) * afterTiltZ;

     center = eye + vecmath.vector(vecX, vecY, vecZ); 
}

我不知道语法是否完全正确。已经有一段时间没有用java编程了。

您是否正在尝试让相机的移动像大多数第一人称游戏一样工作?i、 e.上方向向量在世界空间中总是指向“上”@bofjas很像FPS相机,但更重要的是,它必须“飞”,而不仅仅是在地面上移动。哦…稍微向上的摄影机会不会扭曲上方向向量?是的……它不再指向上了,所以我也必须计算上矢?哇,你太棒了,它工作得很好!但是我恐怕我不完全理解全部逻辑,因为我的数学不是很好,也许你读过一些关于这方面的文章或教程?我想了解这一点。很遗憾,我没有任何具体的链接。如果还不清楚的话,我建议你读一读cos和sin。但基本上,一个不旋转的相机的中心应该是从眼睛到z方向的直线。当我们倾斜时,越来越多的从z轴移动到y轴,直到达到90度,z轴上剩下0.0度。这就是我们对前三行所做的。然后我们对刚才构造的向量的z分量做同样的事情。y分量未被修改,因为我们正在围绕y轴旋转。这很难用评论来解释。祝你好运!嗯,谢谢你的解释,我想我现在确实理解了一点。但是现在旋转有一个小问题。当我第一次旋转时,它会旋转我的向量或其他东西,所以我必须按住E或Q并将其旋转回旧视图,当我不是从Y旋转开始,而是从X旋转开始时,它会反转顺序,所以“向上”按钮会变为“向下”等等,但是如果我从Y旋转开始,X旋转效果会很好。也许我可以以某种方式初始化视图,这样我已经旋转了它,并且可以调整视图使其看起来再次正常?通过这样初始化向量:eye=vecmath.vector(0f,0f,10f);中心=向量数学向量(0f,0f,0f);啊,不管我之前的评论,我想得不够远!我只需要用矩阵第一次计算后得出的值初始化平移和倾斜变量,所以我只需将totalPan设置为-3,而不是像第一次那样设置为0,它就工作了!再次感谢你,你真的帮助了我。