Java / LWJGL:OpenGL中的Z轴表现得像左手坐标系

时间:2013-09-25 03:45:34

标签: java opengl 3d lwjgl

最近,我sought help关于OpenGL中的3D相机旋转。 This answer以及随后的评论对我有很大帮助,但仍然存在一个主要问题:当移动相机时,动作通常(但并非总是)完全与它应该是相反的方向。例如,当相机的方向矩阵是标识时,相机会完美移动。但是,如果它在任何方向上旋转,它在垂直于旋转轴的轴上的运动将具有与预期运动相反的符号。

有了这个说法,我想我已经知道为什么会出现这种不一致的行为:

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

Illustration of a right-handed coordinate system

如果我正确理解了这个图表,当摄像机朝向身份时,z轴应该指向摄像机,并且当一个人离开摄像机时,z值应该减小(显然是肯定的here)。 (在世界空间中测量的坐标)。

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

x = 0; y = 0; z = 0; a small blue square

x = 0; y = 0; z = 8; a large blue square

相机向前移动,沿着负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);
    }
    

0 个答案:

没有答案