解释一下标题,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
NT=0
M乘以M的逆矩阵M等于单位矩阵E,又因为任意矩阵乘以单位矩阵仍等于本身,所以:
NET=0
NMMT=0
NMMT=0(互逆的矩阵可以交换)
NMT'=0
因为变换后的法向量N'和切向量N'依旧垂直,所以:
N'T'=0
N'=NM
N'=(NM)
N'=(M)N
所以现在就能得出,法向量需要用变换矩阵M的逆的转置矩阵(M)做变换才能得到,现在能理解N=mul(worldMatrix_IT,normal);了吧~