|
楼主 |
发表于 2012-8-13 10:35:43
|
显示全部楼层
array 发表于 2012-8-10 13:07
如果Emitter和Updater放置在同一个MT节点下,那么这个MT的运动不会影响到粒子的物理属性,只是单纯的平移操 ...
array老师 我的Emitter 和Updater 是在同一个MT节点下的 但还是尾焰拖长 下面是代码 您看看 哪有什么问题么 谢谢了
void CPlaneTailFireInstance::createPlaneTailFire(osg::MatrixTransform *smokeNode)
{
// 创建粒子对象,设置其属性并交由粒子系统使用。
//osgParticle:article particleTempalte;
m_ParticleTempalte.setShape(osgParticle::Particle:UAD);
m_ParticleTempalte.setLifeTime(1.00); // 单位:秒
m_ParticleTempalte.setSizeRange (osgParticle::rangef(0.425f,
0.425f)); // 单位:米
m_ParticleTempalte.setAlphaRange(osgParticle::rangef(1.0,1.0));
m_ParticleTempalte.setColorRange(osgParticle::rangev4(
osg::Vec4(0.1f,0.3f,0.4f,1.0f),//0.1f,0.3f,0.4f,1.0f
osg::Vec4(0.0f,0.0f,0.0f,0)//0.95f,0.75f,0,1(1,1,1,1)
));
m_ParticleTempalte.setPosition(osg::Vec3(0.0f,0.0f,0.0f));
m_ParticleTempalte.setSizeInterpolator (new osgParticle::
LinearInterpolator);
m_ParticleTempalte.setAlphaInterpolator (new osgParticle::
LinearInterpolator);
m_ParticleTempalte.setColorInterpolator (new osgParticle::
LinearInterpolator);
// 创建并初始化粒子系统。
m_pParticleSystem->setDataVariance(osg::Node::STATIC);
// 设置材质,是否放射粒子,以及是否使用光照。
m_pParticleSystem->setDefaultAttributes ("e:\\smoke.rgb",true,
false);
osg::Geode *geode = new osg::Geode;
m_pGeode->addDrawable(m_pParticleSystem);
smokeNode->addChild(m_pGeode);
//设置为粒子系统的缺省粒子对象。
m_pParticleSystem ->setDefaultParticleTemplate (m_ParticleTempalte);
//获取放射极中缺省计数器的句柄,调整每帧增加的新粒
//子数目
m_pParticleGenerateRate->setRateRange(200,200);
// 每秒新生成的粒子范围
m_pParticleGenerateRate ->setDataVariance (osg::Node::
DYNAMIC);
// 自定义一个放置器,这里创建并初始化一个点放置器
m_pParticlePlacer->setCenter(osg::Vec3(0.0f,0.0f,0.0f));
m_pParticlePlacer->setDataVariance(osg::Node::STATIC);
// 自定义一个弧度发射器
// 设置发射器的属性
m_pParticleShooter->setDataVariance (osg::Node:YNAMIC);
m_pParticleShooter->setThetaRange(0.0f,0.0f);
// 弧度值,与Z 轴夹角
m_pParticleShooter->setPhiRange(0.0f,0.0f);
m_pParticleShooter->setInitialSpeedRange(2.0f,3.0f);//单位:米/秒
//创建标准放射极对象
m_pEmitter->setDataVariance(osg::Node::DYNAMIC);
m_pEmitter->setCullingActive(false);
// 将放射极对象与粒子系统关联。
m_pEmitter->setParticleSystem(m_pParticleSystem);
// 设置计数器
m_pEmitter->setCounter(m_pParticleGenerateRate);
// 设置放置器
m_pEmitter->setPlacer(m_pParticlePlacer);
// 设置发射器
m_pEmitter->setShooter(m_pParticleShooter);
// 把放射极添加为变换节点
smokeNode->addChild(m_pEmitter);
// 添加更新器,以实现每帧的粒子管理。
osgParticle::ParticleSystemUpdater *particleSystemUpdater
= new osgParticle::ParticleSystemUpdater;
// 将更新器与粒子系统对象关联。
particleSystemUpdater ->addParticleSystem (m_pParticleSystem);
// 将更新器节点添加到场景中。
smokeNode->addChild(particleSystemUpdater);
// 创建标准编程器对象并与粒子系统相关联。
osgParticle::ModularProgram *particleMoveProgram = new osgParticle::ModularProgram;
particleMoveProgram ->setParticleSystem (m_pParticleSystem);
// 最后,将编程器添加到场景中。
smokeNode->addChild(particleMoveProgram);
} |
|