查看: 2486|回复: 11

读取到的NODE对象能设置alpha(透明值)吗

[复制链接]

该用户从未签到

发表于 2010-3-4 16:54:23 | 显示全部楼层 |阅读模式
好~

最近做一个fade in fade out(渐变)的效果

我已经可以吧整个画面做成效果 但是 我只希望整个舞台上只有我指定的节点
能有fade in fade out(渐变)的效果

不是osg::Geometry

是我通过osg::Node* modelNode = osgDB::readNodeFile(name);
得到之后的节点对象modelNode

这个对象在响应某事件之后 渐渐变淡直至消失。
或者响应某事件 渐渐显现

多谢高手指点

该用户从未签到

 楼主| 发表于 2010-3-4 17:02:26 | 显示全部楼层
另外 我看了另一个帖子
《3ds模型怎样变色啊?》

这个不是osg::Geometry对象 而是节点对象呢
怎么得到并添加修改colorArray呢?

还有是不是我的概念理解就是错误的呢?
osg::Geometry对象和节点对象 就不是同一个类有可比性的东西呢?

该用户从未签到

发表于 2010-3-4 17:03:14 | 显示全部楼层
这要看您自己的渐变效果是如何实现的。如果是在回调中控制StateSet的属性来完成,那么只要给指定的节点设置StateSet就可以了

此外我看不出您的标题和帖子内容有什么直接关系

该用户从未签到

 楼主| 发表于 2010-3-4 17:05:19 | 显示全部楼层
汗 sorry
这个题目的言词没组织好

还有我在2楼的疑问 能帮我讲一下吗

该用户从未签到

发表于 2010-3-4 22:52:17 | 显示全部楼层
对于节点对象,向下遍历直至找到它所包含的所有Geometry,并根据自己的需要修改其中的信息。只有Geode节点才会包含Geometry对象,而Group节点可能包含另外的Group节点或Geode节点。这些基本概念的学习请首先阅读Paul Martz的《快速入门指导》

该用户从未签到

 楼主| 发表于 2010-3-5 08:46:31 | 显示全部楼层
非常感谢~
我去看看资料

该用户从未签到

 楼主| 发表于 2010-3-5 12:30:40 | 显示全部楼层
资料看完了 大概理解了点
    刚刚接触3d图像编程 很多专业名词还不是很懂

去openSceneGraph的官网看了下 找到个方法就是能把3d的模型文件改变透明值

*******I am souce code**************
Hi,

Yes you can do it with a osg::BlendFunc, just like that :

osg::BlendFunc    *blendFunc = new osg::BlendFunc();
osg::BlendColor    *blendColor= new osg::BlendColor(osg::Vec4(1, 1, 1, 0.0));

blendFunc->setSource(osg::BlendFunc::CONSTANT_ALPHA);
blendFunc->setDestination(osg::BlendFunc::ONE_MINUS_CONSTANT_ALPHA);
node->getOrCreateStateSet()->setAttributeAndModes(blendFunc,osg::StateAttribute::ON);
node->getOrCreateStateSet()->setAttributeAndModes(blendColor,osg::StateAttribute::ON);

Then just update the blendColor's constant color (with
blendColor->setConstantColor()) by changing its alpha value.

I've done it by making a node callback which updates this value using a
simple timer.
*******I am souce code**************

用了这个仁兄的方法 试了 果然可以通过响应事件 来改变读入的3d模型的透明值

但是 旧的问题解决了 新的问题又出现了~~ 汗~~
由于是整个模型的透明值改变了 我本来是模型有一部分是玻璃材质 本来是透明的 可以看到玻璃里面的
结果 整体的透明值提高了 我的玻璃变成了不再透明的(水泥墙)

难道真的要遍历节点下面所有的Geometry,然后每一个同时修给其透明值吗
我的3d模型有100多M 如果遍历的话 机器估计是抗不住的~~

哎 没有别的 更好的方法呢

该用户从未签到

发表于 2010-3-5 12:45:09 | 显示全部楼层
所谓的设置透明,就是进行Alpha检验和Blend融混操作。比起您搜索的那个方法,直接设置节点的getOrCreateStateSet()->setRenderingHint(TRANSPARENT_BIN)会更简单一些。

而图像融混的结果是需要您自己去判断的,既然您的模型中已经存在经过1-alpha融混的部分,那么再次融混就会使得它变得“不透明”,您应当提前预知了这种情况。

因此,对于您的情况,不存在“更好的方法”。唯有自己去修改模型或者遍历模型并处理Geometry。此外,100M的模型实在是小意思~~

该用户从未签到

 楼主| 发表于 2010-3-5 12:46:55 | 显示全部楼层
本帖最后由 youmikoko 于 2010-3-5 13:20 编辑

呵呵 想到一个方法 那就是 把玻璃和本体分离开 做成不同的节点
这样就能只改变本体节点对象的透明值 而不影响玻璃的透明值
这样就需要多个3d模型了

不过 这个方法有点投机的感觉 有没有技术上的方法呢

by the way
----那么再次融混就会使得它变得“不透明”,您应当提前预知了这种情况。
answer: 这个真不知道 美工给的3ds文件 不太清楚这个的原理

----100M的模型实在是小意思
answer:我做的是osgART 还要加上摄像头读取marker坐标系并且和模型坐标的换算
           所以100m的模型 基本跑不动

该用户从未签到

发表于 2010-3-5 12:54:21 | 显示全部楼层
技术上的方法就是这种思路:优化和分割模型,制定严格的建模规范,使用公共纹理,建立多层次模型,等等。不要把所有的问题都放在设计代码的层面来解决,而是要尽可能地在数据准备阶段简化问题,把更多的精力和CPU、GPU用到渲染效率和效果的实现上来

该用户从未签到

 楼主| 发表于 2010-3-5 13:14:07 | 显示全部楼层
呵呵~~

优化和分割模型,制定严格的建模规范,使用公共纹理,建立多层次模型
说的很棒

让我想起来了 java的类和函数设计的原理 一样

我过于拘泥于代码的效率优化上了~  

谢了
可以结贴了

该用户从未签到

发表于 2010-7-14 17:04:20 | 显示全部楼层
8# array
array,
"直接设置节点的getOrCreateStateSet()->setRenderingHint(TRANSPARENT_BIN)会更简单一些"
您的这个方法,alpha的参数从哪里传进去呢?谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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