转换公式

设法线变换矩阵为 \mathbf{N},仿射变换矩阵的线性部分(上左3x3)为 \mathbf{M},它们之间的关系为:

\mathbf{N} = (\mathbf{M}^{-1})^{T} = (\mathbf{M}^{T})^{-1}

公式的推导

设平面法线为 \mathbf{n},平面切向量为 \mathbf{v}
法线的定义满足:

\mathbf{n}^T \cdot \mathbf{v} = 0

若有一个仿射变换矩阵的线性部分 \mathbf{M}(包括缩放和旋转变换) ,则平面切向量变换为:

\mathbf{v}' = \mathbf{M} \mathbf{v}

我们希望找到新的法线 \mathbf{n}',使得变换后满足:

\mathbf{n}'^{T} \cdot \mathbf{v}' = 0

接下来,代入 \mathbf{v}' = \mathbf{M}\mathbf{v},我们得到:

\mathbf{n}'^{T} \cdot \mathbf{M}\mathbf{v} = 0

又由于 \mathbf{n}^T \cdot \mathbf{v} = 0,如果对于任意 \mathbf{v} 都满足上两式,必须满足以下条件:

\mathbf{n}'^{T}\cdot\mathbf{M} = \mathbf{n}^{T}

转置一下得到:

\mathbf{M}^{T}\cdot \mathbf{n}'= \mathbf{n}

两边左乘 (\mathbf{M}^{T})^{-1},得到转换公式:

\mathbf{n}'= (\mathbf{M}^{T})^{-1} \cdot \mathbf{n}

而对于任意可逆矩阵,其转置的逆和逆的转置相同。这样一来,文章开头的公式就推导完毕了。

特殊情况

如果一个仿射变换不包含非均匀缩放,(即缩放的三轴数值不同,例如,x=1.5, y=1, z=1),只是位移、旋转、均匀缩放的组合,那么不必额外计算 (\mathbf{M}^{T})^{-1},因为 \mathbf{M}在这种情况下是正交矩阵
我们知道旋转矩阵其实是正交矩阵,推导可以参见我之前的文章。而均匀缩放矩阵的线性部分则是单位矩阵的整数倍,这两种矩阵的乘积仍然是正交矩阵。而根据正交矩阵的定义,\mathbf{M}^{T} = \mathbf{M}^{-1},可以得到 (\mathbf{M}^{T})^{-1}=\mathbf{M}
因此,当你可以确定某个仿射变换不包含非均匀缩放,你可以直接截取仿射变换矩阵的正交部分乘入法线变换矩阵中。