深色模式
向量、点积与叉积
先把向量(vector)想成一支具有长度和方向的箭头。同一个箭头可以平移到别处而不改变它表达的位移。点(point)则表示相对于原点的位置。它们可能都存为三个数字,却有不同的计算规则:两个点相减得到位移;点加位移得到新点。
三个数字首先需要三根轴
在东、北、天坐标中,v = (3, 4, 0) m/s 表示每秒向东 3 m、向北 4 m。模长(magnitude)由勾股定理(Pythagorean theorem)得到:
单位向量(unit vector)只保存方向,模长为 1。归一化(normalization)是求这个单位向量的过程。零向量没有确定方向,因此不能直接除以零;应让业务决定返回空值、沿用旧方向还是重新播种。
| 记号 / 英文 | 含义 | 单位 |
|---|---|---|
| v / vector | 三个轴上的分量 | 取决于物理量,例如 m/s |
| |v| / magnitude | 向量长度 | 与 v 相同 |
| ê / unit vector | 只有方向的单位向量 | 无量纲 |
| a·b / dot product | 点积 | 两个输入单位的乘积 |
| a×b / cross product | 叉积 | 两个输入单位的乘积 |
点积:在指定方向上有多少
点积(dot product)将两个向量变成一个数:
如果 ê 是单位东向量 (1,0,0),那么 v·ê = 3 m/s 就是东向的有符号投影(signed projection)。点积为零表示垂直,为正表示夹角小于 90°,为负表示超过 90°。计算两条非零向量夹角时可使用 acos(dot / (lenA × lenB)),并将浮点结果夹到 [-1,1]。
叉积:得到垂直方向
叉积(cross product)在三维中产生一条同时垂直于两个输入的向量,其方向遵守右手规则(right-hand rule)。交换输入顺序,结果反号。
ts
type V3 = readonly [number, number, number]
const dot = (a: V3, b: V3) => a[0]*b[0] + a[1]*b[1] + a[2]*b[2]
const cross = (a: V3, b: V3): V3 => [
a[1]*b[2] - a[2]*b[1],
a[2]*b[0] - a[0]*b[2],
a[0]*b[1] - a[1]*b[0],
]
const east: V3 = [1, 0, 0]
const north: V3 = [0, 1, 0]
cross(east, north) // [0,0,1],ENU右手坐标中的天向
cross(north, east) // [0,0,-1]若两个输入是三角形的边,则叉积的模长是对应平行四边形的面积,三角形面积为它的一半。把叉积归一化可得到面法线(surface normal);顶点绕序(winding order)颠倒会令法线反向,影响背面剔除与光照。共线边的叉积为零,不能生成稳定法线。
风速分量描述空气朝向哪里运动;气象风向通常描述风来自哪里。例如西风向东吹,东向速度为正。读数据时还需核对速度分量使用地理东/北方向,还是模型网格方向。
自检:三角形朝哪面
设 A=(0,0,0)、B=(2,0,0)、C=(0,3,0),长度单位是米。计算 (B−A)×(C−A)、三角形面积及单位法线。
答案与理由
两条边为 (2,0,0) 与 (0,3,0),叉积为 (0,0,6) m²,面积为 6/2 = 3 m²,单位法线为 (0,0,1)。改用 (C−A)×(B−A) 会得到反方向;面积保持不变。
下一步:矩阵、基与坐标变换。回到主课:Geometry 的顶点与索引。