第1章:基础数学知识回顾
各位同学好,我是这门课的主讲人。在正式开始讲坐标变换之前,我想先带大家回顾一下那些最基础的数学工具。说实话,我刚开始学图形学的时候,总觉得这些数学概念太抽象,不知道学了有什么用。直到后来做项目时被坑了几次,才明白——这些基础不牢,后面真的会摔得很惨。
这一章我们不讲复杂公式,只聊几个核心概念:向量、点积、叉积、矩阵乘法、单位矩阵和逆矩阵。嗯,都是老朋友了,但咱们换个角度重新认识一下它们。
1.1 向量:坐标变换的基石
向量是什么?说白了,就是一个有方向、有长度的量。在二维空间里,我们用 (x, y) 表示;三维空间里用 (x, y, z) 表示。
我个人习惯把向量想象成一根箭头——从原点指向某个位置。比如向量 v = (3, 4),就是从原点指向 (3, 4) 这个点。
向量的长度(模):|v| = sqrt(x² + y² + z²)
单位向量:长度为1的向量,用 v / |v| 得到。
我在项目中遇到过一个问题:做相机旋转时,忘记把方向向量归一化,结果画面越转越歪。后来排查了半天才发现是向量长度不对。所以记住:涉及方向的地方,先归一化再说。
1.2 点积:衡量两个向量的"相似度"
点积的公式很简单:
a · b = a₁b₁ + a₂b₂ + a₃b₃
但它的几何意义更有意思:a · b = |a| |b| cosθ,其中 θ 是两个向量的夹角。
你想想看,如果两个向量方向相同,cosθ = 1,点积最大;如果垂直,cosθ = 0,点积为0;如果相反,cosθ = -1,点积为负。
实用技巧:点积可以用来判断两个向量是否大致同向。比如在光照计算中,用光线方向与法线的点积来判断表面是否被照亮。
我曾经在做一个AR项目时,需要判断用户是否正对着某个标记物。用点积算一下相机朝向和标记物方向,大于0.8就算对准了——简单又高效。
1.3 叉积:找到垂直方向
叉积只适用于三维向量。它的结果是一个新向量,垂直于原来的两个向量。
a × b = (a₂b₃ - a₃b₂, a₃b₁ - a₁b₃, a₁b₂ - a₂b₁)
叉积的长度等于 |a| |b| sinθ,也就是两个向量围成的平行四边形面积。
注意:叉积不满足交换律!a × b = -(b × a)。方向由右手定则决定。
我曾经在写骨骼动画时,把叉积顺序搞反了,结果角色的手臂直接扭到了背后……调试了整整一个下午。
叉积最常见的用途是:已知两个不共线的向量,求它们的法向量。比如在三维建模中,用三角形的两条边做叉积,就能得到该面的法线方向。
1.4 矩阵乘法:变换的"搬运工"
矩阵乘法是坐标变换的核心操作。一个点经过旋转、缩放、平移,本质上就是用一个矩阵去乘这个点的坐标向量。
规则很简单:左矩阵的行 × 右矩阵的列。
假设 A 是 3×3 矩阵,B 是 3×1 向量:
C[i] = Σ A[i][j] * B[j] (j从0到2)
关键点:矩阵乘法不满足交换律!AB ≠ BA。变换的顺序很重要。
先旋转再平移 ≠ 先平移再旋转。这个坑我踩过不止一次。
我建议你在写代码时,把变换矩阵的乘法顺序写在注释里,比如:// 先旋转,再平移:M = T * R。这样半年后回来看代码,还能记得当初的逻辑。
1.5 单位矩阵与逆矩阵
单位矩阵 I:对角线全是1,其余全是0。任何矩阵乘以单位矩阵,结果不变。就像数字1在乘法中的作用。
I₃ = [1 0 0]
[0 1 0]
[0 0 1]
逆矩阵 A⁻¹:满足 A * A⁻¹ = I。它的作用是"撤销"变换。比如你把一个物体旋转了30度,用逆矩阵就能把它转回去。
实用场景:在相机变换中,我们经常需要把世界坐标转换到相机坐标。这个转换矩阵的逆矩阵,就是相机在世界空间中的位置和朝向。
计算逆矩阵的方法有很多,比如伴随矩阵法、高斯消元法。但在实际项目中,我建议直接用现成的数学库(如 numpy、glm)来算。手写逆矩阵?除非你在写教学代码,否则别自找麻烦。
注意:不是所有矩阵都有逆矩阵。行列式为0的矩阵(奇异矩阵)不可逆。比如你把一个三维物体压扁成一个平面,这个变换矩阵就没有逆矩阵——因为信息丢失了,无法恢复。
本章知识体系
下面我用一张图来总结本章的核心逻辑:
小结
这一章我们回顾了六个基础概念。说实话,这些内容看起来简单,但真正用好它们需要大量实践。我建议你打开 Python 或 NumPy,亲手算几个例子:
- 定义两个向量,算点积和叉积
- 构造一个旋转矩阵,乘一个点,看看结果
- 算一下旋转矩阵的逆矩阵,验证它是不是真的能把点转回去
嗯,动手做一遍,比看十遍公式都管用。下一章我们就要开始真正的坐标变换了——从二维到三维,从旋转到平移,一步步来。
可可精品资料库