为啥我们需要透视分割?

Posted

技术标签:

【中文标题】为啥我们需要透视分割?【英文标题】:Why do we need perspective division?为什么我们需要透视分割? 【发布时间】:2013-06-20 14:50:06 【问题描述】:

我知道透视分割是通过将 x、y 和 z 除以 w 来完成的,以获得标准化的设备坐标。但我无法理解这样做的目的。还有,和剪辑有关系吗?

【问题讨论】:

也许你在 Maths.se 上比这里更好:)(IOW OpenGL 完全不相关) scratchapixel.com/lessons/3d-advanced-lessons/… Understanding the Projection Matrix的可能重复 很好的问题。关于“为什么事情有效”的问题的答案是如此重要,我发现他们经常被忽视而倾向于如何 【参考方案1】:

补充一般答案的一些细节:

这个想法是在屏幕上投影一个点 (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 一起转换为标准化的设备坐标。

【讨论】:

不应该 w = d / z 吗?【参考方案2】:

我的意思是我们为什么需要它?

通俗地说:使透视失真起作用。在透视投影矩阵中,Z 坐标被“混合”到 W 输出分量中。所以 Z 坐标的值越小,即越靠近原点,放大的东西就越多,即在屏幕上越大。

【讨论】:

事实上,最简单的透视矩阵可能只是将 z 复制到 w 中,这样当透视除法发生时,x 和 y 离相机越远越小。该视频可能对youtu.be/o1n02xKP138?t=994 有所帮助【参考方案3】:

要真正提炼出基本概念,以及为什么运算是除法(而不是例如平方根等),请考虑两倍远的对象应该出现尺寸正好是其二分之一。通过...除法从 2 中获得 1/2。

有许多几何方法可以得出相同的结论。一张图表可以作为视觉证据,真的。

【讨论】:

【参考方案4】:

实际上,根据 4x4 透视矩阵的标准符号约定,视线沿“z”方向,“w”与距离比相差 1。此外,该比率虽然解释正确,但通常表示为 -z/d,其中“z”为负数(因此产生正确的比率),因为在常见的符号约定中,相机朝负的“z”方向看。 偏移1的原因需要说明。许多参考文献将原点放在图像平面而不是投影中心。使用该约定(再次使用相机沿负“z”方向观察),相似三角形图中标记为“z”的距离因此被(d-z)替换。然后将“z”替换为“w”的表达式,而不是“z/d”,(d-z)/d = [1-z/d]。对某些人来说,这些惯例可能看起来不正统,但它们在分析师中很受欢迎。

【讨论】:

以上是关于为啥我们需要透视分割?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在创建数据透视表时,Excel2013无法勾选“将此数据添加到数据模型?

数据透视表求和项为啥在第一行

为啥我们在 SQL Server 中透视文本列时使用 Max 函数?

我的OpenGL学习进阶之旅介绍一下OpenGL ES的图元装配:坐标系统透视分割视口变化

我的OpenGL学习进阶之旅介绍一下OpenGL ES的图元装配:坐标系统透视分割视口变化

OpenGL 4.4管道 - 裁剪前的透视分割?