在OpenGL中,创建透视投影矩阵对对象的坐标有什么影响?

时间:2013-02-21 17:51:36

标签: opengl-es matrix perspective

我最近开始学习OpenGL,就与GL和着色器的沟通而言,我已经获得了很好的能力,但我对这个坐标系很不清楚。

我使用OpenGL ES 2.0,所以我必须自己完成所有的矩阵管理。我已经明白了以下几点:

  1. 为了观察正确的结果,将矩阵乘以模型*视图*投影(这非常有意义,因为矩阵乘法不可交换)。

  2. 模型矩阵表示绘图图元的比例,旋转,平移等。在3D空间中移动基元涉及应用于该矩阵的转换。

  3. 视图矩阵代表"相机"很多人都提到它。物体和观察者之间的距离以及眼睛围绕物体的旋转来自对该矩阵的变换。

  4. 最后,透视矩阵表示场景所在的3D空间。我遵循一些示例,这些示例主要使用视角方法和纵横比。这就是我的困惑开始的地方。

  5. 原语的坐标在间隔+ - [0,1]中以浮点形式给出。但是透视矩阵表示从近z到远z的3D空间(我分别看到它是0和100)。我对原始坐标如何映射到这个空间感到困惑。显然,我的线性代数技能并不像我在这种情况下那样强大。任何人都可以澄清这些点是如何映射到这个空间的吗?

    例如,许多示例将多维数据集定义为+ - (。5,.5,.5)。我使用near-z = 0,far-z = 100的透视martrix,以及整个显示的纵横比,这是否意味着立方体总是处于每个维度的.5?我的意思是,如果透视矩阵从x = -5到x = 5,x坐标最终是.5(-5)= -2.5?

1 个答案:

答案 0 :(得分:1)

要理解顶点是如何映射的,你必须要理解open gl在最终形式中得到的顶点,称为“规范化设备坐标”空间,从z = -1到z = 1。

首先,视图空间顶点乘以投影矩阵。 然后,顶点被其第4或“w”分量除。这称为perspective divide

了解这些信息后,您就可以推导出公式。 This page解释了投影矩阵中用于将视图z坐标映射到投影-z坐标的数学运算。如果您不关心派生,可以向下滚动以查看最终结果,即:

zn = (-(f+n) * ze / (f-n) - 2*f*n/(f-n) ) / (-ze)

当zn在标准化设备坐标中为z时,ze在视图(或眼睛)坐标中为z,f为远剪裁平面,n为近剪裁平面。

如果检查公式,您会注意到如果顶点的z分量等于n,则它映射到-1。如果它等于f,它映射到1,在它之间,它遵循双曲函数从-1到1。