最近,我寻求有关 OpenGL 中 3d 摄像机旋转的帮助。这个答案和随后的评论对我有很大帮助,但仍然存在一个主要问题:移动相机时,运动通常(但并非总是)与它应该的方向完全相反。例如,当相机的方向矩阵是恒等时,相机完美地移动。但是,如果它向任何方向旋转,它在垂直于旋转轴的轴上的运动将具有与预期运动相反的符号。
话虽如此,我想我知道为什么会发生这种不一致的行为:
众所周知,OpenGL使用右手坐标系:
如果我正确理解了这张图,当相机朝向同一方向时,z 轴应该指向相机,并且 z 值应该随着远离相机的移动而减小(显然在这里确认)。(在世界空间中测量的坐标)。
然而,在我的程序中,Z 轴指向远离相机,并且 z 值随着远离相机而增加。这是一个例子:
相机已经向前移动,沿着应该是负 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); }