0

可见性问题可以通过按深度对多边形进行排序(Painter 算法)来解决,并在 z 范围重叠的情况下支持 Newell 算法。Newell 算法在此处此处进行了解释。第 3 点和第 4 点涉及将多边形 1 的每个顶点与多边形 2 的平面进行比较。

为了得到正确的结果,我们应该在裁剪后进行比较(因为裁剪后的多边形可能会从视点完全位于另一个多边形平面的另一侧)。裁剪是在投影之后完成的(因为投影矩阵定义了要裁剪的截头体),这意味着我们必须在投影之后将顶点与平面进行比较。

此外,我们必须将向量归一化,因为投影空间中的 x、y 和 z 值仅适用于它们自己的 w 上下文。

归一化后,我们不再有线性深度,这意味着如果将两个多边形靠近远平面,它们的 z 值会变得更近。在非线性深度空间中,计算法线、点平面距离或检测点位于平面哪一侧所需的任何东西都将失败。

那么,如何执行“P的所有顶点是否都比Q的平面更深”这一步呢?

4

1 回答 1

0

在将问题缩小到“我怎样才能将裁剪后的多边形返回到可以计算其法线向量的空间(即世界空间或眼睛空间)”之后,我想到了一种方法:我们需要反转我们的管道操作,在此处进行描述.

为了避免从窗口空间返回到剪辑空间的重要数学运算,我们可能会在沿着管道向下时缓存剪辑坐标。然后我们只需要用投影矩阵的倒数来变换剪辑坐标。剪裁后的坐标将在眼睛空间中,我们能够进行顶点平面比较(例如,通过平面到矢量法线和参考矢量的点积或测试是否存在线(射线)平面相交) 并完成我们的 VSD 操作。

如果我们正在进行光照计算(在眼睛空间中),我们可能已经有了法线向量。在将法线向量沿管道转换(例如,从对象空间到世界空间)时要记住的一件事是使用矩阵的转置逆矩阵,因此法线向量不会在任何方向上平移。

于 2018-03-03T22:32:20.193 回答