查看: 2045|回复: 9

osg 导弹尾焰分叉问题

[复制链接]

该用户从未签到

发表于 2012-11-7 11:27:46 | 显示全部楼层 |阅读模式
大家好,我用粒子系统做导弹尾焰时遇到一个问题,当导弹禁止时,效果还过得去 2012-11-07_111653.png ,但是当导弹动起来后,后面的尾焰就分叉了!如图 2012-11-07_111520.png

下面是做尾焰的代码
std::string textureFile("../data/model/image/fire3.png");
    osg::ref_ptr<osgParticle:articleSystem> ps = new osgParticle::ParticleSystem;
        ps->getDefaultParticleTemplate().setLifeTime(0.2);
        ps->getDefaultParticleTemplate().setShape( osgParticle::Particle::POINT );
        ps->setParticleScaleReferenceFrame(osgParticle::ParticleSystem:OCAL_COORDINATES);

        //ps->setDefaultAttributes( textureFile, false, false, 0 );
        ps->setDefaultAttributes( textureFile, true, false, 0 );

        stateset = ps->getOrCreateStateSet();
        stateset->setAttribute( new osg::Point(pointSize) );
        stateset->setTextureAttributeAndModes( 0, new osg::PointSprite, osg::StateAttribute::ON );

        emitter = new osgParticle::ModularEmitter;
        emitter->setReferenceFrame(osgParticle::ParticleProcessor::RELATIVE_RF);
    emitter->setParticleSystem( ps.get() );

    osg::ref_ptr<osgParticle::ModularProgram> program = new osgParticle::ModularProgram;
        program->setReferenceFrame(osgParticle::ParticleProcessor::RELATIVE_RF);
    program->setParticleSystem( ps.get() );
        // Emit specific number of particles every frame
    osg::ref_ptr<osgParticle::RandomRateCounter> rrc = new osgParticle::RandomRateCounter;
    rrc->setRateRange( 1000, 1000 );

        osgParticle::RadialShooter *shooter = new osgParticle::RadialShooter;
        shooter->setInitialSpeedRange(-10, -10);
        shooter->setThetaRange(0, 0); // radians, relative to Z axis.
        emitter->setShooter(shooter);
    // Accelerate particles in the given gravity direction.
    osg::ref_ptr<osgParticle::AccelOperator> accel = new osgParticle::AccelOperator;
    accel->setToGravity(-1);

    emitter->setCounter( rrc.get() );
        program->addOperator(accel);

    emitterAndprogram= new osg::MatrixTransform;
        emitterAndprogram->setMatrix(osg::Matrix::rotate(-osg::PI_2,1,0,0)*osg::Matrix::translate(0,-4,0));
    emitterAndprogram->addChild( emitter.get() );
    emitterAndprogram->addChild( program.get() );

    updater = new osgParticle::ParticleSystemUpdater;
    updater->addParticleSystem( ps.get() );

    psGeode = new osg::Geode;
    psGeode->addDrawable( ps.get() );

这下面是放置尾焰的代码
//尾焰节点放在这里
        MissleTrail  missleTrail;
        mPlume = new osg::MatrixTransform();
        mPlume->addChild(missleTrail.getEmitterAndProgram());
        mPlume->addChild( missleTrail.getUpdater());
        mPlume->addChild( missleTrail.getParticleSystemGeode() );
大家帮忙看看,什么地方有问题,谢谢!

该用户从未签到

发表于 2012-11-8 14:42:18 | 显示全部楼层
你的地形为啥这么亮?如何处理了?我的好黑,只有从上面看可以

该用户从未签到

发表于 2012-11-9 15:07:44 | 显示全部楼层
您可以尝试去掉AccelOperator,因为尾焰一般不会明显看出重力的影响来

该用户从未签到

 楼主| 发表于 2012-11-9 20:57:02 | 显示全部楼层
liushui 发表于 2012-11-8 14:42
你的地形为啥这么亮?如何处理了?我的好黑,只有从上面看可以

呵呵,不好意思,这我不太清楚,我的任务是做尾焰

该用户从未签到

 楼主| 发表于 2012-11-9 21:02:11 | 显示全部楼层
array 发表于 2012-11-9 15:07
您可以尝试去掉AccelOperator,因为尾焰一般不会明显看出重力的影响来

嗯,重力是有点影响,去掉好点了,主要是他们飞行轨迹有点问题。
array,再问你个问题,速度很快时,尾焰很长,我看论坛里有通过改源码解决了的,我改了还是无效,通过减小生命周期以及减小速度也不行。。你觉得还有其他什么解决方案么?谢谢

该用户从未签到

发表于 2012-11-12 14:11:27 | 显示全部楼层
您提到的方法就是解决方案,只是您可能没设置正确的值而已

该用户从未签到

发表于 2012-11-12 22:08:27 | 显示全部楼层
给尾焰一个变换节点,这样尾焰相当于一直静止。

该用户从未签到

发表于 2012-11-12 22:08:33 | 显示全部楼层
给尾焰一个变换节点,这样尾焰相当于一直静止。

该用户从未签到

发表于 2012-11-17 11:54:59 | 显示全部楼层
liushui 发表于 2012-11-8 14:42
你的地形为啥这么亮?如何处理了?我的好黑,只有从上面看可以

加个sky_light试试

该用户从未签到

发表于 2012-11-18 22:26:09 | 显示全部楼层
liushui 发表于 2012-11-8 14:42
你的地形为啥这么亮?如何处理了?我的好黑,只有从上面看可以

地面模型关掉光照就行了吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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