我试图找出透视投影矩阵的工作原理。
根据这个:https://www.opengl.org/sdk/docs/man2/xhtml/gluPerspective.xml
f = cotangent(fovy / 2)
逻辑上我理解它是如何工作的(x-和y-值远离边界框移动,反之亦然),但我需要一个数学解释为什么这个工作。也许是因为相交线的定理???
我在这里找到了解释:http://www.songho.ca/opengl/gl_projectionmatrix.html 但我不明白它的相关部分。
答案 0 :(得分:7)
至于我,对songho.ca的透视投影矩阵的解释是最好的。 我将尝试重述主要想法,而不是详细介绍。但是,首先,让我们澄清为什么 cotangent 用于OpenGL文档。
什么是 cotangent ?相应于wikipedia:
角度的余切是相邻边长与相对边长度之比。
请看下面的图片,附近是相邻边的长度,顶部是的长度对面。 fov / 2 是我们感兴趣的角度。 角度 fov 是顶部平面和底部平面之间的角度,角度 fov / 2 是顶部(或底部)平面与对称轴之间的角度。 / p>
因此,在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 呢?关于规范化设备坐标有一个非常重要的细节。 顶点着色器的输出是一个四分量矢量,通过将前三个分量除以第四个分量,将其转换为插值器中的三个分量矢量:
,
因此,我们可以为第四个组件分配 -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。
我希望我的解释能让事情变得更加清晰。