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

Why clipping should be done in CCS, not NDCS

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

我不明白为什么它会成为问题。

标准化设备坐标 (NDCS) 和剪辑 Space (CCS) 之间的唯一区别是,CCS 在透视分割之前,而 NDCS 在之后。裁剪在 NDCS 中效果不佳的原因是透视分割将观察者后面的点移到前面(因为 w 包含 -z),因此观察者后面的三角形不会在前平面上被正确裁剪掉。

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

在 NDCS 和 CCS 中没有有限的视点(而且我不确定观看者与剪辑有什么关系)。人们必须将这两个系统视为 view-frustum 被扭曲成一个立方体(近平面和远平面具有相同的大小)。在 NDCS 中,可见区域在每个轴的 [-1, 1] 中,而在 CCS 中,它在 [-w, w] 中。现在想想观察者:在视图 space 中,观察者(投影中心)是从近平面的一个角到远平面的相应角的所有光线相交的点。当我们现在将平截头体变形为立方体时,所有这些光线都是平行的并且不再有交点。这意味着投影中心无限远,这在射影space中由齐次坐标为0的向量描述。

问:但是z>0的点在转换后总是大于1,在NDCS中也被切掉了。我错了吗?如果我错了,你能举个例子吗?

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

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

如果我们首先执行透视划分,那么(如您所指出的)A 仍留在视锥内,但 B 被映射到远平面后面的一个点。当我们现在剪掉这些点之间的线时,我们得到一条从 A 到远平面上的点 B' 的线。显然,我们不想让一条线在最初穿过查看器时远离查看器。