最近,我sought help关于OpenGL中的3D相机旋转。 This answer以及随后的评论对我有很大帮助,但仍然存在一个主要问题:当移动相机时,动作通常(但并非总是)完全与它应该是相反的方向。例如,当相机的方向矩阵是标识时,相机会完美移动。但是,如果它在任何方向上旋转,它在垂直于旋转轴的轴上的运动将具有与预期运动相反的符号。
有了这个说法,我想我已经知道为什么会出现这种不一致的行为:
众所周知,OpenGL使用右手坐标系:
如果我正确理解了这个图表,当摄像机朝向身份时,z轴应该指向摄像机,并且当一个人离开摄像机时,z值应该减小(显然是肯定的here)。 (在世界空间中测量的坐标)。
然而,在我的程序中,Z轴指向相机的AWAY,并且随着远离相机,z值增加。这是一个例子:
相机向前移动,沿着负z轴向前移动,但看起来是正z轴。
如果我把这种行为解释为异常是正确的,它会解释我的相机动作的所有问题,因为目前看来“正确”的动作实际上是错误的,我有一致的迹象表明我可以简单地反转以产生正确的运动。
所以问题是:
如果是倒退,为什么?通过对该主题的多次讨论来判断(1,2,3),错误很可能出现在我定义视角锥的位置,所以我会把它放在这里:
public static final int P_ZNEAR = 1, P_ZFAR = 500;
public static void perspective()
{
int i = GL11.glGetInteger(GL11.GL_MATRIX_MODE);
GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity();
double ymax, xmax;
ymax = P_ZNEAR * Math.tan(FOV / 2);
xmax = ymax * ASPECT_RATIO;
GL11.glFrustum(xmax, -xmax, -ymax, ymax, P_ZNEAR, P_ZFAR);
GL11.glMatrixMode(i);
}