對於頂點來說,從object Space轉換到eye space, 使用model-view矩陣就好了.那么頂點的法線是否也可以直接使用model-view矩陣轉化?
通常情況下是不行的.
如下兩張圖是頂點的tangent和normal向量使用m-v矩陣從object space到eye space的變換:
>>>>>>>>>>>>>>>>
可以看到在eye-space中,tangent的方向仍符合定義,normal則不再垂直於tangent了.m-v矩陣不適用於normal.
令T為tangent,MV為model-view矩陣.P1, P2為tangent聯系的2個頂點.
T = P2 - P1
T' = T * MV = (P2 - P1) * MV = P2 * MV - P1 * MV = P2' - P1'
因此T'保留了tangent的定義.但對於normal,你也可以找到N=Q2-Q1代表它,但是變換后Q2'-Q1'卻不能保證垂直於T'.object space到view space,角度關系被改變了.
如何求出normal的變換,維持與tangent垂直?假設該變換為G.
normal與tangent垂直:
N'.T' = (GN).(MT) = 0
點積轉化為叉積:
(GN).(MT) = (GN)T * (MT) = (GN)T(MT) = (NTGT)(MT) = NTGTMT = 0
注意到NTT為0:
若GTM = I,則上式成立.因此G=(M-1)T.
即normal matrix是model-view矩陣的逆矩陣的轉置矩陣.
若model-view矩陣是一個正交矩陣,則G=M.這便是例外情況下normal matrix為model-view矩陣.
