查看: 2252|回复: 5

动态改变节点的material

[复制链接]

该用户从未签到

发表于 2009-2-27 12:25:32 | 显示全部楼层 |阅读模式
我需要动态的改变某个节点的材质,(就是一个碰撞检测,当检测到碰撞时,改变节点的材质)

需要把这些都放在preframeupdate()中进行才不会有错吗?

还有动态改变时,每一次更新都需要重新new一个material,
osg::Material *mat=new osg::Material();
//是否相交
if(m_isintersects)
{
//红色材质
    mat->setDiffuse(osg::Material::Face::FRONT,osg::Vec4(0.8,0.1,0.1,1));
   mat->setAmbient(osg::Material::Face::FRONT,osg::Vec4(0.8,0.1,0.1,1));
   mat->setSpecular(osg::Material::Face::FRONT,osg::Vec4(0.8,0.8,0.8,1));
   mat->setShininess(osg::Material::Face::FRONT,16);
    if(m_plane)
                m_plane->getOrCreateStateSet()->setAttribute(mat,osg::StateAttribute::OVERRIDE);
}
else
{
  //绿色材质
   mat->setDiffuse(osg::Material::Face::FRONT,osg::Vec4(0.1,0.8,0.1,1));
   mat->setAmbient(osg::Material::Face::FRONT,osg::Vec4(0.1,0.8,0.1,1));
   mat->setSpecular(osg::Material::Face::FRONT,osg::Vec4(0.8,0.8,0.8,1));
  mat->setShininess(osg::Material::Face::FRONT,16);

                       
   if(m_plane)
        m_plane->getOrCreateStateSet()->setAttribute(mat,osg::StateAttribute::OVERRIDE);
}

如果定义两个redmat,greenmat,初始化的时候就定义好了,按照上述赋值时,会报错
//是否相交
if(m_isintersects)
{
//红色材质
       if(m_plane)
                m_plane->getOrCreateStateSet()->setAttribute(redmat,osg::StateAttribute::OVERRIDE);
}
else
{
  //绿色材质
                 
   if(m_plane)
        m_plane->getOrCreateStateSet()->setAttribute(greenmat,osg::StateAttribute::OVERRIDE);
}

该用户从未签到

发表于 2009-2-27 13:29:40 | 显示全部楼层
我想这些应该在更新回调UpdateCallback里面完成,同时还要设置节点为Dynamic。对于场景中大量的节点,同时都设置成Dynamic会影响渲染效率,也许楼主还需要斟酌一下这种情形下动态改变材质的可行性

该用户从未签到

 楼主| 发表于 2009-2-27 13:36:23 | 显示全部楼层

多谢

我觉得放在updatecallback 和放在preframeupdate()是一样的效果,都不会出现绘制线程的错误,因为我开始没有放在preframeupdate()中而是另外有个timer刷新器再不断刷新,这是程序所需的
设置节点为Dynamic的方法我去试一下
至于说动态改变材质的可行性,你是说有更好的办法吗我需要改变节点颜色

该用户从未签到

发表于 2009-2-27 14:32:36 | 显示全部楼层
楼主所说的timer刷新器怎么加的,能共享一下吗?正好也遇到这个问题,场景需要加上时间,谢谢!

该用户从未签到

 楼主| 发表于 2009-2-27 16:35:04 | 显示全部楼层
我说的timer刷新器是指外部定义的,不断更新场景中节点的位置,不知道你需要什么样的,我不是在三维场景绘制里加的

该用户从未签到

发表于 2009-2-27 17:23:29 | 显示全部楼层
我指的是geom里的点随着时间位置的改变。不知道您会不会的,谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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