法线从object space到eye space的转换(nor
对于顶点来说,从object Space转换到eye space, 使用model-view矩阵就好了.那么顶点的法线是否也可以直接使用model-view矩阵转化?
当我们应用一个不等比缩放时(注意:等比缩放不会破坏法线,因为法线的方向没被改变,仅仅改变了法线的长度,而这很容易通过标准化来修复),法向量就不会再垂直于对应的表面了。
如下两张图是顶点的切线(T)和法向量(N)使用m-v矩阵从object space到eye space的变换:
可以看到在eye-space中,变换后的切线(T')的方向仍符合定义,变换后法向量(N')则不再垂直于变换后的切线(T')了,m-v矩阵不适用于法向量的变换.
下面给出法线变换矩阵的推导过程:
设法线为N,切线为T,经过变换后的分别为N ' 、T ',已知:T到T '的变换矩阵为M,求N到N '的变换矩阵G
已知其变换矩阵,则:N '=GN; T '=MT;
因为法线与切线垂直则其点乘为0,有:N·T = 0(单位矩阵)
变换后法线仍与切线垂直:T '·N '=0
因此:
(GN)·(MT)=0
写成矩阵表示:
(GN)T(MT)=0
NTGTMT=0
已知NTT=0 (即向量表示下的N·T = 0)
则GTMT = T
GTM = I
G=(M-1)T
因此法线变换矩阵为切线变换矩阵的逆矩阵的转置矩阵。
注意:
(GN)·(MT)=0=>(GN)T(MT)=0是因为,GN是一个4维向量(x1,y1,z1,w1),MT因为是一个4维向量(x2,y2,z2,w2),根据点乘的计算公式知道(GN)·(MT)=x1x2,y1y2,z1z2,w1w2,而(GN)T是一个4x1的矩阵,(MT)可以看出是1x4的矩阵,(GN)T(MT)=x1x2,y1y2,z1z2,w1w2,所以(GN)·(MT)=0=>(GN)T(MT)=0
即normal matrix是model-view矩阵的逆矩阵的转置矩阵.
若model-view矩阵是一个正交矩阵(没有进行缩放的情况),则G=M.这便是例外情况下normal matrix为model-view矩阵.
另外在unity3d引擎中,法线矩阵已经作为内置的变量提供给我们了,UNITY_MATRIX_IT_MV,Inverse transpose of model * view matrix,直接用就可以了,如果是其他一些情况则需要自己自行计算了。