Category:High Mathematics & Computer Graphics Application
正文
7 查看(Viewing)
7.2 投影变换
我们把透视留到最后,因为它需要一点点聪明才智才能让它适应向量和矩阵变换的系统,到目前为止,它一直很好地为我们服务。为了看看我们需要做什么,让我们看看透视投影变换需要对相机空间中的点做什么。回想一下,视点位于原点,相机沿着 z 轴看。
透视的关键属性是屏幕上对象的大小与 1/z 成正比,因为眼睛在原点向上查看负 z 轴。这可以用图 7.8 中的几何方程更精确地表示:
目前我们将忽略 z 的符号以使方程更简单,但它会在第 150 页返回。
其中 y 是该点沿 y 轴的距离,ys 是该点应在屏幕上绘制的位置。
我们真的很想使用我们为正交投影开发的矩阵机器来绘制透视图像;然后我们可以将另一个矩阵乘以我们的复合矩阵并使用我们已有的算法。
然而,这种类型的变换,其中输入向量的一个坐标出现在分母中,不能使用仿射变换来实现。 我们可以通过对我们一直用于仿射变换的齐次坐标机制的简单概括来允许划分。
我们已经同意使用齐次向量 [xyz 1]T 来表示点 (x, y, z);额外的坐标 w 始终等于 1,这通过始终使用 [0 0 0 1]T 作为仿射变换矩阵的第四行来确保。
我们现在将其定义为 x、y 和 z 坐标的分母,而不是仅仅将 1 视为附加在强制矩阵乘法以实现平移的额外部分:齐次向量 [xyzw] T 表示点(x/w、y/w、z/w)。这在 w = 1 时没有区别,但如果我们允许变换矩阵的底行中的任何值,它允许实现更广泛的变换,从而导致 w 取 1 以外的值。
具体来说,线性变换允许我们计算如下表达式
和仿射变换将此扩展到
将 w 视为分母进一步扩展了可能性,允许我们计算如下函数
这可以称为X,Y和Z的“线性合理函数”。但是有一个额外的约束 - 对转换点的所有坐标的分母相同:
表示为矩阵变换,
和
像这样的变换称为射影变换或单应变换。
例如:矩阵:
表示将单位正方形 ([0, 1] × [0, 1]) 变换为图 7.9 所示的四边形的 2D 投影变换。
例如,(1,0)正方形的右下角由均匀向量[1 0 1] T表示,并如下转换:
它表示点 (1/ 1 3 , 0/ 1 3 ) 或 (3, 0)。请注意,如果我们使用矩阵
相反,结果是 [3 0 1]T,它也表示 (3, 0)。事实上,任何标量倍数 cM 都是等价的:分子和分母都按 c 标度,这不会改变结果。
有一种更优雅的方式来表达相同的想法,避免了专门处理W坐标。在此观点中,3D投影转换仅仅是4D线性转换,其额外规定是,向量的所有标量倍数都涉及同一点:
符号〜被读成“等同于”,并指出两个均匀的向量都描述了空间中的同一点。
例子。在 1D 齐次坐标中,我们使用 2 向量来表示实线上的点,我们可以使用齐次向量 [1.5 1]T 或线上 x = 1.5h 中的任何其他点来表示点 (1.5)同质空间。 (见图 7.10。)
在2D均匀的坐标中,我们使用3个向量代表平面中的点,我们可以使用均质矢量来表示点(-1,-0.5)[-2;-1;2] t,或线上的任何其他点x =α[-1-0.5 1] t。线上的任何均匀向量都可以映射到线与平面W = 1的交点以获得其笛卡尔坐标。(见图7.11。)
可以根据需要多次变换齐次向量,而不必担心 w 坐标的值——事实上,如果 w 坐标在某个中间阶段为零也可以。只有当我们想要一个点的普通笛卡尔坐标时,我们才需要将其归一化为 w = 1 的等效点,这相当于将所有坐标除以 w。完成此操作后,我们就可以从齐次向量的前三个分量中读取 (x, y, z) 坐标。
7.3透视投影
射影转换的机制使得通过z实施Z实施透视图变得易于实施。在图7.8所示的2D示例中,我们可以使用矩阵转换实现透视投影,如下所示:
这将转换 2D 齐次向量 [y; z; 1]T 到一维齐次向量 [dy z] T,它表示一维点 (dy/z)(因为它等价于一维齐次向量 [dy/z 1]T。这符合公式(7.5)。
对于 3D 中的“官方”透视投影矩阵,我们将采用我们通常的惯例,即原点处的相机朝向 -z 方向,因此点 (x, y, z) 的距离为 -z。与正交投影一样,我们也采用近平面和远平面的概念来限制可见距离的范围。在这种情况下,我们将使用近平面作为投影平面,因此像平面距离为-n。
那么所需的映射是 ys = (n/z)y,对于 x 也是如此。这种变换可以通过透视矩阵来实现:
请记住,n < 0。
第一、二、四行只是简单地实现了透视方程。 第三行,与正交矩阵和视口矩阵一样,旨在将 z 坐标“随行”,以便我们以后可以使用它来去除隐藏的表面。然而,在透视投影中,添加非常数分母会阻止我们实际保留 z 的值——实际上不可能在让 x 和 y 做我们需要它们做的事情的同时阻止 z 的变化。相反,我们选择在近平面或远平面上的点保持 z 不变。
有许多矩阵可以用作透视矩阵,它们都会非线性地扭曲 z 坐标。这个特定的矩阵具有如图 7.12 和 7.13 所示的良好属性;它将点完全单独留在 (z = n) 平面上,并在 (z = f) 平面上留下点,同时在 x 和 y 上以适当的量“挤压”它们。矩阵对点 (x, y, z) 的影响是
如您所见,x 和 y 被缩放,更重要的是,除以 z。因为 n 和 z(在视图体积内)都是负数,所以 x 和 y 中没有“翻转”。虽然不是很明显(见本章末尾的练习),但变换也保留了 z = n 和 z = f 之间的 z 值的相对顺序,允许我们在应用此矩阵后进行深度排序。当我们稍后进行隐藏表面消除时,这将很重要。
有时我们会想要取 P 的倒数,例如,将屏幕坐标加上 z 带回原始空间,就像我们可能想要做的拾取一样。逆是
由于将齐次向量乘以标量不会改变其含义,因此对齐次向量进行运算的矩阵也是如此。所以我们可以通过乘以 nf 以更漂亮的形式写出逆矩阵:
在等式 (7.3) 中的正交投影矩阵 Morth 的上下文中,透视矩阵只是将透视视图体积(其形状像金字塔的切片或截头锥体)映射到正交视图体积(它是一个轴-对齐的框)。透视矩阵的美妙之处在于,一旦我们应用它,我们就可以使用正交变换来获得规范视图体积。因此,所有的正交机制都适用,我们添加的只是一个矩阵和除以 w。同样令人振奋的是,我们没有“浪费”四乘四矩阵的最后一行!
将 P 与 Morth 连接得到透视投影矩阵,
然而,一个问题是:l,r,b,t 如何确定透视?它们确定了我们观察的“窗口”。由于透视矩阵不会改变 (z = n) 平面上的 x 和 y 的值,我们可以在该平面上指定 (l, r, b, t)。
为了将透视矩阵集成到我们的正交基础设施中,我们只需将 Morth 替换为 Mper,它在应用相机矩阵 Mcam 之后但在正交投影之前插入透视矩阵 P。所以透视观察的全套矩阵是
得到的算法是:
请注意,除了附加矩阵之外,唯一的变化是除以齐次坐标 w。
相乘,矩阵 Mper 如下所示:
这个或类似的矩阵经常出现在文档中,当人们意识到它们通常是几个简单矩阵的乘积时,它们就不那么神秘了。
例子。许多 API,例如 OpenGL (Shreiner, Neider, Woo, & Davis, 2004) 使用与此处介绍的相同的规范视图体积。他们通常还让用户指定 n 和 f 的绝对值。 OpenGL的投影矩阵是
其他 API 分别将 n 和 f 发送到 0 和 1。 Blinn (J. Blinn, 1996) 建议将规范视图体积设为 [0, 1]3 以提高效率。所有这些决定都会稍微改变投影矩阵。