zoukankan      html  css  js  c++  java
  • 法线的归一化和法线视图变换矩阵的正确设置

    一、 

    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

               

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

  • 相关阅读:
    软件工程过程 第8章 敏捷过程
    软件工程过程 第7章 软件工程过程改进
    软件工程过程 第6章 软件工程过程的建立与监控
    软件工程过程 第5章 协同过程模型
    软件工程过程 第4章 瀑布模型应用实例
    软件工程过程 第3章 软件生存周期模型
    软件工程过程 第2章 软件开发的主要活动
    软件工程过程 第1章 绪论
    软件工程过程 第0章 目录
    Bitcoin源代码编译安装详解
  • 原文地址:https://www.cnblogs.com/wonderKK/p/4243897.html
Copyright © 2011-2022 走看看