I know perspective division is done by dividing x,y, and z by w, to get normalized device coordinates. But I am not able to understand the purpose of doing that. Also, does it have anything to do with clipping?
4 回答
补充一般答案的一些细节:
这个想法是在屏幕上投影一个点(x,y,z)以具有(xs,ys,d)。下图显示了 y 坐标。
我们从学校知道
tan(alpha) = ys / d = y / z
这意味着投影计算为
ys = d*y/z = y /w
w = z / d
这足以应用投影。但是在 OpenGL 中,您希望 (xs,ys,zs) 成为 [-1,1] 中的标准化设备坐标,是的,这与裁剪有关。
(xs,ys,zs) 的极值表示单位立方体,并且它之外的所有内容都将被剪裁。因此,投影矩阵通常会考虑裁剪限制(Frustum)来进行单个变换,通过透视分割,同时应用投影并将投影坐标与 z 一起变换为标准化的设备坐标。
我的意思是我们为什么需要它?
通俗地说:使透视失真起作用。在透视投影矩阵中,Z 坐标“混合”到 W 输出分量中。所以Z坐标的值越小,即越接近原点,放大的东西就越多,即在屏幕上越大。
要真正将其提炼为基本概念,以及为什么运算是除法(而不是例如平方根等),请考虑两倍远的对象应该出现的尺寸正好是原来的一半。通过...除法从 2 中获得 1/2。
有许多几何方法可以得出相同的结论。真的,图表可以作为视觉证明。
实际上,通过来自 4x4 透视矩阵的标准符号约定,视线沿“z”方向,“w”与距离比相差 1。此外,该比率虽然解释正确,但通常表示为 -z/d,其中“z”为负数(因此产生正确的比率),因为在常见的符号约定中,相机再次注视“z”负方向。偏移1的原因需要说明。许多参考文献将原点放在图像平面而不是投影中心。使用该约定(再次使用相机沿负“z”方向观察),相似三角形图中标记为“z”的距离因此被替换为(dz)。然后将'z'替换为'w'的表达式,而不是' z/d', (dz)/d = [1-z/d]。对某些人来说,这些惯例可能看起来不正统,但它们在分析师中很受欢迎。