图形学里的线性代数不是一套独立的计算题,而是后面所有算法共用的语言。位置、方向、颜色、法线、相机朝向,最后都要变成向量;“把物体摆过去”和“把相机转过来”最后都要变成矩阵。
1. 点和向量不是一回事
一个三维向量
v=(vx,vy,vz)T
编码方向和长度。它可以表示位移、速度、光线方向或法线。点表示“在哪里”,向量表示“往哪走多少”。二者都写成三个数,但几何意义不同;这一区别会在齐次坐标里变成点的 w=1、方向的 w=0。
向量长度与归一化分别为
∥v∥=vx2+vy2+vz2,v=∥v∥v.
归一化只保留方向。零向量不能归一化,代码里遇到两点重合、三角形退化或法线长度接近零时,需要先判断再除。
向量加法对应首尾相接,数乘改变长度并可能反转方向。线性组合 au+bv 是插值、坐标展开和重心坐标的基础。
2. 点积:问两个方向有多一致
点积既可按分量计算,也可按夹角理解:
u⋅v=uxvx+uyvy+uzvz=∥u∥∥v∥cosθ.
- 点积为正:夹角小于 90∘,大体同向。
- 点积为零:正交。
- 点积为负:大体反向。
把 u 投影到 v 上:
projvu=v⋅vu⋅vv.
图形学里它反复出现:判断面朝不朝向相机、计算 Lambert 漫反射、把运动分解到相机的前后左右方向。
3. 叉积:得到垂直方向
三维叉积
u×v=uyvz−uzvyuzvx−uxvzuxvy−uyvx
垂直于 u 和 v,长度为
∥u×v∥=∥u∥∥v∥sinθ.
它满足 u×v=−(v×u),所以顶点绕序会决定法线方向。给三角形顶点 A,B,C,常用
n=(B−A)×(C−A)
求法线。交换 B,C 后法线翻转,这正是背面剔除依赖顺时针或逆时针约定的原因。
二维判左右也可看作叉积的 z 分量。对有向边 A→B 和点 P,
EAB(P)=(Bx−Ax)(Py−Ay)−(By−Ay)(Px−Ax).
三个边函数同号,就说明点落在同一绕序的三角形内部或边界上。
4. 正交坐标架怎样搭出来
一个三维正交归一坐标架由三个两两垂直、长度为 1 的向量组成。已知大致的观察方向 a 和“向上”参考 b,可以这样构造:
z=∥a∥a,x=∥b×z∥b×z,y=z×x.
这实际上是一次 Gram–Schmidt 正交化。若 a 与 b 平行,叉积为零,坐标架无法建立;相机的 up 方向因此不能与视线共线。
把 x,y,z 作为矩阵的列,就得到从局部坐标到参考坐标的旋转关系。采用行向量还是列向量、基向量放行还是放列,必须全程统一。
5. 矩阵表示变换
m×n 矩阵可把 n 维向量映射到 m 维,矩阵乘法为
(AB)ij=k∑AikBkj.
最重要的性质是
A(BC)=(AB)C,AB=BA 通常成立.
结合律允许预先合并一串变换;不可交换说明“先旋转再平移”和“先平移再旋转”不是一回事。
单位矩阵 I 不改变向量。逆矩阵满足 A−1A=I,表示撤销一个可逆变换。转置满足
(AB)T=BTAT.
正交矩阵的列向量组成正交坐标架,因此
R−1=RT,
这让旋转矩阵求逆特别便宜。
6. 把这一讲带到后面
- 点积:方向有多一致、投影有多长。
- 叉积:垂直方向、朝向和面积。
- 正交基:换坐标系、搭相机。
- 矩阵:把同一种几何操作批量作用到所有点。
- 逆矩阵:从一个坐标系退回另一个坐标系。
把这些几何意义抓住,比只记分量公式更不容易写反。