OSG粒子系统应用:喷泉效果

粒子系统主要分为两大类: 
- 一是Effective中已有的效果,如雨雪的效果应用; 
- 二类是一步步从模版,发射器等创建。

关于第一种的使用可以参见上一篇博客OSG粒子系统应用:雨雪效果。本篇博客来使用第二种方式创建一个喷泉的效果。 
废话补多说,直接上代码:

osg::ref_ptr<osg::Node> Fountain::createFountain(osg::Group* parent)
{
    // 设置粒子模板的参数,包括生命周期、颜色、透明度、半径、重量等
    osgParticle::Particle pParticle;
    pParticle.setLifeTime(3);
    pParticle.setColorRange(osgParticle::rangev4(
        osg::Vec4(0.7, 1.0, 1.0, 1.0),
        osg::Vec4(0.8, 1.0, 1.0, 0.0)));
    pParticle.setSizeRange(osgParticle::rangef(0.1f, 0.1f));
    pParticle.setAlphaRange(osgParticle::rangef(1.0f, 0.5f));
    pParticle.setRadius(m_dParticlesSize);
    pParticle.setMass(0.05);

    osg::ref_ptr<osgParticle::ParticleSystem> pParticleSys =
        new osgParticle::ParticleSystem;
    pParticleSys->setDefaultAttributes("Image/smoke.rgb", false, false);
    pParticleSys->setDefaultParticleTemplate(pParticle);

    // 发射器
    osg::ref_ptr<osgParticle::ModularEmitter> pEmitter = new osgParticle::ModularEmitter;
    pEmitter->setParticleSystem(pParticleSys);

    osg::ref_ptr<osgParticle::RandomRateCounter> pRandomCounter = new osgParticle::RandomRateCounter;
    pRandomCounter->setRateRange(osgParticle::rangef(m_dParticlesNum, m_dParticlesNum));
    pEmitter->setCounter(pRandomCounter);

    // 粒子发射枪
    osg::ref_ptr<osgParticle::RadialShooter> pShooter = new osgParticle::RadialShooter;
    pShooter->setInitialSpeedRange(m_dParticlesSpeed, 0);
    pEmitter->setShooter(pShooter);

    // 速度细节控制
    osg::ref_ptr<osgParticle::ModularProgram> pProgram = new osgParticle::ModularProgram;
    pProgram->setParticleSystem(pParticleSys);
    osg::ref_ptr<osgParticle::AccelOperator> pAccelOperator = new osgParticle::AccelOperator;
    pAccelOperator->setToGravity();
    pProgram->addOperator(pAccelOperator);
    osg::ref_ptr<osgParticle::FluidFrictionOperator> pOperator = new osgParticle::FluidFrictionOperator;
    pOperator->setFluidToAir();
    pProgram->addOperator(pOperator);

    osg::ref_ptr<osg::Geode> pGeode = new osg::Geode;
    pGeode->addDrawable(pParticleSys);
    parent->addChild(pEmitter);
    parent->addChild(pProgram);
    parent->addChild(pGeode);

    osg::ref_ptr<osgParticle::ParticleSystemUpdater> pParticleSysUpdate =
        new osgParticle::ParticleSystemUpdater;
    pParticleSysUpdate->addParticleSystem(pParticleSys);
    return pParticleSysUpdate;
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52

创建粒子的时候传入一个osg::Group*参数,创建成功后,返回一个osg::Node*值,这个Node还可以成为传入参数的子节点。

PS:此篇博客代码以及前几篇的均已放在github,欢迎获取,欢迎交流!

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值