法向量变换矩阵的推导

本文简述了一种法向量变换矩阵的推导过程

使用矩阵对点进行空间变换是图形学中的常见操作,假设变换矩阵为 M M ,我们需要变换切向量 T T (由 点 P 2 P_2 - 点 P 1 P_1 定义) 以及与其垂直的法向量 N N .( T T N N 皆为列向量)

假设 点 P 2 P_2 经过 M M 变换后为 P 2 P_2' , 点 P 1 P_1 经过 M M 变换后为 P 1 P_1' , 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}

对于原切向量 T T ,我们希望找到一个矩阵 M M' , 使得:

M T = T M' * T = T'

我们直接令 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}

可见对于切向量 T T ,我们可以直接使用 M M 对其进行变换.

对于法向量 N N ,我们有(注意,第一个公式中的点号表示点积):

T N = 0       T T N = 0 \begin{aligned} & T \cdot N = 0 \implies \\ & T^T * N = 0 \end{aligned}

假设变换后的法向量为 N N' , 我们希望仍然保持其与 T T' ( T T 的变换后向量) 的垂直(注意,第一个公式中的点号表示点积):

T N = 0       T T N = 0 \begin{aligned} & T' \cdot N' = 0 \implies \\ & T'^T * N' = 0 \end{aligned}

假设用于变换法向量的矩阵为 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 T N = 0 T^T * N = 0

所以我们只要令(注意,这只是一种可能的取值,并不是唯一取值,我们的目的也仅是需要获得一种可能的取值):

M T G = I M^T * 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}

所以变换法向量,我们需要使用普通变化矩阵逆的转置(或者说转置的逆,对于可逆矩阵,其转置矩阵的逆矩阵等于其逆矩阵的转置矩阵)

G = ( M T ) 1 = ( M 1 ) T G = (M^T)^{-1} = (M^{-1})^T


如果变换矩阵 M M 是正交矩阵,则有(根据正交矩阵定义)

M 1 = M T M^{-1} = M^T

于是法向量的变换矩阵变为:

G = ( M T ) 1 = ( M 1 ) 1 = M G = (M^T)^{-1} = (M^{-1})^{-1} = M

此时我们就可以直接使用 M M 来变换法向量了.

更多资料

发布了142 篇原创文章 · 获赞 146 · 访问量 25万+

猜你喜欢

转载自blog.csdn.net/tkokof1/article/details/88531964