我看到这个问题有点老了,但我决定给那些谁通过搜索找到这个问题的答案。
现在表示2D / 3D变换的标准方式是通过使用齐次坐标。 [x,y,w]表示2D,[x,y,z,w]表示3D。由于在3D和翻译中有三个轴,所以该信息完美地适合于4×4变换矩阵。我将在这个解释中使用列主矩阵符号。除非另有说明,所有矩阵都是4×4。
从3D点到光栅化点,线或多边形的阶段如下所示:
>使用逆相机矩阵转换您的3D点,然后跟他们需要的任何转换。如果你有表面法线,变换他们,但w设置为零,因为你不想翻译法线。你转换法线的矩阵必须是各向同性的;缩放和剪切使得法线畸形。
>使用剪裁空间矩阵转换点。该矩阵用视场和纵横比缩放x和y,通过近和远剪裁平面缩放z,并将“旧”z插入w。变换后,你应该把x,y和z除以w。这被称为透视分割。
>现在,您的顶点位于剪辑空间中,并且您想要执行剪切,因此您不会在视口边界之外渲染任何像素。萨瑟兰 – 霍奇曼剪辑是最广泛使用的剪切算法。
>相对于w和半宽和半高变换x和y。您的x和y坐标现在在视口坐标中。 w被丢弃,但是1 / w和z通常被保存,因为需要1 / w在多边形表面上进行透视校正插值,并且z被存储在z缓冲器中并用于深度测试。
这个阶段是实际的投影,因为z不再用作位置中的组件。
算法:
计算视场
这将计算视场。 tan是否取弧度或度是不相关的,但角度必须匹配。注意,当角度接近180度时,结果达到无穷大。这是一个奇点,因为它不可能有一个广泛的焦点。如果想要数值稳定性