http://blog.csdn.net/xiajun07061225/article/details/7762711
在圖形學中,同樣的一個模型視圖變換矩陣可以用來變換點、線、多邊形以及其它幾何體,也可以變換多邊形表面的切向量。比如:
posEyeSpace = ModelViewMatrix * posModelSpace。
但是,同樣的方式通常卻不能夠用於法線的變換(注意:在有些情況下是可以的)。
一、法線和頂點坐標的區別
頂點坐標<x,y,z>表示缺省的<x,y,z,1>,而法線向量的<x,y,z>表示缺省的<x,y,z,0>。
法線向量只能保證方向的一致性,而不能保證位置的一致性。
下面我們通過一個例子來看看問題所在。
上圖是針對一個多邊形以及一條邊上的法線進行縮放變換:X軸上縮放為原來的0.5倍。左邊是變換前的狀態,中間是將同樣的模型變換矩陣應用在法線上的結果,顯然是錯的,法線並不垂直於切線。最右邊的圖是正確的結果。
二、法線變換:應該用變換矩陣的逆轉置矩陣
假設Model space中的某條切線向量是T,法線向量是N。那么由他們是垂直的可得到:TTN=0
假設他們變換到Eye space中后分別是T'和N'。那么他們應該仍然是相互垂直的:T’TN’=0
假設切線向量和法線的變換矩陣為M、G。則有:(MT)T(GN)=0
進一步推出:TTMTGN=0
由於TTN=0,因此我們猜想MTG=0.因此:《注:我覺得這里該寫 MTG=E. E:為單位矩陣》
G=(M-1)T
即:應用於法線向量的變換矩陣是頂點變換矩陣的逆轉置矩陣。