Opengl 投影矩阵是如何工作的?

Opengl 投影矩阵是如何工作的?,opengl,matrix,3d,Opengl,Matrix,3d,我必须为我的a-Levels写一篇关于3D编程的论文。但是我在理解透视投影矩阵时遇到了一个严重的问题,我需要详细解释这个矩阵。我已经搜索了很多关于这个话题的网站和youtube视频,但很少有人试图回答为什么矩阵在那个地方有这些值的问题。基于此,我能够了解w-row是如何工作的,但我不理解其他三个 我决定只对对称视口使用“更简单”的版本(右坐标): r+l=0,r-l=2r(宽度)t+b=0,t-b=2t(高度)[n/r 0 0;0 n/t 0;0 0-(f+n)/(f-n)-(2fn)/(f-n

我必须为我的a-Levels写一篇关于3D编程的论文。但是我在理解透视投影矩阵时遇到了一个严重的问题,我需要详细解释这个矩阵。我已经搜索了很多关于这个话题的网站和youtube视频,但很少有人试图回答为什么矩阵在那个地方有这些值的问题。基于此,我能够了解w-row是如何工作的,但我不理解其他三个

我决定只对对称视口使用“更简单”的版本(右坐标):

r+l=0,r-l=2r
(宽度)t+b=0
t-b=2t
(高度)[n/r 0 0;0 n/t 0;0 0-(f+n)/(f-n)-(2fn)/(f-n);0 0-10]`[1]>


我非常感谢您为我解释前三行的每一次尝试!

矩阵的核心原因是将三维坐标映射到二维平面,使距离更远的对象更小

对于这一点,一个简单得多的矩阵就足够了(假设您的相机位于原点并注视Z轴):

在与该矩阵相乘,然后重新规范化
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)
设备框中的结果(如果您位于设备框之外,则不会绘制点的边界框)使用刻度和平移。

在有人否决之前,这实际上是一个好问题。我现在没有时间写一个正式的答案,但这里是它的要点:在2D中,想象一条与x轴平行的线,距离y=n,距离x=l…r;这是近投影“线“。现在找到一个映射,将这条线上的点映射到范围-1…1和一个因子y_w和偏移量w_w,以相乘并添加到y坐标,这样对于y=n=>w=1和任何不同的值,w都与y成比例。非常感谢!事实上,如果有人最终用一句话向你解释,这真的很简单!我花了很长时间才意识到这一点。当你说“在与这个矩阵相乘,然后重新规范化w坐标后,你就得到了它”,这并不意味着这就是实际发生的情况。只有在一些随机的youtube视频上,当那个家伙说“硬件为你做这件事”时,所有的东西都点击了。我想弄明白如何让矩阵把其他坐标除以Z,持续很长时间。谢谢,希望我的评论能帮助一些愚蠢的人。等等,4D向量的Z坐标是如何影响其他坐标的,因为矩阵中与Z相乘的部分都是0@特里斯特或其他任何人,你能具体评论一下那个家伙让你意识到了什么吗。提前谢谢你@你是说第一个矩阵中的摩尔分数?该矩阵将x,y,z,1转换为x,y,0,z。然后图形管道将除以最后一个组件。在渲染过程中,最终的z分量用于深度测试,但对于第一个矩阵,它们都是0,因此需要第二个矩阵
1 0 0 0
0 1 0 0
0 0 0 1
0 0 1 0