《3D 数学基础:图形与游戏开发》九、矩阵的更多知识

246 阅读9分钟

9.1 矩阵的行列式

在任意方阵中都存在一个标量,称作该方阵的行列式

9.1.1 线性运算法则

方阵 M 的行列式记作 |M| 或 “det M”。先从 2x2、3x3 矩阵开始

下面的示意图能帮助起记忆上面公式。将主对角线和反对角线上的元素各自相乘,然后用主对角线元素的积减去反对角线元素的积

3x3 阶矩阵的行列式

若将 3x3 阶矩阵的行解释为 3 个向量,那么矩阵的行列式等于这些向量的所谓“三元组织”

假设矩阵 M 有 r 行,c 列。记法 M(ij)M^{(ij)} 表示从 M 中除去第 i 行和第 j 列后剩下的矩阵。显然,该矩阵有 r-1 行,c-1列。矩阵 M(ij)M^{(ij)} 称作 M 的余子式。考虑 3x3 阶矩阵M:

对方阵 M,给定行、列元素的代数余子式等于相应余子式的有符号行列式

Cij=(1)i+jM(ij)C_{ij}=(-1)^{i+j}\left|M^{(ij)}\right|

如上,用记法 CijC_{ij} 表示 M 的第i行,第j列元素的代数余子式。注意余子式是一个矩阵,而代数余子式是一个标量。代数余子式计算式中的项 (1)(i+j)(-1)^{(i+j)} 有以棋盘形式使矩阵的代数余子式每隔一个为负的效果:

余子式和代数余子式可以用来计算任意 n 维方阵的行列式,也可以用来计算矩阵的逆

(较复杂的部分先省略掉)

行列式的一些重要性质:

9.1.2 几何解释

2D 中,行列式等于以基向量为两边的平等四边形的有符号面积。在 7.2.2 节中,我们曾介绍过如何利用平行四边形形象化显示坐标空间的变换

3D 中,行列式等于以变换后的基向量为三边的平行六面体的有符号体积

行列式和矩阵变换导致的尺寸改变相关

  • 行列式的绝对值和面积(2D)、体积(3D)的改变相关
  • 行列式的符号说明了变换矩阵是否包含镜像或投影

矩阵的行列式还能对矩阵所代表的变换进行分类

  • 若为零,那么矩阵包含投影
  • 若为负,那么矩阵包含镜像

9.2 矩阵的逆

这个运算只能用于方阵

9.2.1 运算法则

方阵 M 的逆,记作 M1M^{-1},也是一个矩阵,当 M 与 M1M^{-1} 相乘时,结果是单位矩阵

M(M1)=M1M=IM(M^{-1})=M^{-1}M=I

并非所有矩阵都有逆,若一个矩阵有逆,那么称它为可逆的或非奇异的,否则就称它为不可逆的或奇异

奇异矩阵的行列式为零,非奇异的行列式不为零,所以检测行列式的值是判断矩阵是否可逆的有效方法

M 的“标准伴随矩阵”记作“adj M”,定义为 M 的代数余子式矩阵的转置矩阵。下面一个例子

M 的标准伴随矩阵是代数余子式矩阵的转置

有了它就能计算矩阵的逆

矩阵的逆的重要性质:

9.2.2 几何解释

矩阵的逆在几何上非常有用,它使得我们可以计算变换的“反向”变换——能“撤销”原变换的变换

9.3 正交矩阵

9.3.1 运算法则

若方阵 M 是正交的,则当且仅当 M 与它转置 MTM^T 的乘积等于单位矩阵 II

M正交MMT=IM 正交\Leftrightarrow MM^T = I

又因为 MM1=IMM^{-1}=I,所以若矩阵是正交的,那么它的转置等于它的逆

M正交MT=M1M 正交\Leftrightarrow M^T = M^{-1}

旋转和镜像矩阵是正交的,想求它们的逆矩阵的话,直接使用它们的转置矩阵即可

9.3.2 几何解释

正交矩阵对我们非常有用,但我们怎样去检测矩阵是否正交呢?为了做到这一点,我们从正交矩阵的定义开始

得出 9 个等式,若 M 是正交的,它们必须全部成立

解释:

  • 第一,当且仅当一个向量是单位向量时,它与它自身的点积结果是 1。因此,仅当 r1r_1r2r_2r3r_3 是单位向量时,第1、4、9 式才能成立
  • 第二,回忆 5.10.2 节,当且仅当两个向量互相垂直时,它们的点积为零。因此,仅当r1r_1r2r_2r3r_3 互相垂直时其他等式才成立

所以,若一个矩阵是正交的,它必须满足下列条件:

  • 矩阵每一行都是单位向量
  • 矩阵的所有行互相垂直

对矩阵的列也能得到类似的条件。这可推出结论:若 M 是正交的,则 MTM^T 也是正交的

计算逆矩阵时,仅在预先知道矩阵是正交的情况下才能利用它的优点。否则先检查正交性花的时间,跟直接求逆是差不多的。若矩阵不是正交的,那么这种检查完全是浪费时间(不如直接就求逆)

线性代数中,若一组向量互相垂直,这组向量就被认为是正交基,它不要求向量都是单位向量。若它们都是单位向量,则称它们为标准正交基

  • 正交矩阵的行或列向量都是指标准正交基向量
  • 由一组正交向量构造的矩阵并不一定是正交矩阵

9.3.3 矩阵正交化

有时可能会遇到一些略微违反了正交性的矩阵,需要将它们正交化,得到尽可能跟原矩阵相同的正交矩阵

构造一组正交基向量的标准算法是施密特正交化。它的基本思想是,对每一行,从中减去它平行于已处理过的行的部分,最后得到垂直向量

结果 r1{r_1}^{'}r2{r_2}^{'}r3{r_3}^{'} 互相垂直了,它们是一组正交基。它们不一定是单位向量,构造正交矩阵需要使用标准正交基,所以必须标准化这些向量。若一开始就进行标准化,而不是在第 2 步中做,就能避免所有除法了

(改进算法略)

9.4 4x4 齐次矩阵

4D 向量和 4x4 矩阵不过是对 3D 运算的一种方便记法而已

9.4.1 4D 齐次空间

我们先看一下 2D 中的齐次坐标,它的形式是 (x, y, w)。想象 3D 中 w=1 处的标准 2D 平面,实际的 2D 点 (x, y) 用齐次坐标表示为 (x, y, 1),对于那些不在 w=1 平面上的点,则将它们投影到 w=1 平面上。所以齐次坐标 (x, y, w) 映射的实际 2D 点为 (x/w, y/w)

下图中,齐次坐标 (2.5, 2.0, 2.5) 映射的实际点为 (1.0, 0.8)

4D 坐标的基本思想相同。实际的 3D 点能被认为是 4D 中 w=1 “平面”上。4D 点的形式为 (x, y, z, w),将 4D 点投影到这个“平面”上得到相应实际 3D 点 (x/w, y/w, z/w)

9.4.2 4x4 平移矩阵

3x3 变换矩阵表示的是线性变换,但不包含平移。4x4 矩阵恰好提供了一种数学上的“技巧”,使我们能做到

设 R 为旋转矩阵,T 为“平移”矩阵

将向量 v 先旋转再平移,新的向量 vv^{'} 计算如下(用的是行向量)

v=vRTv^{'}=vRT

两个矩阵可连接成一个

M=RTv=vRT=v(RT)=vMM=RT \\ v^{'}=vRT =v(RT)=vM

观察 M 的内容

M 的上边 3x3 部分是旋转部分,最下一行是平移部分,最右一列是 [0,0,0,1]T[0,0,0,1]^T。这就能将任意 4x4 矩阵分解为线性变换部分和平移部分。将平移向量记作 t,则 M 可简写为

M=[R0t1]M=\begin{bmatrix}R & 0 \\ t & 1 \end{bmatrix}

这就是我们要使用 4x4 矩阵的原因之一——它能包含平移信息

接下来看 w=0 所表示的“无穷远点”。它乘以一个由 3x3 变换矩阵扩展成的 4x4 矩阵(不包含平移)

结果仍然是一个无穷远点,形式为 [x', y', z', 0]

那再看看无穷远点乘以一个包含平移的 4x4 矩阵

注意结果跟之前的一样的。换句话说,4D 向量中的 w 分量能够“开关”4x4 矩阵的平移部分。这个现象非常有用,因为有些向量代表“位置”,应用平移,而有些向量只代表“方向”,不应该平移。4D 向量中的 w 分量就可以区分它们,这是我们使用 4D 向量的原因

9.4.3 一般仿射变换

经 4x4 武装后,我们可以构造包含平移在内的一般仿射变换矩阵了。如

  • 绕不通过原点的轴旋转
  • 沿不穿过原点的平面缩放
  • 沿不穿过原点的平面镜象
  • 向不穿过原点的平面正交投影

基本思想是将变换的“中心点”平移到原点,接着进行线性变换,然后再将“中心点”平移回原来的位置。开始使用平移矩阵 T 将点 P 移到原点,接着使用 R 进行线性变换,最后使用 T1T^-1 移回原位

M=TRT1M=TRT^{-1}

可以看出,仿射变换中增加的平移部分仅仅改变了 4x4 矩阵的最后一行,并没有影响到上面所包含的线性变换的 3x3 部分

9.4.4 透视投影

我们已学过一种投影——平行投影。将 3D 空间投影到 2D 平面上,该平面称作投影平面,使用的是正交投影。正交投影也被称作平行投影,因为投影线都是平行的

3D 中的透视投影仍然是投影到 2D 平面上,但是投影线不再平行,它们相交于一点,这个点称作投影中心

因投影中心在投影平面前,投影线到达平面前已经相交,所以投影平面上的图像是翻转的。当物体远离投影中心时,正交投影保持不变,但透视投影变小了。这是一种非常重要的视觉现象,称作:透视缩略

9.4.5 小孔成像

(小孔成像原理部分略)

计算出任意点 p 通过小孔投影到投影平面上的坐标 p'

所有投影点的 z 值都是相同的: -d。因此,点 p 通过原点向平面 z=-d 投影的结果

在实际应用中,负号会带来不必要的复杂性,所以将投影平面移到投影中心的前面

虽然在实际的小孔成像中这是不可能实现的,但在计算机数学世界中则没有问题,烦人的负号消失了

9.4.6 使用 4x4 矩阵进行透视投影

这是我们使用 4D 向量和 4x4 矩阵的另一个原因——实现透视投影

这就得到了一个 4x4 的投影矩阵。需要注意: