可见性问题可以通过深度排序多边形(Painter算法)来解决,并且在z范围重叠的情况下支持Newell算法。 Newell的算法解释为here和here。第3点和第4点涉及将polygon1的每个顶点与polygon2的平面进行比较。
为了得到正确的结果,我们应该在剪裁后进行比较(因为剪裁后的多边形可能会改变为完全位于距离视点的另一个多边形平面的另一侧)。剪影是在投影后完成的(因为投影矩阵定义了平截头体以进行剪裁),这意味着我们必须在投影后将顶点与平面进行比较。
此外,我们必须对向量进行标准化,因为投影空间中的x,y和z值仅适用于它们自己的w上下文。
归一化后,我们不再具有线性深度,这意味着如果将两个多边形的z值移近远平面,则它们的z值会变得更近。计算法线,点平面距离或检测点的平面哪一侧所需的任何东西都将在非线性深度空间中失败。
那么,如何执行“P的所有顶点是否比Q平面更深”?
答案 0 :(得分:0)
将问题缩小到"如何将剪裁的多边形返回到可以计算其法线向量的空间(意味着世界空间或眼睛空间)",我看到了一种方法: 我们需要反转我们的管道操作,描述here。
为了避免从窗口空间回到剪辑空间的非平凡数学,我们可以在沿着管道向下缓存剪辑坐标。然后我们只需要用投影矩阵的逆变换剪辑坐标。然后,剪切的坐标将在眼睛空间中,并且我们能够进行顶点 - 平面比较(例如,通过平面到矢量法线和参考矢量的点积或测试,如果存在线(光线) - 平面交叉点并完成我们的VSD操作。
如果我们正在进行光照计算(在眼睛空间中),我们可能已经有了法向量。在将法向量向下转换为管道时(例如,从对象空间到世界空间),要记住的一件事是使用矩阵的转置逆,这样法向量就不会在任何方向上转换。