0

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

我使用的是 OpenGL ES 2.0,所以我必须自己做所有的矩阵管理。我开始明白以下几点:

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

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

  3. 视图矩阵代表许多人所指的“相机”。对象和观察者之间的距离以及眼睛围绕对象的旋转来自到这个矩阵的变换。

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

图元的坐标以 +-[0, 1] 区间中的浮点数形式给出。但是透视矩阵表示从近 z 到远 z 的 3D 空间(我已经看到分别为 0 和 100)。我对图元的坐标如何映射到这个空间感到困惑。显然,在这种情况下,我的线性代数技能并没有我希望的那么强。谁能澄清这些点是如何映射到这个空间的?

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

4

1 回答 1

1

要了解顶点是如何映射的,您必须了解 open gl 为获得最终形式的顶点所做的工作,称为“标准化设备坐标”空间,从 z = -1 到 z = 1。

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

知道了这些信息,你就可以推导出公式。 本页解释了进入投影矩阵以将视图 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。

于 2013-02-21T22:18:37.957 回答