转自http://www.cnblogs.com/ylwn817/articles/2153982.html

当通过osg复制多个相同物体时候,修改复制过来的某个物体材质属性时候,假设我们物体透明度,这个时候我们可能会发现修改某个物体,会导致其他复制过来的物体同样也被透明化。下面是解决方案:获得物体时候,只能获得自身材质,而不能去获得孩子材质,如果修改孩子材质,将会导致其他复制过来的也会被透明。

如下是详细代码:

osg::StateSet *state = iter->second->getOrCreateStateSet();//获得物体名字
  //osg::StateSet *state1=iter->second->getChild(0);//获得孩子属性//不能通过孩子修改透明度,否则会影响其他物体也变透明化。

osg::Material* mat = dynamic_cast<osg::Material*>(state->getAttribute(osg::StateAttribute::MATERIAL));
  
  if (!mat)//判断是否材质,没有的话将子材质给父节点。
  {
   mat = new osg::Material;
   osg::Geode* geode=dynamic_cast<osg::Geode*>(iter->second->getChild(0));
   osg::Material* mat1=dynamic_cast<osg::Material*>(geode->getDrawable(0)->getOrCreateStateSet()->getAttribute(osg::StateAttribute::MATERIAL));//获得孩子材质属性
   osg::Material* mat2=new osg::Material;
   *mat2=*mat1;//修改父材质属性//防止物体变黑,失去原来物体的材质

//设置透明度
   mat2->setAlpha(osg::Material::Face::FRONT_AND_BACK,0.3);

//融合
   state->setRenderingHint(osg::StateSet::TRANSPARENT_BIN);
   state->setMode(GL_BLEND,osg::StateAttribute::ON);
   //融合函数
   osg::ref_ptr<osg::BlendFunc> blendFunc = new osg::BlendFunc();
   blendFunc->setSource(osg::BlendFunc::SRC_ALPHA);
   blendFunc->setDestination(osg::BlendFunc::ONE_MINUS_SRC_ALPHA);
   state->setAttributeAndModes(blendFunc, osg::StateAttribute::ON|osg::StateAttribute::OVERRIDE);

state->setAttributeAndModes(mat2,osg::StateAttribute::ON|osg::StateAttribute::OVERRIDE);
  }
  else
  {

if (!flag)
   {
    mat->setAlpha(osg::Material::Face::FRONT_AND_BACK,1);
   }
   else
   {
    mat->setAlpha(osg::Material::Face::FRONT_AND_BACK,0.3);
    
   }    
  
   //设置混色
   state->setRenderingHint(osg::StateSet::TRANSPARENT_BIN);
   state->setMode(GL_BLEND,osg::StateAttribute::ON);

osg::ref_ptr<osg::BlendFunc> blendFunc = new osg::BlendFunc();
   blendFunc->setSource(osg::BlendFunc::SRC_ALPHA);
   blendFunc->setDestination(osg::BlendFunc::ONE_MINUS_SRC_ALPHA);
   state->setAttributeAndModes(blendFunc, osg::StateAttribute::ON|osg::StateAttribute::OVERRIDE);
   state->setAttributeAndModes(mat,osg::StateAttribute::ON|osg::StateAttribute::OVERRIDE);
  }

osg复制多个相同物体修改材质属性问题的更多相关文章

  1. Unity3D代码动态修改材质球的颜色

    代码动态修改材质球的颜色: gameObject.GetComponent<Renderer>().material.color=Color.red;//当材质球的Shader为标准时,可 ...

  2. 关于Entity Framework采用DB First模式创建后的实体批量修改相关属性技巧

    Entity Framework采用DB First模式创建实体是比较容易与方便的,修改已创建的实体在个数不多的情况下也是没问题的,但如果已创建的实体比较多,比如10个实体以上,涉及修改的地方比较多的 ...

  3. ArcMap10.1修改要素属性字段

    ArcMap10.1修改要素属性字段 问题描述:在ArcMap10.1中编辑要素属性表时,遇到输入字段值的长度超过字段最大长度时,ArcMap会抛出“基础DBMS错误[ORA-12899:value ...

  4. 自己动手丰衣足食之轮播图一动态修改marginTop属性实现轮播图

    引言 学习jQuery有年头了,刚开始学习时自己动手写过轮播图,放的久了以至于忘了大致思路了.现在转而做前端,抽空把jquery轮播图拿出来写一写,把各种思路都自己练习练习,这里主要使用动态修改mar ...

  5. jQuery修改class属性和CSS样式

    jQuery修改class属性和CSS样式 class属性修改 类属性即class属性,规定类名. 用类选择器规定样式的时候,需要为元素指定类名,即class属性的值. 注意每个HTML元素只有一个c ...

  6. [Effective JavaScript 笔记]第32条:始终不要修改__proto__属性

    __proto__属性很特殊,它提供了Object.getPrototypeOf方法所不具备的额外能力,即修改对象原型链接的能力. 避免修改__proto__属性的最明显的原因是可移植性的问题.并不是 ...

  7. SQL 语句修改列名 属性 默认值

    --修改字段名exec sp_rename '表名.列名','新列名' --修改字段属性alter table 表名 alter column 列名 nvarchar(100) null; --修改默 ...

  8. 修改html 属性,css样式。

    一 通过修改标签属性来改变它的样式  js设置和获取标签的属性 <script type="text/javascript"> window.onload = func ...

  9. PowerShell 批量修改AD属性

    环境:win 2008 R2 在管理工具中打开用于 windows powershell 的ActiveDirectory模块命令行窗口或打开命令提示符窗口输入PowerShell回车再输入impor ...

随机推荐

  1. 利用shell脚本函数实现网络连通性的检测

    通常情况下,linux系统网络连通性的检测有两种方法: 1.通过“ping指令 + 目标IP” 或者 “ping指令 + 目标IP域名” 注意针对IPv6地址的IP网络检测需要试用ping6,同时pi ...

  2. 搭建splinter+python环境时遇到的错误

    因为不想用urllib2了,没有用过splinter,今天就想试试,毕竟后者支持的功能更人性化/自动化. 1,安装splinter 安装过程很简单,安装了pip的话,执行: $ [sudo] pip ...

  3. mobile优化

    原文: http://queue.acm.org/detail.cfm?id=2510122 译文: http://www.w3cfuns.com/forum.php?mod=viewthread&a ...

  4. uva 10032 Problem F: Tug of War

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

  5. 2015第27周三Java内存模型

    自己写的代码,6个月不看也是别人的代码,自己学的知识也同样如此,学完的知识如果不使用或者不常常回顾,那么还不是自己的知识. 要认识java线程安全,必须了解两个主要的点:java的内存模型,java的 ...

  6. Manor

    Description Bob有n个正整数,他将这n个整数根据大小划分成两部分.对于小于等于k的整数放在集合A中,其余的放在集合B中.每次他从集合B中取出一个最大的值,将其变成0放入A集合中.然后将A ...

  7. codevs1033 蚯蚓的游戏问题

    题目描述 Description 在一块梯形田地上,一群蚯蚓在做收集食物游戏.蚯蚓们把梯形田地上的食物堆积整理如下: a(1,1)  a(1,2)…a(1,m) a(2,1)  a(2,2)  a(2 ...

  8. java模拟http post

    我们将使用java.net.URLConnection来完成一次post请求,假设要post数据到http://localhost:8080/doSome上: URLConnection urlCon ...

  9. Geeks Interview Question: Ugly Numbers

    Ugly numbers are numbers whose only prime factors are 2, 3 or 5. The sequence1, 2, 3, 4, 5, 6, 8, 9, ...

  10. Lesson2.1:LinkedList、ConcurrentLinkedQueue、LinkedBlockingQueue对比分析

    写这篇文章源于我经历过的一次生产事故,在某家公司的时候,有个服务会收集业务系统的日志,此服务的开发人员在给业务系统的sdk中就因为使用了LinkedList,又没有做并发控制,就造成了此服务经常不能正 ...