透视投影矩阵的说明(第二行)

时间:2014-10-29 10:57:37

标签: opengl matrix 3d projection

我试图找出透视投影矩阵的工作原理。

根据这个:https://www.opengl.org/sdk/docs/man2/xhtml/gluPerspective.xml

f = cotangent(fovy / 2)

逻辑上我理解它是如何工作的(x-和y-值远离边界框移动,反之亦然),但我需要一个数学解释为什么这个工作。也许是因为相交线的定理???

我在这里找到了解释:http://www.songho.ca/opengl/gl_projectionmatrix.html 但我不明白它的相关部分。

1 个答案:

答案 0 :(得分:7)

至于我,对songho.ca的透视投影矩阵的解释是最好的。 我将尝试重述主要想法,而不是详细介绍。但是,首先,让我们澄清为什么 cotangent 用于OpenGL文档。

什么是 cotangent ?相应于wikipedia

角度的余切是相邻边长与相对边长度之比。

请看下面的图片,附近相邻边的长度,顶部的长度对面 fov / 2 是我们感兴趣的角度。 角度 fov 是顶部平面和底部平面之间的角度,角度 fov / 2 是顶部(或底部)平面与对称轴之间的角度。 / p>

enter image description here

因此,在opengl文档中定义为余切(fovy / 2)的投影矩阵的[1,1]元素等于 near / top 的比率。

让我们看一下图片中指定的A点。让我们找到点A'的 y'坐标,它是近平面上A点的投影。

使用相似三角形的比率,可以推断出以下关系:

y' / near = y / -z

或者:

y' = near * y / -z

归一化设备坐标中的y坐标可以通过除以值 top 获得(范围(-top,top)映射到范围(-1.0,1.0)),因此:

yndc = near / top * y / -z

系数 near / top 是一个常数,但是 z 呢?关于规范化设备坐标有一个非常重要的细节。 顶点着色器的输出是一个四分量矢量,通过将前三个分量除以第四个分量,将其转换为插值器中的三个分量矢量:

enter image description hereenter image description here

因此,我们可以为第四个组件分配 -z 的值。可以通过为投影矩阵的元素[2,3]指定值 -1 来完成。

可以对x坐标进行类似的推理。

我们找到了投影矩阵的以下元素:

| near / right      0               0           0 | 
| 0                 near / top      0           0 |
| 0                 0               ?           ? |
| 0                 0               -1          0 |

我们没有找到两个元素,它们标有'?'。

为了清楚说明,让我们将一个任意点(x,y,z)投影到规范化的设备坐标:

| near / right      0               0           0 |   | x |
| 0                 near / top      0           0 | X | y | = 
| 0                 0               ?           ? |   | z |
| 0                 0               -1          0 |   | 1 |

  | near / right * x |
= | near / top * y   |
  | ?                |
  | -z               |

最后,在除以 w 组件后,我们将得到:

| - near / right * x / z |
| - near / top * y  / z  |
| ?                      |

请注意,结果与先前推断的等式匹配。

标有'?'的第三个组件。需要更复杂的推理来找出如何计算它。有关更多信息,请参阅songho.ca。

我希望我的解释能让事情变得更加清晰。