投影矩阵是如何工作的?

13
我必须为我的A-Level写一篇关于3D编程的论文。但我严重困惑于透视投影矩阵,需要详细解释该矩阵。我在许多网站和YouTube视频上搜寻了很多这方面的内容,但很少有人试图回答为什么矩阵在那个位置具有这些值。根据此http://www.songho.ca/opengl/gl_projectionmatrix.html,我能够找到w行的作用,但我不理解其他三行。
我决定使用只针对对称视口(右手坐标系)的“简单”版本:
![<code>r+l=0,</code>r-l=2r<code>(width);</code>t+b=0<code>,</code>t-b=2t<code>(height);</code>[n/r 0 0 0; 0 n/t 0 0; 0 0 -(f+n)/(f-n) -(2fn)/(f-n); 0 0 -1 0]`[1]
非常感谢每一个尝试向我解释前三行的人!

3
在有人点赞之前,这其实是一个很好的问题。我现在没有时间写详细的答案,但是这是要点:在二维平面上,想象一条与x轴平行且距离为y=n的线段从x=l到r;这是近投影“线”。现在找一个映射,将该线段上的点映射到范围-1…1,并找到一个因子y_w和偏移w_w,以便将它们乘以和加到y坐标上,使得当y=n时,w=1,如果y不同,则w与y成比例关系。 - datenwolf
1个回答

10

矩阵的核心目的是将3D坐标映射到2D平面上,并使更远的物体变小。

仅为此,一个简单得多的矩阵就足够了(假设您的相机位于原点并朝向Z轴):

1 0 0 0
0 1 0 0
0 0 0 0
0 0 1 0

在使用该矩阵进行乘法运算并对w坐标进行重新归一化后,您将得到确切的结果。每个x,y,z,1点变为x/z,y/z,0,1

然而,没有深度信息(所有点的Z为0),因此深度缓冲/滤波器无法工作。因此,我们可以向矩阵添加一个参数,以便深度信息仍然可用:

1 0 0 0
0 1 0 0
0 0 0 1
0 0 1 0

现在,生成的点包含Z坐标上的逆深度。每个 x,y,z,1 点变成了 x/z,y/z,1/z,1

多出来的参数是通过使用比例和偏移将坐标映射到 (-1,-1,-1) - (1,1,1) 设备框中(如果超出该框,则该点不会被绘制)得到的。


1
非常感谢!实际上,如果有人用一句话向您解释,那么这真的很简单! - Mohammed Li
我花了很长时间才意识到这一点。当你说“在乘以这个矩阵然后重新规范化w坐标之后,你就得到了那个结果。”时,并不意味着实际上就是这样发生的。 只有在某个随机的YouTube视频中,当那个人说“硬件会为你完成这个操作”时,一切才恍然大悟。我试图弄清楚如何让矩阵将其他坐标除以Z,但却费了好长时间。 谢谢,希望我的评论能帮助一些同样想法愚蠢的人。 - TrisT
等一下,4D向量的Z坐标如何影响其他坐标,因为与Z相乘的矩阵部分都是0?@TrisT或其他人,你能具体评论那个人让你意识到了什么吗?提前致谢! - TheSmolCodar
@TheSmolCodar,您是指第一个矩阵吗?该矩阵将x、y、z、1转换为x、y、0、z。然后图形管道将除以最后一个分量。在渲染中,最终的z分量用于深度测试,但使用第一个矩阵时,它们全部都是0,因此需要第二个矩阵。 - ratchet freak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接