在3D渲染管线的透视变换(prospective transformation)中,远近裁剪面的取值不同,会对变换的结果造成一定的影响,主要体现在变换后z值的密度上。这次图形学作业有关于这方面的一道讨论题,顺便就把我的分析结果放上来吧。
先看一下透视变换矩阵:
其中F表示远裁剪面距离,D表示近裁剪面距离。这里只关心z坐标。
令Z为变换后的z坐标值,Zv为变换前在观察坐标系中的z坐标值,可以得到:
Z = (F*Zv–F*D) / Zv*(F-D)
首先我们单纯观察变换后的z值:
可以看到,物体在观察坐标系中越接近远裁剪面、远离近裁剪面,在z方向上就会变得越密集、越靠后。因此,在决定D和F的取值时,尽量让目标均匀地分布在D和F之间比较合理。其实D对于z值的影响要比F的影响大得多,F主要用来控制对远处物体的裁剪以提高渲染效率,而D如果太靠近摄像机的话就会让物体在变换后变得离摄像机更远。
接下来,我们在观察坐标系中取两个点,Zv分别为Zv1、Zv2(Zv1 != Zv2),变换后的Z分别为Z1、Z2,观察Z2-Z1的值:
Z2 – Z1 = (F*Zv2 – F*D) / Zv2*(F-D) – (F*Zv1 – F*D) / Zv1*(F-D)
= F / (F-D) * ((Zv2-D) / Zv2 – (Zv1-D) / Zv1)
= (F*D / (F-D)) * (Zv2-Zv1) / (Zv1*Zv2)
由于Zv2-Zv1始终是不变的(因为观察坐标系和这两个点都不动),所以Z2-Z1只和F、D有关。
假设F不变,那么Z2-Z1就变成了以D为自变量的函数f(D),导函数为F2 / (F-D)2。由于F > D > 0,所以导函数在定义域上始终大于0,因此f(D)单调递增。所以在F不变的情况下,D的取值越小,即越接近摄像机,原来相隔一定z值的两个点就会变得越密。
对于D不变的情况也是同理分析,导函数小于0,所以f(F)单调递减。因此在D不变的情况下,F的取值越大,原来相隔一定z值的两个点就会变得越密。
» 转载请注明来源及链接:未来代码研究所