查看: 2890|回复: 15

粒子系统问题?

[复制链接]

该用户从未签到

发表于 2012-3-31 18:26:03 | 显示全部楼层 |阅读模式
我在使用粒子系统时,把粒子系统放置在一个模型上,当模型飞速移动时,会有一些粒子点留尾现象。我本想将粒子系统作为模型的一个部件使用,不知道OSG粒子系统能够实现么??或者有什么替代方案??

谢谢

该用户从未签到

发表于 2012-3-31 19:35:32 | 显示全部楼层
设置一下例子生命期,可以将尾迹减少

该用户从未签到

 楼主| 发表于 2012-4-9 18:12:50 | 显示全部楼层
这是尾迹的截图,设置生命期,尾迹会变得很难看:
代码:
                OSGGroupPtr root = new osg::Group();
                {
                        osgParticle:article ptemplate;

                        ValueParticle valueParticle = GetPropertyParticle();
                        ptemplate.setLifeTime(valueParticle.Life);        // 3 seconds of life

                        ptemplate.setSizeRange(osgParticle::rangef(valueParticle.Size[0],valueParticle.Size[1]));
                        ptemplate.setAlphaRange(osgParticle::rangef(valueParticle.Alpha[0],valueParticle.Alpha[1]));
                        ptemplate.setColorRange(osgParticle::rangev4(Vector4Conv(valueParticle.Color[0]), Vector4Conv(valueParticle.Color[1])));

                        ptemplate.setRadius(valueParticle.Radius);

                        m_OSGParticleSystemPtr = new osgParticle::ParticleSystem;
                        m_OSGParticleSystemPtr->setDefaultAttributes(GetPropertyTexture().File, true, false);
                        m_OSGParticleSystemPtr->setParticleScaleReferenceFrame(osgParticle::ParticleSystem:OCAL_COORDINATES);

                        m_OSGParticleSystemPtr->setDefaultParticleTemplate(ptemplate);

                        m_OSGModularEmitterPtr = new osgParticle::ModularEmitter;
                        m_OSGModularEmitterPtr->setParticleSystem(m_OSGParticleSystemPtr);

                        Vector2 rateRange = GetPropertyRateRange();
                        osgParticle::RandomRateCounter *counter = new osgParticle::RandomRateCounter;
                        counter->setRateRange(rateRange[0], rateRange[1]);
                        m_OSGModularEmitterPtr->setCounter(counter);

                        Vector2 placerRadiusRange = GetPropertyPlacerRadiusRange();
                        osgParticle::SectorPlacer *placer = new osgParticle::SectorPlacer;
                        placer->setCenter(0, 0, 0);
                        placer->setRadiusRange(placerRadiusRange[0],placerRadiusRange[1]);
                        placer->setPhiRange(0, 2 * osg::PI);
                        m_OSGModularEmitterPtr->setPlacer(placer);

                        Vector2 shooterSpeedRange = GetPropertyShooterSpeedRange();
                        osgParticle::RadialShooter *shooter = new osgParticle::RadialShooter;
                        shooter->setThetaRange(0, 0);
                        shooter->setPhiRange(0, 0);
                        shooter->setInitialSpeedRange(shooterSpeedRange[0],shooterSpeedRange[1]);
                        m_OSGModularEmitterPtr->setShooter(shooter);

                        root->addChild(m_OSGModularEmitterPtr);

                        m_OSGModularProgramPtr = new osgParticle::ModularProgram;
                        m_OSGModularProgramPtr->setParticleSystem(m_OSGParticleSystemPtr);
                        m_OSGModularProgramPtr->setReferenceFrame(osgParticle::ParticleProcessor::RELATIVE_RF);

                        root->addChild(m_OSGModularProgramPtr.get());

                        // create a Geode to contain our particle system.
                        osg::Geode *geode = new osg::Geode;
                        geode->addDrawable(m_OSGParticleSystemPtr);

                        // add the geode to the scene graph.
                        root->addChild(geode);
                        //
                        osgParticle::ParticleSystemUpdater *psu = new osgParticle::ParticleSystemUpdater;
                        psu->addParticleSystem(m_OSGParticleSystemPtr);
                        root->addChild(psu);
                }

这段代码是截取部分的,大概结构能够描述清楚

我是把粒子系统放到Root节点下,但不知道卫生么还是有长长的尾迹线,感觉放置器给拉长了

tupian

tupian

该用户从未签到

 楼主| 发表于 2012-4-9 18:15:06 | 显示全部楼层
这种情况只在root节点高速运动时产生

该用户从未签到

发表于 2012-4-9 19:44:30 | 显示全部楼层
给粒子系统一个矩阵变换节点使得它跟随飞行物,然后让它在原地喷。

该用户从未签到

 楼主| 发表于 2012-4-10 09:52:04 | 显示全部楼层
现在就是把粒子系统作为MatrixTransform节点下一个子节点,当调用setMatrix设置大距离矩阵变换时就有问题,如果设置距离变化小的化就很好。
下面连接是其他人也遇到这个问题,但是好像也没有解决,是不是OSG没法解决这个问题呀
http://bbs.osgchina.org/forum.ph ... 3%D7%D3%CF%B5%CD%B3

该用户从未签到

发表于 2012-4-12 09:53:21 | 显示全部楼层
让粒子系统的Emitter跟随飞行器是可行的,在地球上搞飞机尾迹的事情我很早以前就做过了。您目前的方法估计不对

该用户从未签到

 楼主| 发表于 2012-4-13 16:57:40 | 显示全部楼层
这个图是我使用OSG粒子系统的结构,麻烦ARRAY看看,有没有问题,我程序在收到数据后更新MatrixTransform矩阵,按理说应该没有问题,可就是存在留尾现象(位置变化大时出现):(

粒子系统

粒子系统

该用户从未签到

发表于 2012-4-17 10:03:13 | 显示全部楼层
看起来不对,这样不会有尾迹,因为发射器和粒子是在同一个MatrixTransform下的,之间不会有偏移

该用户从未签到

 楼主| 发表于 2012-4-17 11:02:56 | 显示全部楼层
本帖最后由 heven_jing 于 2012-4-17 11:05 编辑

通过Shooter可以让粒子发射,可以有很好的喷射效果////我这边不要尾迹,只是希望在飞行器后边显示喷火效果,但总是 产生一段尾迹,没办法去掉,晕

该用户从未签到

 楼主| 发表于 2012-4-17 12:13:06 | 显示全部楼层
解决了,是放置器 的问题,更改了OSG放置器代码
P->transfromPositionVelocity(....

该用户从未签到

发表于 2012-6-20 19:48:07 | 显示全部楼层
heven_jing 发表于 2012-4-17 12:13
解决了,是放置器 的问题,更改了OSG放置器代码
P->transfromPositionVelocity(....

能不能具体说一下 怎么解决的 我现在也有这问题  
就是卫星在某一处点火,然后按一下键 瞬间到达另一处,会产生很长的尾焰,其实也不是尾焰,直接就是那个火焰例子被拉的很长了。。。估计跟你的问题应该一样,怎么解决的~
等待您的答复啊~

该用户从未签到

 楼主| 发表于 2012-6-27 14:35:06 | 显示全部楼层
一段时间没来//其实很简单就是在modularEmitter.cpp第75行,将prevEmitterTops,改为emitterToPs就可以了

该用户从未签到

发表于 2012-6-29 23:57:35 | 显示全部楼层
heven_jing 发表于 2012-6-27 14:35
一段时间没来//其实很简单就是在modularEmitter.cpp第75行,将prevEmitterTops,改为emitterToPs就可以了

怎么在我们写的代码中实现?
您的意思是修改modularEmitter.cpp第75行的源代码?修改了源代码能在我们程序中得到体现么?还是利用修改的源码生成新的lib?
求解释~
请您点击直接回复吧~
不然我看不到的 哈哈谢谢啊~

该用户从未签到

发表于 2012-6-30 00:19:46 | 显示全部楼层
heven_jing 发表于 2012-6-27 14:35
一段时间没来//其实很简单就是在modularEmitter.cpp第75行,将prevEmitterTops,改为emitterToPs就可以了

好了我明白了 您不用恢复了~

该用户从未签到

发表于 2012-12-9 23:50:42 | 显示全部楼层
我还不懂了,讲清楚一下啊,各位大侠!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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