第 5 章 矩阵与线性变换 (Matrices and Linear Transformations)

      +

      核心结论

      • 旋转 (rotation):保持原点与距离;手性约定下"正方向"由对应手定则给出;2D 旋转一个角度参数、3D 旋转需要轴 + 角度。

      • 缩放 (scale):沿卡迪尔轴缩放是对角矩阵;反射是某轴缩放因子为负;非均匀缩放使原本正交基向量夹角改变。

      • 正交投影 (orthographic projection):把维度降一阶(3D → 2D);投影方向垂直于投影平面;丢弃平行于投影方向的分量。

      • 反射 (reflection):沿轴 / 平面的镜像;本质是某轴 -1 缩放;行列式恒为 -1。

      • 剪切 (shearing):把矩形变成平行四边形;保持面积(行列式 = 1)但改变角度;italic / skew 文字效果的核心。

      • 变换组合 = 矩阵乘法;顺序敏感("先发生的事写在右边");可通过 §4.2 几何方法验证(看基向量去哪了)。

      • 变换的分类树:线性 → 仿射(含平移的推广)→ 可逆(行列式 ≠ 0)→ 保角 → 正交(保长保角)→ 刚体(仅平移 + 旋转);每层都是上一层的子集。

      本章主旨

      本章用第 4 章"行 = 变换后基向量"的工具,逐个推导 5 类基本线性变换的矩阵:旋转 / 缩放 / 投影 / 反射 / 剪切。把每一类看成"基向量目标"的设定——读者掌握"如何用基向量构造任意变换矩阵"的方法论。第 6 章升级到 4×4 齐次矩阵后,平移加入变换树。本章中段给出变换组合的规则(矩阵乘法),末段给出变换分类树(线性 → 仿射 → …​ → 刚体)。

      一、核心概念

      本章围绕 7 个核心概念展开:从 5 类基本线性变换出发(旋转 / 缩放 / 投影 / 反射 / 剪切),加上变换组合规则(矩阵乘法),最后给出变换分类树。

      概念 定义 + 重要性 实现提示

      旋转 (rotation)

      保持原点与距离不变的角度移动。2D 一个参数 θ、3D 需要轴 + 角度。手性决定正方向(左手顺时针 / 右手逆时针)。绕任意轴的旋转矩阵可分解为"平行分量不动 + 垂直分量在垂直平面内做 2D 旋转"。

      §5.1.1 / §5.1.2 / §5.1.3;库函数 rotate(axis, angle) 直接给出。GLM 提供 glm::rotate(M, θ, axis)

      缩放 (scale)

      沿某个轴拉长 / 缩短。沿卡迪尔轴 = 对角矩阵;对角元素为缩放因子。负因子 = 反射。

      §5.2.1;均匀缩放(所有轴同因子)保持形状、不均匀缩放改变形状。沿任意方向缩放要构造投影 + 缩放 + 反投影矩阵。

      正交投影 (orthographic projection)

      把维度降一阶(3D → 2D)。投影方向垂直于投影平面。结果是"丢弃平行于投影方向的分量"。最常用:把 3D 投影到 xy 平面(去掉 z)。

      §5.3;与"透视投影"(perspective)相对——透视投影保留深度信息,正交投影丢弃。CAD / 工程制图常用正交投影。

      反射 (reflection)

      沿某个轴 / 平面的镜像。行列式恒为 -1。本质 = 沿某轴 -1 缩放(其余方向 +1)。

      §5.4;与旋转的区别:反射产生"手性反转"(左右颠倒),旋转保持手性。镜中物体是反射,不能用旋转重合。

      剪切 (shearing)

      把矩形变平行四边形,保持面积(行列式 = 1)但改变角度。常见用途:italic 字体、3D 投影中的 z 倾斜、shadow skew。

      §5.5;与投影的区别:投影是"丢维度",剪切是"维度不变但角度变"。

      变换组合

      多个原变换复合 = 矩阵乘法(顺序敏感)。先发生的事写在右边(行向量约定)。结合律保证可以链式复合。

      §5.6;常见模式:M = T * R * S(缩放 → 旋转 → 平移)。验证方法:用 §4.2 "行 = 基向量"工具逐项检查。

      变换分类树

      6 类由宽到窄:linear(保直保平行,保原点) ⊂ affine(线性 + 平移) ⊂ invertible(det ≠ 0) ⊂ angle-preserving ⊂ orthogonal(保长保角,列正交) ⊂ rigid-body(仅平移 + 旋转)。每层是上一层的真子集。

      §5.7;查表 §5.7.7。识别变换类别可快速判断其性质(如"行列式 < 0 ⇒ 不可保角 ⇒ 含反射")。

      二、详细笔记

      2.1 旋转 (Rotation)

      What:保持原点与距离的角度移动。2D 一个参数 θ(绕原点),3D 需要 + 角度(绕该轴旋转)。

      Why:3D 图形 90% 的"动画 / 朝向"问题都涉及旋转;旋转矩阵是后续四元数 / 欧拉角(第 8 章)的代数基础。

      How

      2D 旋转(§5.1.1)——绕原点逆时针 θ:

      \[\mathbf{R}(\theta) = \begin{bmatrix} \cos\theta & \sin\theta \\ -\sin\theta & \cos\theta \end{bmatrix}\]

      推导:把基向量 +x+y 旋转 θ 后坐标 = (cosθ, sinθ)(-sinθ, cosθ),写进矩阵行。

      3D 旋转——绕卡迪尔轴(§5.1.2):

      \[\mathbf{R}_x(\theta) = \begin{bmatrix} 1 & 0 & 0 \\ 0 & \cos\theta & \sin\theta \\ 0 & -\sin\theta & \cos\theta \end{bmatrix},\quad \mathbf{R}_y(\theta) = \begin{bmatrix} \cos\theta & 0 & -\sin\theta \\ 0 & 1 & 0 \\ \sin\theta & 0 & \cos\theta \end{bmatrix},\quad \mathbf{R}_z(\theta) = \begin{bmatrix} \cos\theta & \sin\theta & 0 \\ -\sin\theta & \cos\theta & 0 \\ 0 & 0 & 1 \end{bmatrix}\]

      约定:绕哪条轴旋转,哪条轴对应行不变(行向量约定下,行 = 基向量)。

      3D 旋转——绕任意轴(§5.1.3):

      设单位轴 、角度 θ。把向量 v 分解为 v∥ = (v · n̂) n̂(平行分量)与 v⊥ = v - v∥(垂直分量);绕 n̂ 旋转等价于"v∥ 不动 + v⊥ 在垂直平面内做 2D 旋转"。旋转后:

      \[\mathbf{v}' = \mathbf{v}_{\parallel} + \cos\theta \mathbf{v}_{\perp} + \sin\theta (\hat{\mathbf{n}} \times \mathbf{v}_{\perp})\]

      展开为矩阵(Rodrigues 旋转公式):

      \[\mathbf{R}(\hat{\mathbf{n}}, \theta) = \begin{bmatrix} c + n_x^2(1-c) & n_x n_y(1-c) + n_z s & n_x n_z(1-c) - n_y s \\ n_x n_y(1-c) - n_z s & c + n_y^2(1-c) & n_y n_z(1-c) + n_x s \\ n_x n_z(1-c) + n_y s & n_y n_z(1-c) - n_x s & c + n_z^2(1-c) \end{bmatrix}\]

      其中 c = cosθ, s = sinθ

      手性差异在旋转矩阵中的体现

      绕 y 轴旋转矩阵中 R_y 第 1 行第 3 列是 -sinθ,与 R_x, R_z 不同——因为本书左手系下 +y 指向"上",绕 +y 旋转时基向量 "跨过" xz 平面时符号与其他轴相反。该差异仅来自手性约定;跨引擎时若矩阵出现此差异,应首先检查坐标手性。

      When:所有朝向动画(角色 / 相机 / 光源);物理引擎中的刚体朝向更新。

      ExampleR_z(90°)+x 转到 +yR_z(-90°)+x 转到 -y

      2.2 缩放 (Scale)

      What:沿某个轴拉长 / 缩短。沿卡迪尔轴 = 对角矩阵;对角元素为缩放因子。

      Why:建模(物体大小调整)、动画(弹性缩放)、UI(屏幕适配)、shader 调试(暂时缩到 0 隐藏某组件)。

      How

      沿卡迪尔轴缩放(§5.2.1):

      \[\mathbf{S}(k_x, k_y, k_z) = \begin{bmatrix} k_x & 0 & 0 \\ 0 & k_y & 0 \\ 0 & 0 & k_z \end{bmatrix}\]

      几何解释:行向量约定下,矩阵第 1 行 +x(kx, 0, 0);第 2 行 +y(0, ky, 0);第 3 行 +z(0, 0, kz)

      沿任意方向缩放(§5.2.2):构造 投影 → 缩放 → 反投影 复合矩阵 M = P⁻¹ S P,其中 P 把任意方向对齐到某轴上。

      负缩放 = 反射(§5.4):某因子 < 0 时该方向翻转。

      行列式判断"反射存在"

      缩放矩阵行列式 = kx · ky · kz。若 ≥ 0 ⇒ 无反射(保手性);若 < 0 ⇒ 含反射(手性翻转)。这是 §5.7 变换分类的快捷判断之一。

      When:模型导入时的单位统一(FBX 常用 cm,游戏常用 m);UI 缩放;shader 调试。

      ExampleS(2, 1, 1) 把所有 x 坐标乘 2,物体在 x 方向被拉伸 2 倍;S(1, -1, 1) = 沿 xz 平面反射(左右颠倒)。

      2.3 正交投影 (Orthographic Projection)

      What:把维度降一阶(3D → 2D)。投影方向垂直于投影平面,结果是"丢弃平行于投影方向的分量"。

      Why:3D → 2D 屏幕渲染的第一阶段;CAD / 工程制图保留尺寸;与"透视投影"(保留深度)相对。

      How

      投影到卡迪尔平面(§5.3.1):

      • 投影到 xy 平面(丢 z):P_xy = [[1, 0, 0], [0, 1, 0], [0, 0, 0]]

      • 投影到 xz 平面(丢 y):P_xz = [[1, 0, 0], [0, 0, 0], [0, 0, 1]]

      • 投影到 yz 平面(丢 x):P_yz = [[0, 0, 0], [0, 1, 0], [0, 0, 1]]

      投影到任意平面(§5.3.2):构造 基变换 → 投影 → 反基变换

      正交投影 vs 透视投影
      • 正交投影:平行线保持平行;近大远小不变;用于工程制图、UI、2D 等距游戏。

      • 透视投影:平行线收敛到消失点;近大远小;用于真实感渲染。 第 10 章详细展开透视投影。

      When:CAD / 工程图;2D 等距游戏渲染;shadow map 第一阶段(深度投影)。

      Example:把 (1, 2, 3) 投影到 xy 平面 = (1, 2, 0);常用于把 3D 鼠标位置投影回 2D 屏幕。

      2.4 反射 (Reflection)

      What:沿某个轴 / 平面的镜像。行列式恒为 -1。本质 = 沿某轴 -1 缩放(其余方向 +1)。

      Why:理解镜像变换是手性翻转的几何来源;镜中物体不可通过旋转重合(数学上证明:反射矩阵行列式为 -1,旋转矩阵行列式为 +1)。

      How

      反射矩阵(沿某个平面 / 轴):

      • 沿 yz 平面(沿 x 翻转):Refl_x = [[-1, 0, 0], [0, 1, 0], [0, 0, 1]](行列式 = -1)

      • 沿 xz 平面:行 [1, -1, 1] 对角。

      • 沿 xy 平面:行 [1, 1, -1] 对角。

      • 沿任意平面反射:构造 基变换 → 反射 → 反基变换

      反射矩阵 vs 旋转矩阵
      • 反射:行列式 = -1;改变手性(左 ↔ 右互换)。

      • 旋转:行列式 = +1;保持手性。

      把右手坐标系下的矩阵直接搬到左手系,会从旋转"变成"反射(或反过来)。

      When:镜子渲染;3D 物理中的"完全弹性碰撞"对称面;shadow plane 的镜像映射。

      ExampleRefl_x(1, 2, 3) 变为 (-1, 2, 3)

      2.5 剪切 (Shearing)

      What:把矩形变平行四边形,保持面积(行列式 = 1)但改变角度。

      Why:italic 字体 / shadow skew / 3D 投影中 z 倾斜 / 图像变形。

      How

      2D 剪切(沿 x 方向斜切,y 影响 x):

      \[\mathbf{H}_x(s) = \begin{bmatrix} 1 & s \\ 0 & 1 \end{bmatrix}\]

      3D 剪切有 6 种组合(每个轴对每个轴的剪切),典型如:

      \[\mathbf{H}_{xy}(s) = \begin{bmatrix} 1 & 0 & 0 \\ s & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix}\]

      即 x' = x + s·y;y, z 不变。其它类似。

      行列式判断"是否剪切"

      剪切矩阵行列式 = 1(保持面积 / 体积)。与缩放、旋转不同——剪切既不改变大小也不改变垂直性,但破坏角度。

      When:italic 字体(沿 x 斜切);shadow skew(CSS transform: skew(20deg));3D 投影(错切矩阵模拟透视)。

      ExampleH_x(0.5) 把矩形 (0,0)-(1,1) 变为 (0,0)-(1.5,1)——x 方向被 y "拉"。

      2.6 变换组合 (Combining Transformations)

      What:多个原变换复合 = 矩阵乘法(顺序敏感)。先发生的事写在右边(行向量约定)。

      Why:复合变换是 3D 引擎的核心——一个物体的最终位姿 = 平移 × 旋转 × 缩放;理解顺序才能避免"先缩放后平移"与"先平移后缩放"导致的位置偏移 bug。

      How

      复合规则(§5.6,行向量约定):

      \[\mathbf{v}_{\text{world}} = \mathbf{v}_{\text{local}} \cdot \mathbf{S} \cdot \mathbf{R} \cdot \mathbf{T}\]

      其中 S = 缩放、R = 旋转、T = 平移。

      顺序解读:从 v_local 开始, 应用 S(缩放),再 R(旋转),再 T(平移)——但矩阵写在 边的先发生。

      "先发生的事写在右边"的反直觉

      直觉上"先缩放,再旋转,再平移"对应 T · R · S,但行向量约定下要写 S · R · T(最后一个矩阵最先作用于向量)。这不是 bug,是数学定义的结果。

      When:场景图中所有父子变换链;相机栈;UI 层级变换。

      Example:物体"先缩放为 2 倍再绕原点旋转 45° 再平移 (10, 0, 0)" = T(10,0,0) · R_z(45°) · S(2),应用顺序为 v → S(2) → R_z(45°) → T(10,0,0)。

      2.7 变换分类树 (Classes of Transformations)

      What:6 类由宽到窄的变换——linear ⊂ affine ⊂ invertible ⊂ angle-preserving ⊂ orthogonal ⊂ rigid-body。每层是上一层的真子集。

      Why:识别变换类别可快速判断其性质("行列式 < 0 ⇒ 不可保角 ⇒ 含反射"),避免逐个矩阵检查。

      How

      §5.7 分类树(每层是新约束 + 上层所有约束):

      • linear(线性变换):保直保平行,保原点;3×3 矩阵。

      • affine(仿射变换):linear + 平移;3×3 矩阵不够,需 4×4 齐次(第 6 章)。

      • invertible(可逆变换):行列式 ≠ 0;存在逆变换。

      • angle-preserving(保角变换):保持向量间夹角;行列式 > 0(不允许反射)。

      • orthogonal(正交变换):保长保角;矩阵列正交且单位长。

      • rigid-body(刚体变换):仅平移 + 旋转;保长保角保手性;矩阵 = 平移 × 旋转。

      6 类变换的快速判定
      • linear:3×3 矩阵可表达。

      • affine:第 4 行 / 列 [0, 0, 0, 1](4×4 齐次)。

      • invertible:det ≠ 0。

      • angle-preserving:det > 0。

      • orthogonal:列向量两两正交且单位长(行向量约定下行也满足);矩阵的逆 = 转置。

      • rigid-body:orthogonal + det = +1(无反射)。

      When:判断变换是否可逆、是否保手性、是否可用于物理引擎(rigid-body 用于刚体仿真)。

      ExampleS(2, 1, 1) 是 linear(det = 2);S(2, -1, 1) 是 linear 但 angle-preserving(det < 0 含反射);S(2, 1, 1) + 平移 是 affine;T(1, 0, 0) · R_z(45°) 是 rigid-body。

      三、关键图表

      视觉图表

      图 5-1
      Figure 1. 图 5-1:2D 旋转(绕原点)
      图 5-2
      Figure 2. 图 5-2:绕 x 轴 3D 旋转
      图 5-3
      Figure 3. 图 5-3:绕 y 轴 3D 旋转
      图 5-4
      Figure 4. 图 5-4:绕 z 轴 3D 旋转
      图 5-5
      Figure 5. 图 5-5:绕任意轴旋转(向量分解 + 2D 旋转)
      图 5-6
      Figure 6. 图 5-6:缩放前后对比
      图 5-7
      Figure 7. 图 5-7:任意方向缩放
      图 5-8
      Figure 8. 图 5-8:投影到平面(3D → 2D)
      图 5-9
      Figure 9. 图 5-9:反射

      非可视化条目

      非可视化条目(表 / 算法)
      编号 内容摘要

      式 5-1

      绕任意轴 旋转 θ 的 Rodrigues 旋转公式完整矩阵(含 c = cosθ, s = sinθ)。

      表 5.1

      6 类变换的对比表(线性 / 仿射 / 可逆 / 保角 / 正交 / 刚体),列出每类的判别条件与不变量。

      核心公式对照表

      核心公式对照表
      变换 矩阵(行向量约定)

      2D 旋转

      \(\mathbf{R}(\theta) = \begin{bmatrix} \cos\theta & \sin\theta \\ -\sin\theta & \cos\theta \end{bmatrix}\)

      3D 旋转(绕 x)

      \(\mathbf{R}_x(\theta) = \begin{bmatrix} 1 & 0 & 0 \\ 0 & \cos\theta & \sin\theta \\ 0 & -\sin\theta & \cos\theta \end{bmatrix}\)

      缩放(沿卡迪尔轴)

      \(\mathbf{S}(k_x, k_y, k_z) = \begin{bmatrix} k_x & 0 & 0 \\ 0 & k_y & 0 \\ 0 & 0 & k_z \end{bmatrix}\)

      投影(到 xy 平面)

      \(\mathbf{P}_{xy} = \begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 0 \end{bmatrix}\)

      反射(沿 yz 平面)

      \(\mathbf{R}_x = \begin{bmatrix} -1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix}\)

      剪切(xy 方向)

      \(\mathbf{H}_{xy}(s) = \begin{bmatrix} 1 & 0 & 0 \\ s & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix}\)

      复合(行向量)

      \(\mathbf{v}' = \mathbf{v} \cdot \mathbf{S} \cdot \mathbf{R} \cdot \mathbf{T}\)(先 S、再 R、再 T)

      四、思维导图

      mindmap
        root((第 5 章 矩阵与线性变换))
          旋转
            2D绕原点
            3D卡迪尔轴
            3D任意轴
            Rodrigues公式
          缩放
            沿卡迪尔轴
            任意方向
            负缩放即反射
          正交投影
            3D转2D
            平行线保持
            丢垂直分量
          反射
            沿轴或平面
            行列式-1
            改变手性
          剪切
            矩形变平行四边形
            行列式1
            italic效果
          变换组合
            矩阵乘法
            顺序敏感
            先发生写在右
          变换分类树
            线性
            仿射
            可逆
            保角
            正交
            刚体

      五、重点与易错点

      1. 手性决定旋转方向:左手系绕轴正方向旋转是顺时针,右手系是逆时针;跨引擎搬运旋转矩阵时第一件事是验证手性。

      2. Rodrigues 公式的轴必须是单位向量:非单位向量需要预先 normalize,否则旋转角度会按比例放大。

      3. 缩放矩阵对角元素 = 缩放因子;非对角元素 = 0;负因子 = 反射。

      4. 行列式 = 缩放因子的乘积det = kx · ky · kz;负值说明含反射。

      5. 正交投影 vs 透视投影:正交保持平行线;透视使平行线收敛;CAD 用前者,电影渲染用后者。

      6. 反射改变手性:镜中物体不能通过旋转重合;本质是行列式 -1。

      7. 剪切保持行列式 = 1:与缩放不同,剪切不改变大小,但破坏角度。

      8. 变换组合顺序敏感T · R ≠ R · T;先缩放再平移 ≠ 先平移再缩放;行向量约定下"先发生写在右"。

      9. 6 类变换的真子集关系:rigid-body ⊂ orthogonal ⊂ angle-preserving ⊂ invertible ⊂ affine ⊂ linear;rigid-body 是最严苛的(仅平移 + 旋转)。

      10. 正交矩阵的关键性质M^T · M = I,即 M^T = M^{-1};这是 §6 章正交矩阵逆变换的核心。

      11. 跨章衔接:第 6 章把"线性变换 + 平移"封装为 4×4 齐次矩阵;第 8 章把旋转矩阵推广为欧拉角 / 四元数 / 轴角;第 10 章用本节矩阵组合构造视图矩阵 + 投影矩阵。