为什么裁剪应该在CCS中完成,而不是在NDCS中完成

时间:2017-01-31 07:47:14

标签: opengl graphics directx coordinate-systems clipping

为什么裁剪应该在CCS中完成,而不是在NDCS中完成。 我认为在NDCS中剪辑更容易,但很多书都说剪辑应该在CCS中完成。他们给出了一个例子,从后面和前面将一条线放在眼睛上。

我无法理解为什么它会成为一个问题。

1 个答案:

答案 0 :(得分:5)

规范化设备坐标(NDCS)和剪辑空间(CCS)之间的唯一区别在于,CCS在透视分割之前,而NDCS在之后。裁剪在NDCS中不能很好地工作的原因是透视分割将观察者后面的点移动到前面(因为w包含-z),因此观察者后面的三角形不会在前平面处被正确地剪掉。

问:NDCS中的查看器在哪里。在VCS中,观看者的位置是原点[0,0,0,1]。但是,如果我用透视矩阵计算原点,结果很奇怪。齐次坐标不是1而是0.我们如何定义观察者在NDCS中的位置?

在NDCS和CCS中没有有限的观察点(我不确定观众与剪辑有什么关系)。人们必须考虑两个系统,因为视锥体被扭曲成立方体(具有相同尺寸的近平面和远平面)。在NDCS中,可见区域沿着每个轴在[-1,1]中,而在CCS中,它在[-w,w]中。现在考虑观察者:在视图空间中,观察者(投影中心)是从近平面的角落到远平面中的相应角落的所有光线相交的点。当我们现在将平截头体扭曲成立方体时,所有这些光线都是平行的,并且不再有交叉点。这意味着投影中心距离很远,在投影空间中通过具有0的齐次坐标的矢量进行描述。

问:但是,z>转换后0始终大于1,并且在NDCS中也被剪切。我错了吗?如果我错了,你能举个例子吗?

你基本上是对的。但剪切不会发生在单个点上,剪切发生在这些点之间的边缘上。

假设我们有一条线从平截头体(A)内的一个点到观察者后面的一个点(B)。在这种情况下,裁剪应该发生在近平面,线应该从A到B' (线与近平面的交点)。

如果我们首先执行透视分割,那么(如您所述)A仍然停留在视锥体内但B被映射到远平面后面的点。当我们现在剪切这些点之间的线时,我们得到一条从A到B点的线。这是在遥远的飞机上。显然,当线路最初通过观察者时,我们不想让观众离开观看者。