3

最近,我寻求有关 OpenGL 中 3d 摄像机旋转的帮助。这个答案和随后的评论对我有很大帮助,但仍然存在一个主要问题:移动相机时,运动通常(但并非总是)与它应该的方向完全相反。例如,当相机的方向矩阵是恒等时,相机完美地移动。但是,如果它向任何方向旋转,它在垂直于旋转轴的轴上的运动将具有与预期运动相反的符号。

话虽如此,我想我知道为什么会发生这种不一致的行为:

众所周知,OpenGL使用右手坐标系:

右手坐标系的插图

如果我正确理解了这张图,当相机朝向同一方向时,z 轴应该指向相机,并且 z 值应该随着远离相机的移动而减小(显然在这里确认)。(在世界空间中测量的坐标)。

然而,在我的程序中,Z 轴指向远离相机,并且 z 值随着远离相机而增加。这是一个例子:

x = 0;  y = 0;  z = 0;  一个蓝色的小方块

x = 0;  y = 0;  z = 8;  一个大的蓝色方块

相机已经向前移动,沿着应该是负 z 轴但似乎是正 z 轴。

如果我正确地将此行为解释为异常,它将解释我的相机运动符号的所有问题,因为当前看起来“正确”的运动实际上是错误的,并且我有一致的迹象表明我可以简单地反转以产生正确的运动。

所以问题是:

  • 我的 Z 轴是向后的,还是应该是这样?
  • 如果是倒退,为什么?从关于该主题( 123 )的多次讨论来看,错误很可能在于我定义我的透视截头体的地方,所以我把它放在这里:

    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);
    }
    
4

0 回答 0