01 / 把矩阵看作变换机器
矩阵乘向量会重新组合向量的各个分量。二维矩阵的列可以理解为原坐标轴变换后的位置:第一列是新 X 轴,第二列是新 Y 轴。观察这些基向量,往往比死记元素更容易理解变换。
[ x' ] [ a c ] [ x ]
[ y' ] = [ b d ] [ y ]
[ y' ] = [ b d ] [ y ]
旋转和缩放是线性变换:它们保持原点不动、直线仍是直线。平移会移动原点,因此单靠三维的 3×3 矩阵无法统一表达。
02 / 齐次坐标为何多一个 w
图形学给三维数据增加第四个分量 w,于是可用 4×4 矩阵把平移和线性变换统一。位置通常写作 (x,y,z,1),方向写作 (x,y,z,0)。
位置:p = (x, y, z, 1) → 会受到平移影响
方向:v = (x, y, z, 0) → 不会受到平移影响
方向:v = (x, y, z, 0) → 不会受到平移影响
这正好符合语义:移动物体时,它的位置会改变,但“向上”这个方向不应该因为平移而改变。齐次坐标也为后续透视投影与透视除法提供了条件。
| 变换 | 视觉结果 | 可逆条件 |
|---|---|---|
| 平移 T | 整体移动 | 总是可逆 |
| 旋转 R | 绕轴转动 | 总是可逆 |
| 缩放 S | 改变尺寸 | 各轴缩放不为 0 |
| 投影 P | 形成透视 | 通常不用于还原原场景 |
03 / 矩阵乘法的顺序不能交换
M = T · R · S
p_world = M · p_local
p_world = M · p_local
采用列向量约定时,上式从右向左执行:先缩放,再旋转,最后平移。若先平移再旋转,物体会绕世界原点公转,而非在自身位置自转。
矩阵乘法通常不满足交换律:
A·B ≠ B·A。改变书写顺序,就是改变变换的空间语义。父子层级
场景图中,子物体的世界矩阵通常是 M_parent · M_local。机械臂末端会继承上游关节的变换,正是矩阵组合在层级结构中的直接体现。
04 / 法线为何需要特殊处理
位置用模型矩阵变换,但非均匀缩放会让同样变换后的法线不再垂直于表面。应对模型矩阵左上角的 3×3 部分求逆转置。
N = transpose(inverse(M₃×₃))
n_world = normalize(N · n_local)
n_world = normalize(N · n_local)
如果变换只有旋转或均匀缩放,普通方向变换通常看不出问题;这也是法线错误常潜伏到模型被压扁、拉长后才暴露的原因。
05 / 先确认约定,再调试数字
- 行向量或列向量:决定向量写在矩阵哪一侧,也会影响组合顺序。
- 行主序或列主序:描述内存布局,不应与数学乘法约定混为一谈。
- 左手系或右手系:影响旋转正方向、叉积与观察方向。
- 角度或弧度:多数数学库的三角函数接收弧度。
实用调试法:先只保留一个变换;用单位轴和原点测试矩阵;最后再按顺序逐项乘回。