sha*_*ack 1 opengl directx graphics clipping coordinate-systems
为什么裁剪应该在CCS中完成,而不是在NDCS中完成.我认为在NDCS中剪辑更容易,但很多书都说剪辑应该在CCS中完成.他们给出了一个例子,从后面和前面将一条线放在眼睛上.
我无法理解为什么它会成为一个问题.
标准化设备坐标(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'的线.显然,当线路最初通过观察者时,我们不希望从观察者处获得一条线.