Appearance
为什么法线需要逆转置(Inverse-Transpose)矩阵?
核心问题:非均匀缩放会破坏法线
当对一个物体进行非均匀缩放(比如 X 轴缩放到 2 倍,Y 轴保持 1 倍),顶点和法线的变换方式不同。
数学证明:法线需要正交于切线
设:
- T = 切线向量(Tangent,沿表面方向)
- N = 法线向量(Normal,垂直于表面)
- M = 模型矩阵(Model)
关键约束:法线必须始终垂直于切线
N · T = 0
变换后,切线变成 M · T。需要找到矩阵 G,使得变换后的法线 G · N 仍然垂直于变换后的切线:
(G · N) · (M · T) = 0
利用矩阵转置性质 a · (Mb) = (Mᵀa) · b:
推导过程:
点积 a · v 等价于矩阵乘法 aᵀv(将向量 a 视为行向量),因此:
a · (Mb) = aᵀ(Mb)
矩阵乘法满足结合律 (aᵀM)b,再利用转置性质 (aᵀM) = (Mᵀa)ᵀ:
= (Mᵀa)ᵀ · b = (Mᵀa) · b
即:把矩阵 M 从右侧操作数"移到"左侧操作数时,M 需要转置为 Mᵀ。
G · N · M · T = N · (Gᵀ · M) · T = 0
为了让这个等式对任意 T 成立,需要:
Gᵀ · M = I
因此:
Gᵀ = M⁻¹ ⟹ G = (M⁻¹)ᵀ = (Mᵀ)⁻¹
因此:法线矩阵 = 模型矩阵的逆转置
案例验证
初始条件:
- 切线向量 T = [0, 2](沿 Y 轴方向)
- 法线向量 N = [1, 0](沿 X 轴方向,垂直于 T)
- 验证初始正交:N · T = 1×0 + 0×2 = 0 ✓
模型矩阵(错切变换):
M = | 1 1 |
| 0 1 |X 方向会受到 Y 的影响(错切)。
第一步:变换切线
M · T = [1×0 + 1×2, 0×0 + 1×2] = [2, 2]
第二步:直接用 M 变换法线(错误方式)
M · N = [1×1 + 1×0, 0×1 + 1×0] = [1, 0]
验证正交性:[2, 2] · [1, 0] = 2 ≠ 0 ✗ 法线不再垂直于切线!
第三步:用逆转置矩阵变换法线(正确方式)
求 M 的逆矩阵:
M⁻¹ = | 1 -1 |
| 0 1 |对 M⁻¹ 转置得到法线矩阵 G = (M⁻¹)ᵀ:
G = | 1 0 |
| -1 1 |G · N = [1×1 + 0×0, -1×1 + 1×0] = [1, -1]
验证正交性:[2, 2] · [1, -1] = 2 + (-2) = 0 ✓ 法线正确垂直于切线!
小结
| 变换方式 | 变换后法线 | 与变换后切线 [2,2] 的点积 | 是否垂直 |
|---|---|---|---|
| 直接用 M | [1, 0] | 2 | ✗ |
| 用 (M⁻¹)ᵀ | [1, -1] | 0 | ✓ |