Answers:
最重要的是,它将您的点(顶点)从3D世界空间转换为2D屏幕空间。
这意味着在顶点与该矩阵相乘之后,X和Y坐标在屏幕上的位置([-1,1]之间),Z是深度。Z用于深度缓冲,并标识顶点(或片段)与相机靠近平面的距离。
投影意味着,离近平面更近的顶点离屏幕中间的距离更远->距相机更近的三角形似乎比远处的顶点更大。这基于您的视野-您正在某些createProjectionMatrix函数或createFrustum中输入它。它的工作原理是将相机的视锥和顶点剪切并缩放为立方体。不会显示大于1且小于-1的值。
还保持像素长宽比,因此像素可以是正方形的。那很简单。它只是像这样剪切相机的视锥:屏幕更宽->垂直剪切更多,反之亦然。
简单的答案:
它定义了您的相机视锥,并且对:
这个答案是事实之后很久了,但是由于我在Google上找到了这个答案,也许这仍然会有所帮助。我只想澄清一下JasonD和Notabene所说的话:进行裁剪计算要容易得多(弄清楚您应该看到什么以及不应该看到什么,因为您正在看的是哪种方式,距离有多远,等等。 )。只需检查所有对象的x,y,z与xMax,xMin,yMax等,而不是检查事物是否与视锥的边界上的平面相交。,因为您只是拥有一个多维数据集。如果只想显示一部分内容,则要复杂一些,但是使用单位立方体比使用平截头体的数学效果更好。
我发现其他答案有误导之处:
-您不是要从视锥中剪掉侧面,而是要使用齐次矩阵转换将其变形为立方体。
-我们不会通过此步骤转换为2D屏幕。无需执行此步骤。从理论上讲,我们可以完成所有工作而无需先将平截头体转换为多维数据集,这会更直观,但数学上会更困难-但是图形的意思是真正非常快速地进行计算,因为平均每个游戏每秒都有很多计算。
更详细的信息:它不一定是我们要转换成的单位立方体,它只需要是一个矩形框即可计算出我们的最大-最小计算。实际上,在课堂上,我们使用了一个框,其中摄像头面向z轴,z从0到1,x从-1到1,y从-1到1。通常在数学1、0中,和-1是使计算更容易的好数字,我认为这就是为什么我们不从-100到100或类似的数字。
TLDR:剪裁更容易。
编辑:bobobobo有其要旨。一切都是三角形,通常是:D。
资料来源:参加大学绘画班
我相信这是因为OpenGL无法假设图像的显示方式(纵横比或分辨率,硬件细节等)。它将图像和图像渲染为中间形式,操作系统或驱动程序或任何可缩放至正确分辨率/大小的中间形式。
我注意到一个答案已经被接受,但是对于将截头视图转换为单位立方体的剪辑通常很有用。
我建议检查有关Scratchapixel的透视投影矩阵的课程
它清楚地说明了为什么将视锥台空间扭曲到一个单位立方体。为什么?本质上是因为在画布上投影3D点的过程涉及到将它们转换为NDC空间,NDC空间是在屏幕上的点在[-1,1]范围内重新映射的空间(假定屏幕是正方形的)。现在我们还将点Z坐标重新映射到[0,1](有时是[-1,1])范围,因此最终得到一个立方体。事实是,当点包含在多维数据集中时,处理它们要比在视锥表中定义它们(这是一个奇怪的空间,一个截顶的金字塔)要容易得多。另一个原因是,它将CG中可以想象的各种投影变换带到同一空间(单位立方体很复杂)。因此,无论您使用的是透视投影还是正交投影,
尽管也许您过多地关注了为什么。单位立方体实际上只是涉及或用于将顶点投影到屏幕上,然后将其坐标重新映射到栅格空间的数学过程的结果。