法线的归一化和法线视图变换矩阵的正确设置

一、 

1、法线归一化的一个意思是:
       通过叉乘得到一个面的面法线,然后进行归一化的目的是,求得单位长度的向量,就是说,法线向量的x,y,z都要除以向量长度。因为法线长度和面积成正比,但光照不能随面积变化,所以取一个单位值。当然点法线需要考虑通过该点的所有面的面法线。
  2、法线的处理还有一个问题是:人们容易想到对法线向量,可以像模型顶点向量那样,通过乘以模型视图变换矩阵得到平移、旋转等变换后的结果。但事实是模型视图矩阵在某些情况下,不能用来变换法线向量,为什么?其中一个重要原因是模型视图矩阵的缩放变换,如果缩放在x,y,z三个方向是一致的(uniform),那么法线方向保持不变,变的只是长度,这就可以通过归一化修正这个影响。但如果在这三个方向上的缩放是不一致的,可以想象,法线就不再与三角形平面保持垂直了,那还叫法线么?透视变换也会使得法线产生变形。
       变换法线的正确矩阵是包含平移、旋转的模型视图变换矩阵M的逆的转置。OpenGL计算出的这个矩阵就保存在gl_NormalMatrix里。

二、

最近在处理3d模型过程中,法线有些模型的某些部分透明了,看到了应该贴在另一面外面的贴图竟然贴在了里面。 显然是法线错误。 曾一度搞不清问题所在。终于, 最近看到了一篇文章关于法线的,在变换中应该乘变换矩阵的,但是其中的原理表述的不够明白, 我经过推导,现记述如下:

    

    在三维空间中, 一个面可表述为: ax+by+cz+d=0;

    n=[a,b,c,d] p=[x,y,z,1]  则该面在空间中可表示为: nTp=0

    其中n为该面的法向量

    

    现在对p进行变换,p'=Rp  当然法向量也的变换, n'=Qn

    

    变换后, 处在该面上的任何点都应该满足:  

                     (n’)Tp’=0

    也就是 

          (Qn)T(Rp)=0

     

           NT(QTR)p=0

    也就是说

           QTR=I

    从而得到     (R可逆的情况下)

           Q=(R-1)T

           

    所以说法线的变换矩阵为模型变换矩阵的逆转置矩阵。

原文地址:https://www.cnblogs.com/wonderKK/p/4243897.html