Skip to content

为什么法线需要逆转置(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