查看: 5400|回复: 13

节点颜色设置

[复制链接]

该用户从未签到

发表于 2009-2-24 21:22:03 | 显示全部楼层 |阅读模式
从外部导入一个模型,想改变其节点的一个颜色,但是不知道如何做?
目前代码如下,但是运行的结果节点依然保持原来的颜色,不知道出错在哪?
bool ChangeNodeColor(osg::Node* pNode)
{
if(NULL == pNode)
  return false;
osg::Geode* pGeod = dynamic_cast<osg::Geode*>(pNode);
osg:rawable* pDraw = pGeod->getDrawable(0);
osg::Geometry* pGeom = pDraw->asGeometry();
osg::Vec4Array* colarray = new osg::Vec4Array;     //颜色RGB值数组
colarray->push_back(osg::Vec4f(1.0, 0.0, 0.0, 1.0));//红色
pGeom->setColorArray( colarray );
pGeom->setColorBinding( osg::Geometry::BIND_PER_PRIMITIVE );
pGeom->dirtyDisplayList();
return true;
}

该用户从未签到

发表于 2009-2-24 22:02:53 | 显示全部楼层
你读入的模型是一个Geode类型吗?如果不是的话,最好写一个NodeVisitor,对整个场景进行遍历,然后改变其颜色。
假如你读的模型是一个Geode类型,那么他只有一个Drawable吗?如果不是,最好写个循环将其所有的Drawable都改变颜色试试

该用户从未签到

发表于 2009-2-24 22:46:05 | 显示全部楼层
可以试一试setColorBinding设置为BIND_ALL,因为有可能颜色发生改变的只是很不明显的一个Primitive,以致您没有看到。此外panbin的意见楼主也可以参考一下

该用户从未签到

 楼主| 发表于 2009-2-24 22:46:11 | 显示全部楼层
原帖由 panbin 于 2009-2-24 22:02 发表
你读入的模型是一个Geode类型吗?如果不是的话,最好写一个NodeVisitor,对整个场景进行遍历,然后改变其颜色。
假如你读的模型是一个Geode类型,那么他只有一个Drawable吗?如果不是,最好写个循环将其所有的Drawa ...


节点是Geode类型的,而且Drawable也只有一个,不过显示的结果节点确实没有变颜色

该用户从未签到

 楼主| 发表于 2009-2-24 22:48:40 | 显示全部楼层
原帖由 array 于 2009-2-24 22:46 发表
可以试一试setColorBinding设置为BIND_ALL,因为有可能颜色发生改变的只是很不明显的一个Primitive,以致您没有看到。此外panbin的意见楼主也可以参考一下


这个也试过了,不过还是不行

该用户从未签到

发表于 2009-2-25 00:09:03 | 显示全部楼层
你看看你是否真的获取该节点信息???你也可以通过设置材质~~~~~~~~

该用户从未签到

发表于 2009-2-25 09:14:23 | 显示全部楼层
对了,如果您的节点已经设置了纹理,那么颜色的设置就自动失效了。这也需要检查;或者您可以上传您的工程或者与其产生相同效果的示例程序

该用户从未签到

 楼主| 发表于 2009-2-26 15:30:46 | 显示全部楼层
原帖由 array 于 2009-2-25 09:14 发表
对了,如果您的节点已经设置了纹理,那么颜色的设置就自动失效了。这也需要检查;或者您可以上传您的工程或者与其产生相同效果的示例程序

确实我的节点有纹理,是建模的时候设置的纹理,那么是不是就如array说的节点就不能设置为其他颜色了??

该用户从未签到

 楼主| 发表于 2009-2-26 15:34:52 | 显示全部楼层
原帖由 array 于 2009-2-25 09:14 发表
对了,如果您的节点已经设置了纹理,那么颜色的设置就自动失效了。这也需要检查;或者您可以上传您的工程或者与其产生相同效果的示例程序

确实我的节点有纹理,是建模的时候设置的纹理,那么是不是就如array说的节点就不能设置为其他颜色了??

该用户从未签到

发表于 2009-2-26 15:39:58 | 显示全部楼层
纹理和颜色不能同时使用的,这是OpenGL的要求,就像绑定纹理后glColor不会起作用一样。

该用户从未签到

 楼主| 发表于 2009-2-26 15:41:54 | 显示全部楼层
原帖由 FlySky 于 2009-2-25 00:09 发表
你看看你是否真的获取该节点信息???你也可以通过设置材质~~~~~~~~

不知道这个设置材质是怎么弄的,我看过material的属性,设置下面这些属性来设置颜色的么?
        Vec4 _ambientFront;                          // r, g, b, w
        Vec4 _ambientBack;                           // r, g, b, w

        Vec4 _diffuseFront;                          // r, g, b, w
        Vec4 _diffuseBack;                           // r, g, b, w

        Vec4 _specularFront;                         // r, g, b, w
        Vec4 _specularBack;                          // r, g, b, w

        Vec4 _emissionFront;                         // r, g, b, w
        Vec4 _emissionBack;                          // r, g, b, w
对这个不是特别熟悉。

不好意思,上个帖子回复了两次

该用户从未签到

 楼主| 发表于 2009-2-26 15:45:00 | 显示全部楼层
原帖由 array 于 2009-2-26 15:39 发表
纹理和颜色不能同时使用的,这是OpenGL的要求,就像绑定纹理后glColor不会起作用一样。


哦,原来是这样啊,想请教您一个问题,就是我pick到一个节点,我想显示出pick到的节点,本来是想改变它的颜色,不过看样子是行不通了,不知道您有什么更好的建议没?

该用户从未签到

发表于 2009-2-26 19:08:32 | 显示全部楼层
用ColorMatrix?或者用着色语言实现(不过场景中对象很多的话,这样有些浪费资源哦);或者倍增一下法线坐标,让这个节点亮起来;或者干脆用这个节点的包围盒画一个框之类的……总之让它和别的对象有所区别的方法还是很多的。

该用户从未签到

发表于 2011-9-6 16:35:24 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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