本文简述了一种法向量变换矩阵的推导过程
使用矩阵对点进行空间变换是图形学中的常见操作,假设变换矩阵为 M M M ,我们需要变换切向量 T T T(由 点 P 2 P_2 P2 - 点 P 1 P_1 P1 定义) 以及与其垂直的法向量 N N N .( T T T 和 N N N 皆为列向量)
假设 点 P 2 P_2 P2 经过 M M M 变换后为 P 2 ′ P_2' P2′, 点 P 1 P_1 P1 经过 M M M 变换后为 P 1 ′ P_1' P1′, T ′ T' T′ 为经过变换后的切向量:
M ∗ P 2 = P 2 ′ M ∗ P 1 = P 1 ′ T ′ = P 2 ′ − P 1 ′ \begin{aligned} & M * P_2 = P_2' \\ & M * P_1 = P_1' \\ & T' = P_2' - P_1' \end{aligned} M∗P2=P2′M∗P1=P1′T′=P2′−P1′
对于原切向量 T T T,我们希望找到一个矩阵 M ′ M' M′, 使得:
M ′ ∗ T = T ′ M' * T = T' M′∗T=T′
我们直接令 M ′ = M M' = M M′=M 来试一下:
M ′ ∗ T = M ∗ T = M ∗ ( P 2 − P 1 ) = M ∗ P 2 − M ∗ P 1 = P 2 ′ − P 1 ′ = T ′ \begin{aligned} M' * T = M * T &= M * (P_2 - P_1) \\ &= M * P_2 - M * P_1 \\ &= P_2' - P_1' \\ &= T' \end{aligned} M′∗T=M∗T=M∗(P2−P1)=M∗P2−M∗P1=P2′−P1′=T′
可见对于切向量 T T T ,我们可以直接使用 M M M 对其进行变换.
对于法向量 N N N ,我们有(注意,第一个公式中的点号表示点积):
T ⋅ N = 0    ⟹    T T ∗ N = 0 \begin{aligned} & T \cdot N = 0 \implies \\ & T^T * N = 0 \end{aligned} T⋅N=0⟹TT∗N=0
假设变换后的法向量为 N ′ N' N′, 我们希望仍然保持其与 T ′ T' T′( T T T的变换后向量) 的垂直(注意,第一个公式中的点号表示点积):
T ′ ⋅ N ′ = 0    ⟹    T ′ T ∗ N ′ = 0 \begin{aligned} & T' \cdot N' = 0 \implies \\ & T'^T * N' = 0 \end{aligned} T′⋅N′=0⟹T′T∗N′=0
假设用于变换法向量的矩阵为 G G G, 则应有:
T ′ = M ∗ T N ′ = G ∗ N T ′ T ∗ N ′ = 0 ( M ∗ T ) T ∗ ( G ∗ N ) = 0 T T ∗ M T ∗ G ∗ N = 0 T T ∗ ( M T ∗ G ) ∗ N = 0 \begin{aligned} & T' = M * T \\ & N' = G * N \\ & T'^T * N' = 0 \\ & (M * T)^T * (G * N) = 0 \\ & T^T * M^T * G * N = 0 \\ & T^T * (M^T * G) * N = 0 \end{aligned} T′=M∗TN′=G∗NT′T∗N′=0(M∗T)T∗(G∗N)=0TT∗MT∗G∗N=0TT∗(MT∗G)∗N=0
由于我们知道:
T T ∗ N = 0 T^T * N = 0 TT∗N=0
所以我们只要令(注意,这只是一种可能的取值,并不是唯一取值,我们的目的也仅是需要获得一种可能的取值):
M T ∗ G = I M^T * G = I MT∗G=I
便可以满足上面的等式 :
T T ∗ ( M T ∗ G ) ∗ N = T T ∗ I ∗ N = T T ∗ N = 0 \begin{aligned} & T^T * (M^T * G) * N = \\ & T^T * I * N = \\ & T^T * N = 0 \end{aligned} TT∗(MT∗G)∗N=TT∗I∗N=TT∗N=0
所以变换法向量,我们需要使用普通变化矩阵逆的转置(或者说转置的逆,对于可逆矩阵,其转置矩阵的逆矩阵等于其逆矩阵的转置矩阵)
G = ( M T ) − 1 = ( M − 1 ) T G = (M^T)^{-1} = (M^{-1})^T G=(MT)−1=(M−1)T
如果变换矩阵 M M M 是正交矩阵,则有(根据正交矩阵定义)
M − 1 = M T M^{-1} = M^T M−1=MT
于是法向量的变换矩阵变为:
G = ( M T ) − 1 = ( M − 1 ) − 1 = M G = (M^T)^{-1} = (M^{-1})^{-1} = M G=(MT)−1=(M−1)−1=M
此时我们就可以直接使用 M M M 来变换法向量了.