解释一下标题,N是变换到世界坐标后的法向量,worldMatrix_IT是变换矩阵worldMatrix的逆的转置矩阵,normal就是模型坐标的法向量。
对于点p,我们根据变换矩阵M(即worldMatrix)得到世界坐标的点为p',可以写为p'=Mp。在cg语言中就是p'.position=mul(worldMatrix,p.positon);。所以初读N=mul(worldMatrix_IT,normal);时,我有点纳闷,这个worldMatrix_IT是什么,为什么不用worldMatrix。我们来推导一下吧:
设一个顶点为P,其法向量为N,由和P无限相邻的两个点P1、P2可以得到一条和法向量垂直的切向量T,T=P1-P2。设M为变换矩阵,于是可以由变换的两个点P1'、P2'得到变换后的法向量T'。推导如下:
T'=P1'-P2'
T'=MP1-MP2
T'=M(P1-P2)
T'=MT
因为法向量和切向量垂直,于是可得:
N·T=0
NTT=0
M乘以M的逆矩阵M-1等于单位矩阵E,又因为任意矩阵乘以单位矩阵仍等于本身,所以:
NTET=0
NTMM-1T=0
NTM-1MT=0(互逆的矩阵可以交换)
NTM-1T'=0
因为变换后的法向量N'和切向量N'依旧垂直,所以:
N'TT'=0
N'T=NTM-1
N'=(NTM-1)T
N'=(M-1)TN
所以现在就能得出,法向量需要用变换矩阵M的逆的转置矩阵(M-1)T做变换才能得到,现在能理解N=mul(worldMatrix_IT,normal);了吧~