查看: 2370|回复: 9

MatrixTransform和法向量

[复制链接]

该用户从未签到

发表于 2012-8-10 14:38:30 | 显示全部楼层 |阅读模式
本帖最后由 wanggang8826 于 2012-8-10 15:15 编辑

MatrixTransform是怎么影响法向量的?
下面的函数生成一个带有材质的Geode,然后我使用MatrixTransform放置一个Geode,为什么位置是对的,但是材质显示不对呢?我想是Geometry的法向量没有被矩阵影响,怎么解决?

osg::ref_ptr< osg::MatrixTransform > mt = new osg::MatrixTransform( m );// m是变换矩阵       
mt->addChild( createTRIANGLESGeode( ) );
root->addChild( mt.get() );
QQ截图20120810151350.jpg

osg::Geode* createTRIANGLESGeode( ) const
        {
                osg::ref_ptr< osg::Geode > geode = new osg::Geode();
                osg::ref_ptr< osg::Geometry > triGeom = new osg::Geometry();

                // 顶点坐标数组
                osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array( 顶点个数,顶点数组地址);
                triGeom->setVertexArray(vertices);

                // 颜色数组
                osg::ref_ptr<osg::Vec4Array> colors = new osg::Vec4Array;
                colors->push_back(osg::Vec4(0.0f,1.0f,0.0f,1.0f));
                triGeom->setColorArray(colors);
                triGeom->setColorBinding(osg::Geometry::BIND_OVERALL);

                // 法向量数组
                osg::ref_ptr<osg::Vec3Array> normals = new osg::Vec3Array( 法向量个数,法向量数组地址 );
                triGeom->setNormalArray(normals);
                triGeom->setNormalBinding(osg::Geometry::BIND_PER_VERTEX);// 一个顶点对应一个法向量

                triGeom->addPrimitiveSet(
                        new osg:rawElementsUShort(osg:rimitiveSet::TRIANGLES, 索引个数        ,索引数组地址));

                // 材质                       
                  osg::ref_ptr<osg::StateSet > ss  = geode->getOrCreateStateSet();
                osg::ref_ptr<osg::Material> mat=new osg::Material;
                mat->setDiffuse(osg::Material::FRONT_AND_BACK, diffuse);
                mat->setAmbient(osg::Material::FRONT_AND_BACK, ambient);
                mat->setSpecular(osg::Material::FRONT_AND_BACK, specular);
                mat->setEmission(osg::Material::FRONT_AND_BACK, emissive);
                mat->setShininess(osg::Material::FRONT_AND_BACK, material.power);
                ss->setAttribute(mat.get());

                //ss->setMode( GL_LIGHTING, osg::StateAttribute::OFF  );
                triGeom->setStateSet( ss );
                }
        }
                geode->addDrawable(triGeom);
                return geode.release();
}

该用户从未签到

发表于 2012-8-10 15:06:20 | 显示全部楼层
法线设置有问题

该用户从未签到

 楼主| 发表于 2012-8-10 15:19:09 | 显示全部楼层
本帖最后由 wanggang8826 于 2012-8-10 15:21 编辑
liuzhiyu123 发表于 2012-8-10 15:06
法线设置有问题


顶点的法向量是从模型里面读取的,没有错。因为当那个变换矩阵的m为单位矩阵的时候,材质是正确显示的(法向量是正确的)
QQ截图20120810151959.jpg

该用户从未签到

发表于 2012-8-10 15:45:04 | 显示全部楼层
设置节点的GL_NORMAL 就行了

该用户从未签到

 楼主| 发表于 2012-8-10 15:47:21 | 显示全部楼层
liuzhiyu123 发表于 2012-8-10 15:45
设置节点的GL_NORMAL 就行了

具体怎么写?麻烦给简写一下,我整了2天了,谢过!!

该用户从未签到

发表于 2012-8-10 16:16:59 | 显示全部楼层
wanggang8826 发表于 2012-8-10 15:47
具体怎么写?麻烦给简写一下,我整了2天了,谢过!!

root->getOrCreateStateSet()->setMode(GL_NORMALIZE, osg::StateAttribute::ON);

该用户从未签到

 楼主| 发表于 2012-8-10 16:38:44 | 显示全部楼层
liuzhiyu123 发表于 2012-8-10 16:16
root->getOrCreateStateSet()->setMode(GL_NORMALIZE, osg::StateAttribute::ON);

谢谢!非常感谢啊!我整了一天这个法向量的问题,就差这一句话啊,有点坑人啊!太感谢你了大哥大侠。

这个setMode(GL_NORMALIZE, osg::StateAttribute::ON)是起什么作用的呢?默认的怎么会是关闭呢?在OpenGL里面对应的是什么呢?麻烦大侠有机会回答一下,不用着急。

我今天把几个模型的数据观察了个遍,检查来检查去,读出来的数据都是正确的,可是显示结果就是不对,真的郁闷之极。最后以消极的心态来论坛发帖求助,解决了!再次感谢!

该用户从未签到

发表于 2012-8-10 16:41:15 | 显示全部楼层
wanggang8826 发表于 2012-8-10 16:38
谢谢!非常感谢啊!我整了一天这个法向量的问题,就差这一句话啊,有点坑人啊!太感谢你了大哥大侠。

...

就是向量标准化,补习一下openGL的知识吧,有好处

该用户从未签到

发表于 2012-8-14 16:04:26 | 显示全部楼层
因为您可能用到了Transform节点的scale,因而法线也会跟着发生放缩,并且无法再取得旋转的数值,通常情况下我们应该避免这种scale的操作。GL_NORMALIZE开启后会影响性能,但是会自动对放缩后的法线执行归一化

该用户从未签到

 楼主| 发表于 2012-8-17 10:44:09 | 显示全部楼层
array 发表于 2012-8-14 16:04
因为您可能用到了Transform节点的scale,因而法线也会跟着发生放缩,并且无法再取得旋转的数值,通常情况下 ...

收到,了解。我给Transform重新设置了一个矩阵。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表