方海龙的书馆 / 图形学 / OpenGL学习脚印: 变换法向量 Transformin...

0 0

   

OpenGL学习脚印: 变换法向量 Transforming Normals

2014-10-28  方海龙的...

OpenGL学习脚印:  变换法向量 Transforming Normals

写在前面

               进行光照计算时,法向量计算很重要。这里整理了法向量变换矩阵的推导的过程,供参考。参考资料列在末尾。

1.法向量不可以像顶点坐标那样进行模视变换


   对于顶点坐标可以使用模视变换矩阵相乘即可变换到相机坐标系下,而法向量如果乘以相同的变换矩阵,则会产生错误。

请看下例(来自[1]):

 

         这里对三角形实施了y轴2倍放大的变换,变换前法向量为(1.0,1.0,0.0);变换后法向量为(2.0,1.0,0.0),这与对之前的法向量y轴进行放大的结果(1.0,2.0,0.0)是不同的。

            对法向量,不能直接向顶点那样乘以模视变换矩阵来完成从模型坐标系到相机坐标系的转换,需要另外推导。

2.非齐次和齐次坐标下平面定义

       非齐次坐标系下,平面方程,如果采用点-向量形式,可以表达为:

       ax+by+cz+d = 0; 其中平面法向量为n = (a,b,c)

      齐次坐标系下,确定一个平面,使用行向量 n = (a,b,c,d);这里a,b,c,d至少一个不为0。如果q不为0,则(a,b,c,d)和(qa,qb,qc,qd)代表同一个平面。平面上的点则满足:

     ax+by+cz+dw = 0;如果w = 1,则这是标准的欧几里得平面。

     如果采用矩阵形式表达即为,点v(x,y,z,w)在齐次坐标平面 n = (nx,ny,nz,nw)下可以表示为:

    

      (来自[2])

3.法向量变换推导

          我们使用M矩阵代表GL_MODELVIEW,则可以将上面的方程变换为:

         



上式,右端vertex即为经过模视变换的顶点坐标,它们已在相机坐标系下了。根据齐次坐标下平面方程特点,则左侧的normal即为变换后平面的法向量,也即为所求的法向量。也就是将法向量从模型坐标系变换到了相机坐标系下了。

则法向量变换公式,写成熟悉的列向量形式即为:

      

         也就是说,完成法向量转换的所求矩阵为,M矩阵即GL_MODELVIEW矩阵的逆矩阵的转置矩阵。

      另外根据线性代数知识:

     

      可以根据需要变换求这个矩阵的顺序。


         这里用这个公式计算上述例子中变换后的法向量。

         上述三角形沿着y轴放大2倍,则变换矩阵为:

         M =

                1     0     0     0
                0     2     0     0
                0     0     1     0
                0     0     0     1

         则inv(M')*[1.0;1.0;0.0;0.0] = 

          1.0000
       0.5000
         0
         0

         这个列向量,单位化后既满足变换后的法向量。


参考资料

[1]: Simple Lighting

[2]: OpenGL Programming Guide   Transforming Normals

[3]: OpenGL Normal Vector Transformation


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。如发现有害或侵权内容,请点击这里 或 拨打24小时举报电话:4000070609 与我们联系。

    猜你喜欢

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多
    喜欢该文的人也喜欢 更多