计算机图形学基础笔记(6.2)

76 阅读10分钟

Category:Higher Mathematics & Computer Graphics Application

正文

6.2 3D 线性变换

线性 3D 变换是 2D 变换的扩展。例如,笛卡尔坐标轴上的刻度是 image.png

3D 中的旋转比 2D 中的旋转要复杂得多,因为有更多可能的旋转轴。但是,如果我们只是想绕 z 轴旋转,这只会改变 x 和 y 坐标,我们可以使用 2D 旋转矩阵而不对 z 进行操作:

image.png

类似地,我们可以构造矩阵来绕 x 轴和 y 轴旋转:

image.png

我们将在下一节讨论关于任意轴的旋转。

在二维中,我们可以沿特定轴剪切,例如,

image.png

与2D变换一样,任何3D变换矩阵都可以使用SVD分解为旋转,比例和另一个旋转。任何对称的3D矩阵都具有特征值分解,分解为旋转,比例和反旋转。最后,可以将3D旋转分解为3D剪切矩阵的产物。

6.2.1任意3D旋转

与 2D 一样,3D 旋转是正交矩阵。在几何上,这意味着矩阵的三行是三个相互正交的单位向量的笛卡尔坐标,如 2.4.5 节所述。这些列是三个可能不同的相互正交的单位向量。有无数这样的旋转矩阵。让我们写下这样一个矩阵:

image.png

在这里,对于 v 和 w,u = xux yuy zuz 等等。由于这三个向量是正交的,我们知道

image.png

我们可以通过将其应用于向量 u、v 和 w 来推断旋转矩阵的一些行为。例如,

image.png

请注意,这三行 Ruvwu 都是点积:

image.png

同样,Ruvwv = y,Ruvww = z。所以 Ruvw 通过旋转将基础 uvw 带到相应的笛卡尔轴上。

如果说Ruvw是一个正交行的旋转矩阵,那么RT uvw也是一个正交列的旋转矩阵,实际上是Ruvw的逆(正交矩阵的逆总是它的转置)。重要的一点是,对于变换矩阵,代数逆也是几何逆。因此,如果 Ruvw 将 u 带到 x,那么 RT uvw 将 x 带到 u。 v 和 y 也应该如此,我们可以确认:

image.png

所以我们总是可以从正交基创建旋转矩阵。

如果我们希望围绕任意矢量A旋转,则可以与W = a形成正顺序基础,将基础旋转为规范基础XYZ,围绕Z轴旋转,然后将规范基础旋转回UVW基础。以矩阵形式,以角度φ旋转W轴:

image.png

这里我们有一个在 a 方向上的单位向量 w(即 a 除以它自己的长度)。但是你和v是什么? 2.4.6 节给出了一种寻找合理 u 和 v 的方法。

如果我们有一个旋转矩阵,并且希望以轴角形式进行旋转,我们可以计算一个实特征值(λ = 1),相应的特征向量就是旋转轴。这是不被旋转改变的一个轴。

见第 16 章比较了几种最常用的表示旋转的方法,除了旋转矩阵。

6.2.2 转换法线向量

虽然我们使用的大多数 3D 矢量表示位置(与原点的偏移矢量)或方向,例如光的来源,但一些矢量表示表面法线。表面法向量垂直于表面的切平面。当基础表面被变换时,这些法线不会按照我们想要的方式变换。例如,如果通过矩阵 M 变换曲面的点,则与曲面相切并乘以 M 的向量 t 将与变换后的曲面相切。但是,由 M 转换的表面法线向量 n 可能不垂直于转换后的表面(图 6.17)。

我们可以推导出一个变换矩阵 N,它确实将 n 取为一个垂直于变换表面的向量。解决这个问题的一种方法是注意表面法向量和切向量是垂直的,所以它们的点积为零,用矩阵形式表示为

image.png

image.png

如果我们将所需的变换向量表示为 tM = Mt 和 nN = Nn,我们的目标是找到 N 使得 nT N tM = 0。我们可以通过一些代数技巧找到 N。首先,我们可以在点积中潜入一个单位矩阵,然后利用 M−1 M = I:

image.png

尽管上面的操作显然没有让我们得到任何结果,但请注意,我们可以添加括号,使上面的表达式更明显地成为点积:

image.png

这意味着垂直于 tM 的行向量是上面表达式的左侧部分。该表达式适用于切平面中的任何切向量。由于在 3D 中只有一个方向(及其相反方向)垂直于所有这些切向量,我们知道上面表达式的左边部分必须是 nN 的行向量表达式,即它是 nT N ,所以这个允许我们推断 N:

image.png

所以我们可以把它转置得到

image.png

因此,我们可以看到正确转换法线向量以使其保持正常的矩阵是 N = (M−1)T,即逆矩阵的转置。
由于这个矩阵可能会改变 n 的长度,我们可以将它乘以任意标量,它仍然会产生具有正确方向的 nN。回想第 5.3 节,矩阵的逆矩阵是辅因子矩阵的转置除以行列式。因为我们不关心法向量的长度,我们可以跳过除法,发现对于一个 3 × 3 的矩阵,

image.png

这假设 M 在第 i 行和第 j 列中的元素是 mij 。所以 N 的完整表达式是:

image.png

6.3 平移和仿射变换

我们一直在研究使用矩阵 M 更改向量的方法。在二维中,这些变换具有以下形式,

image.png

我们不能使用这种变换来移动对象,只能缩放和旋转它们。特别是,原点 (0, 0) 在线性变换下始终保持固定。要通过将对象的所有点移动相同的量来移动或平移对象,我们需要对形式进行变换,

image.png

无法通过将 (x, y) 乘以 2 × 2 矩阵来做到这一点。将平移添加到我们的线性变换系统的一种可能性是简单地将单独的平移向量与每个变换矩阵相关联,让矩阵负责缩放和旋转,而向量负责平移。这是完全可行的,但是记账很麻烦,并且组合两个变换的规则不像线性变换那样简单和干净。

相反,我们可以使用一个聪明的技巧来获得一个矩阵乘法来同时执行这两个操作。思路很简单:用 3D 向量 [x y 1]T 表示点 (x, y),并使用 3 × 3 形式的矩阵

image.png

固定的第三行用于将 1 复制到转换后的向量中,因此所有向量的最后一个位置都是 1,前两行将 x' 和 y' 计算为 x、y 和 1 的线性组合:

image.png

单个矩阵实现了一个线性变换,然后是一个平移!

这种变换称为仿射变换,这种通过添加额外维度实现仿射变换的方式称为齐次坐标(Roberts,1965;Riesenfeld,1981;Penna & Patterson,1986)。齐次坐标不仅清理了变换的代码,而且这种方案还使如何组合两个仿射变换变得一目了然:只需将矩阵相乘。

当我们需要转换不应该是位置的向量时,就会出现这种新形式的问题——它们表示方向或位置之间的偏移量。当我们平移一个物体时,表示方向或偏移的向量不应该改变。幸运的是,我们可以通过将第三个坐标设置为零来解决这个问题:

image.png

这解释了“同质”这个名称:位置和方向的平移、旋转和缩放都适合单个系统。

如果在矩阵的左上角 2 × 2 项中有缩放/旋转变换,它将应用于向量,但平移仍与零相乘并被忽略。此外,零被复制到变换后的向量中,因此方向向量在变换后仍然是方向向量。这正是我们希望向量的行为,因此它们可以平滑地融入系统:额外的(第三个)坐标将是 1或 0 取决于我们是在编码位置还是方向。我们实际上确实需要存储齐次坐标,以便我们可以区分位置和其他向量。例如,

image.png

稍后,当我们进行透视观察时,我们将看到允许齐次坐标取除 1 或 0 以外的值是很有用的。

齐次坐标几乎普遍用于表示图形系统中的变换。特别是,齐次坐标是在图形硬件中实现的渲染器的设计和操作的基础。我们将在第 7 章中看到,齐次坐标还可以很容易地透视场景,这是它们受欢迎的另一个原因。

齐次坐标可以被认为只是一种处理翻译簿记的巧妙方法,但也有不同的几何解释。

齐次坐标在计算机视觉中也无处不在。

关键的观察结果是,当我们基于 z 坐标进行 3D 剪切时,我们会得到以下变换:

image.png

请注意,这几乎具有我们在 x 和 y 中用于 2D 平移的形式,但在 2D 中没有意义的 z 悬空。现在是关键决定:我们将坐标 z = 1 添加到所有 2D 位置。这给了我们

image.png

通过将 (z = 1) 坐标与所有 2D 点相关联,我们现在可以将平移编码为矩阵形式。例如,要首先在 2D 中平移 (xt, yt),然后旋转角度 φ,我们将使用矩阵

image.png

请注意,2D 旋转矩阵现在是 3 × 3,“平移槽”中有零。

使用这种形式,它使用沿 z = 1 的剪切来编码平移,我们可以将任意数量的 2D 剪切、2D 旋转和 2D 平移表示为一个复合 3D 矩阵。该矩阵的底行将始终为 (0, 0, 1),因此我们实际上不必存储它。当我们将两个矩阵相乘时,我们只需要记住它就在那里。

在 3D 中,同样的技术也有效:我们可以添加第四个坐标,一个齐次坐标,然后我们有平移:

image.png

同样,对于方向向量,第四个坐标为零,因此该向量不受平移的影响。

示例(窗口转换)。通常在图形中,我们需要创建一个变换矩阵,它将矩形 [xl, xh] × [yl, yh] 中的点转换为矩形 [x'l, x'h] × [y'l, y'h]。这可以通过单个比例完成并按顺序翻译。但是,从三个操作的序列中创建转换更为直观(图 6.18):

image.png

  1. 将点 (xl, yl) 移动到原点。
  2. 将矩形缩放到与目标矩形相同的大小。
  3. 将原点移动到点 (x'l, y'l)。

记住首先应用右手矩阵,我们可以写:

image.png

对一些读者来说,生成的矩阵具有它的形式可能并不奇怪,但是三个矩阵的构造过程毫无疑问地表明了结果的正确性。

可以使用一个完全类似的结构来定义一个 3D 窗口变换,它映射了框 image.png到框 image.png

image.png

有趣的是,如果我们将由比例、剪切和旋转组成的任意矩阵与简单的平移相乘(平移次之),我们得到

image.png

因此,我们可以查看任何矩阵并将其视为缩放/旋转部分和平移部分,因为这些组件很好地相互分离。

一类重要的变换是刚体变换。它们仅由平移和旋转组成,因此它们没有对象的拉伸或收缩。这样的变换将对上面的 aij 进行纯旋转。