01 / 向量描述什么
标量只有大小,例如时间 2 秒、亮度 0.8;向量同时具有大小和方向。二维向量可写作 v = (x, y),三维向量则写作 v = (x, y, z)。
点和向量都可能由三个数字保存,但语义不同:点表示空间中的位置,向量表示位移。两个点相减得到从一个点指向另一个点的向量;点加向量得到新的点。
方向 = 终点 - 起点
位移后的点 = 起点 + 方向 × 距离
位移后的点 = 起点 + 方向 × 距离
02 / 四种核心运算
加法与数乘
向量相加会合并位移,乘以标量会缩放长度;标量为负数时还会翻转方向。动画中的连续移动与物理中的速度积分都依赖它们。
点积:比较两个方向
a · b = axbx + ayby + azbz = |a||b|cosθ
单位向量的点积直接给出夹角余弦:同向为 1,垂直为 0,反向为 -1。漫反射光照正是用表面法线与入射光方向的点积判断受光程度。
叉积:构造垂直方向
a × b = (aybz-azby, azbx-axbz, axby-aybx)
三维叉积生成同时垂直于 a 和 b 的向量,可计算三角形法线、相机右方向。结果朝向由坐标系和操作数顺序决定。
| 运算 | 结果 | 典型用途 |
|---|---|---|
| 加法 | 向量 | 组合位移 |
| 数乘 | 向量 | 缩放速度或方向 |
| 点积 | 标量 | 夹角、投影、光照 |
| 叉积 | 向量 | 法线、坐标基 |
03 / 单位向量与法线
归一化把向量长度变为 1,同时保留方向。这样“方向”不会意外携带距离,使点积等运算更容易解释。
|v| = √(x² + y² + z²)
normalize(v) = v / |v|
normalize(v) = v / |v|
零向量不能归一化。它的长度为 0,除法没有定义。程序中应先检查长度,或保证输入不会退化。
法线是垂直于表面的单位向量。它不是普通的位置向量:模型发生非均匀缩放后,法线通常要用模型矩阵的逆转置矩阵变换,才能继续垂直于表面。
04 / 向量在一帧画面中出现在哪里
- 几何:顶点位置、边、切线和法线。
- 相机:观察方向、上方向以及由它们构成的坐标基。
- 光照:光线方向、反射方向和颜色的 RGB 三通道。
- 动画:速度、加速度与骨骼朝向。
同为三维向量的数据不一定能直接运算。模型空间的法线不能与世界空间的光线做点积;必须先把它们变换到同一坐标空间。
05 / 常见误区
- 把点当作方向归一化,丢失了它原本的位置意义。
- 忘记单位化参与夹角计算的向量,导致点积不再等于余弦。
- 交换叉积顺序;
a × b = -(b × a),结果会完全反向。 - 混用不同坐标空间的数据,得到数值合法但视觉错误的结果。
检查习惯:看到一个向量时,先问它表示位置、方向还是颜色,再问它属于哪个坐标空间。