自由飞行摄像机 - 围绕X轴的奇怪旋转

时间:2014-09-14 16:50:11

标签: 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()*(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);  

但为什么这不起作用?也许我做错了什么?

1 个答案:

答案 0 :(得分:1)

您遇到的问题与我第一次尝试实施相机移动时遇到的问题完全相同。出现问题的原因是,如果您先转动,以便直视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中编程。