Category:Higher Mathematics & Computer Graphics Application
正文
6 转换矩阵
线性代数的机制可用于表达在 3D 场景中排列对象、使用相机查看它们并将它们放到屏幕上所需的许多操作。像旋转、平移、缩放和投影这样的几何变换可以用矩阵乘法来完成,本章的主题是用来做这些的变换矩阵。
如果将点表示为与原点的偏移向量,我们将展示一组点如何变换,我们将使用图 6.1 中所示的时钟作为点集的示例。所以把时钟想象成一堆点,它们是向量的末端,它们的尾巴在原点。我们还讨论了这些变换如何在位置(点)、位移向量和表面法线向量上进行不同的操作。
2D 线性变换
我们可以使用 2 × 2 矩阵来改变或变换 2D 向量:
这种接受一个 2 向量并通过简单的矩阵乘法产生另一个 2 向量的运算是一种线性变换。 通过这个简单的公式,我们可以实现各种有用的转换,具体取决于我们在矩阵的条目中放入的内容,这将在以下部分中讨论。出于我们的目的,考虑沿 x 轴移动为水平移动,沿 y 轴移动为垂直移动。
6.1.1 缩放
最基本的转换是沿坐标轴的比例。这种转换可以改变长度和可能的方向:
请注意此矩阵对具有笛卡尔分量 (x, y) 的向量的作用:
因此,只需查看轴对齐比例的矩阵,我们就可以读取两个比例因子。
例子。将 x 和 y 均匀地缩小两倍的矩阵是(图 6.1)
一个在水平方向减半并在垂直方向增加三半的矩阵是(见图 6.2)
6.1.2 剪切
剪者是将东西侧向推动的东西,产生了像您伸手的一张牌一样。底部的卡片放置和卡片移动得更近,它们越接近甲板的顶部。水平和垂直剪切矩阵是
例子。水平剪切的变换使垂直线变为45°线向右倾斜(见图6.3)
一个类似的垂直变换是(见图 6.4)
在这两种情况下,剪切钟的方形轮廓变成平行四边形,剪切钟的圆形面变成椭圆。
事实上,任何矩阵变换下的圆的图像都是椭圆
考虑剪切的另一种方法是仅根据垂直(或水平)轴的旋转。采用垂直轴并将其顺时针倾斜角度 φ 的剪切变换是
类似地,水平轴逆时针旋转角度 φ 的剪切矩阵为
6.1.3 旋转
假设我们要将向量 a 逆时针旋转角度 φ 以得到向量 b(图 6.5)。
如果 a 与 x 轴成 α 角,其长度为
,那么我们知道
因为 b 是 a 的旋转,所以它也有长度 r。因为它从 a 旋转了一个角度 φ,所以 b 与 x 轴形成一个角度 (α φ)。使用三角加法恒等式(第 2.3.3 节):
代入 xa = r cos α 和 ya = r sin α 给出
在矩阵形式中,从 a 到 b 的变换是
例子。将向量旋转 π/4 弧度(45 度)的矩阵是(见图 6.6)
在我们框架中,沿顺时针方向旋转π/6弧度(30度)的矩阵是由-π/6弧度旋转的(见图6.7):
因为旋转矩阵的每一行的范数都是一(sin2 φ cos2 φ = 1),并且行是正交的(cos φ(− sin φ) sin φ cos φ = 0),所以我们看到旋转矩阵是正交矩阵(第 5.2.4 节)。通过查看矩阵,我们可以读出两对正交向量:两列,它们是变换向其发送规范基向量 (1, 0) 和 (0, 1) 的向量;和行,它们是转换发送到规范基向量的向量。
简单地说,Rei = ui 和 Rvi = ui,用于列 ui 和行 vi 的旋转。
6.1.4 反射
我们可以通过使用具有一个负比例因子的比例来反映穿过任一坐标轴的向量(参见图 6.8 和 6.9):
虽然人们可能认为对角线的两个元素都为 -1 的矩阵也是反射,但实际上它只是 π 弧度的旋转。
这种旋转也可以称为“通过原点的反射”。
6.1.5 变换的组合和分解
图形程序对一个对象应用多个变换是很常见的。例如,我们可能想先应用一个比例 S,然后是一个旋转 R。这将在 2D 矢量 v1 上分两步完成:
另一种写法是
因为矩阵乘法是结合的,我们也可以写成
换句话说,我们可以使用相同大小的单个矩阵来表示将向量按顺序转换为两个矩阵的效果,我们可以通过将两个矩阵相乘来计算:M = RS(图 6.10)。
记住这些变换首先从右侧应用是非常重要的。所以矩阵 M = RS 首先应用 S,然后应用 R。
例子: 假设我们想在垂直方向缩放二分之一,然后旋转 π/4 弧度(45 度)。结果矩阵是
重要的是要始终记住矩阵乘法不是可交换的。 所以转换的顺序很重要。在这个例子中,先旋转,然后缩放,会产生一个不同的矩阵(见图 6.11):
例子: 使用我们提供的比例矩阵,非均匀缩放只能沿坐标轴进行。如果我们想将时钟沿其对角线之一拉伸 50%,以便 8:00 到 1:00 向西北移动,2:00 到 7:00 向东南移动,我们可以结合使用旋转矩阵一个轴对齐的缩放矩阵来得到我们想要的结果。这个想法是使用旋转将缩放轴与坐标轴对齐,然后沿着该轴缩放,然后旋转回来。在我们的示例中,缩放轴是正方形的“反斜杠”对角线,我们可以使其平行于 x 轴旋转 45°。将这些操作放在一起,完整的转换是
在数学符号中,这可以写成 RSRT 。三个矩阵相乘的结果是
请记住从右到左阅读转换。
这个矩阵是对称的并非巧合——尝试将乘积转置规则应用于公式 RSRT。
从旋转和缩放变换构建变换实际上适用于任何线性变换,这一事实导致了一种强大的思考这些变换的方式,如下一节所述。
6.1.6 变换分解
有时有必要“撤消”转换的组合,将转换分解为更简单的部分。例如,将变换呈现给用户以根据单独的旋转和比例因子进行操作通常很有用,但变换可能在内部简单地表示为矩阵,旋转和比例已经混合在一起。如果可以通过计算将矩阵分解为所需的部分,调整这些部分,然后通过再次将这些部分相乘来重新组合矩阵,则可以实现这种操作。
事实证明,无论矩阵中的条目如何,这种分解或因式分解都是可能的——这一事实提供了一种富有成效的方式来思考变换以及它们对由它们变换的几何体所做的事情。
对称特征值分解
让我们从对称矩阵开始。回想一下 5.4 节,对称矩阵总是可以使用特征值分解分解为形式的乘积
其中r是正交矩阵,s是对角线矩阵;我们将以名称为v1和v2称为r(特征向量)的列,并将其称为s(特征值)的对角线条目,名称为λ1和λ2。
在几何术语中,我们现在可以将 R 视为旋转,将 S 视为比例,因此这只是一个多步几何变换(图 6.13):
- 将 v1 和 v2 旋转到 x 轴和 y 轴(通过 RT 进行变换)。
- 在 x 和 y 中按 (λ1, λ2) 缩放(S 的变换)。
- 将 x 轴和 y 轴旋转回 v1 和 v2(R 的变换)。
如果您想计数尺寸:对称的2×2矩阵具有3个自由度,并且特征值分解将它们重写为旋转角度和两个比例因子。
从这三个转换在一起的效果下,我们可以看到它们具有沿一对轴的不均匀尺度的效果。与轴对齐的刻度一样,轴是垂直的,但它们不是坐标轴。相反,它们是A的特征向量。这告诉我们一些关于对称矩阵的含义:对称矩阵只是缩放操作 - 尽管可能是不均匀的,并且不均匀的矩阵。
例子: 从第5.4节中回想一下示例:
然后,根据其特征值分解,上面的矩阵从三点钟方向(x 轴)沿逆时针方向 31.7° 缩放。这是下午 2 点之前的触摸。如图 6.14 所示。
我们还可以反转对角化过程;以 (λ1, λ2) 缩放,第一个缩放方向与 x 轴顺时针方向成角度 φ,我们有
我们应该记住这是一个对称矩阵,因为我们知道它必须是真的,因为我们是从对称特征值分解中构造它的。
奇异值分解
非对称矩阵也可以进行非常相似的分解:它是奇异值分解(SVD),也在第 5.4.1 节中讨论。不同之处在于对角矩阵两侧的矩阵不再相同:
代替单旋转 R 的两个正交矩阵称为 U 和 V,它们的列分别称为 ui(左奇异向量)和 vi(右奇异向量)。在这种情况下,S 的对角线条目称为奇异值而不是特征值。几何解释与对称特征值分解的解释非常相似(图 6.15):
1.将V1和V2旋转到X和Y轴(VT的转换)。
2.(σ1,σ2)在x和y中缩放(s的转换)。
3.将X-和Y轴旋转为U1和U2(U的转换)。
主要区别在于单个旋转和两个不同的正交矩阵之间。这种差异导致了另一个不太重要的差异。因为 SVD 在两侧有不同的奇异向量,所以不需要负奇异值:我们总是可以翻转奇异值的符号,反转相关奇异向量之一的方向,并最终得到相同的变换再次。出于这个原因,SVD 总是产生一个包含所有正项的对角矩阵,但矩阵 U 和 V 不能保证是旋转的——它们也可能包括反射。在像图形这样的几何应用程序中,这是一个不便,但很小的一个:通过检查行列式很容易区分旋转和反射,行列式是 1 表示旋转,-1 表示反射,如果需要旋转,奇异值之一可以取反,从而产生一个旋转-缩放-旋转序列,其中反射随刻度滚动,而不是随旋转之一滚动。
例子: 第5.4.1节中使用的示例实际上是剪切矩阵(图6.12):
SVD存在的直接结果是,我们看到的所有2D转换矩阵都可以由旋转矩阵和尺度矩阵制成。
剪切矩阵是一个方便的,但是表达转换并不是必需的
对于尺寸计数器:一般的2×2矩阵具有4度的自由度,SVD将其重写为两个旋转角度和两个比例因子。还需要另外一点来跟踪反射,但这并没有增加维度。
总之,每个矩阵都可以通过 SVD 分解为一个旋转乘以一个尺度乘以另一个旋转。只有对称矩阵才能通过特征值对角化分解为旋转乘以尺度乘以逆旋转,并且这样的矩阵是任意方向上的简单尺度。通过稍微复杂的代数操作,对称矩阵的 SVD 将产生与特征值分解相同的三重乘积。
旋转的 Paeth 分解
另一种分解使用剪切来表示非零旋转(Paeth,1990)。
以下身份允许这样做:
例如,π/4(45度)的旋转为(见图6.16)
这种特殊的变换对于光栅旋转很有用,因为剪切是一种非常有效的图像光栅操作;它引入了一些锯齿,但不会留下任何漏洞。关键的观察是,如果我们采用光栅位置 (i, j) 并对其应用水平剪切,我们得到
如果我们将 sj 四舍五入到最接近的整数,这相当于获取图像中的每一行并将其横向移动一定量 - 每行的量不同。因为它在一行内是相同的位移,这允许我们在结果图像中没有间隙地旋转。类似的动作适用于垂直剪切。因此,我们可以轻松实现简单的光栅旋转。