osg学习(七十三)缩放条件下计算gl_NormalMatrix

Posted hankern

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了osg学习(七十三)缩放条件下计算gl_NormalMatrix相关的知识,希望对你有一定的参考价值。

法线的变换方式不同于顶点的变换。

顶点变换采用:gl_ModelViewProjectionMatrix * gl_Vertex

法线变换采用:gl_NormalMatrix*gl_Normal

NormalMatrix是ModelView矩阵逆的转置,由于gl_ModelViewProjectionMatrix 考虑了旋转、缩放、平移等因素,因此gl_NormalMatrix也考虑了旋转、缩放、平移等因素。

一般情况下,法线向量不应当随着缩放变换的,因此需要做缩放修正,对于一致缩放情况只需要做归一化处理即可,对于不一致的缩放需要在各分量乘以缩放系数(对于放大而言,需要乘以放大倍数)。

osg中对此矩阵是这样计算的:

osg/State.cpp
void State::updateModelViewAndProjectionMatrixUniforms()

    if (_modelViewProjectionMatrixUniform.valid()) _modelViewProjectionMatrixUniform->set((*_modelView) * (*_projection));
    if (_normalMatrixUniform.valid())
    
        Matrix mv(*_modelView);
        mv.setTrans(0.0, 0.0, 0.0);

        Matrix matrix;
        matrix.invert(mv);

        Matrix3 normalMatrix(matrix(0,0), matrix(1,0), matrix(2,0),
                             matrix(0,1), matrix(1,1), matrix(2,1),
                             matrix(0,2), matrix(1,2), matrix(2,2));

        _normalMatrixUniform->set(normalMatrix);
    

参考:

Normal Matrix(法向量变换矩阵) - 简书我们都知道gl的坐标系统。它的工作是将坐标从一个坐标系转到另一个坐标系。其中我们用到了几个转换矩阵。其中最为重要的是模型(Model)、视图(View)、投影(Project...https://www.jianshu.com/p/e001aec29976Opengl的gl_NormalMatrix_weixin_34268579的博客-CSDN博客原文地址:http://blog.csdn.net/ichild1964/article/details/9728357参考:http://www.gamedev.net/topic/598985-gl-normalmatrix-in-glsl-how-to-calculate/ 当用glsl传normal到fragment的时候总要用gl_Normal* gl_NormalMatri...https://blog.csdn.net/weixin_34268579/article/details/85763457

以上是关于osg学习(七十三)缩放条件下计算gl_NormalMatrix的主要内容,如果未能解决你的问题,请参考以下文章

osg学习(七十二)SPHERE_MAP REFLECTION_MAP NORMAL_MAP

osg学习(七十)如何根据视口对象自动调整视点位置距离

osg学习(七十四)Type mismatch in arithmetic operation between ‘vec2‘ and ‘int‘

osg学习(六十三)osg直接调用opengl例子

osg学习(五十三)绘制纹理贴图Texture示例

JavaScript学习(七十三)—高阶函数