查看: 1708|回复: 8

求助 粒子系统的问题

[复制链接]

该用户从未签到

发表于 2012-8-8 11:44:07 | 显示全部楼层 |阅读模式
我用OSG的粒子系统做了个差不多的飞机尾焰 加在飞机模型里  然后写成**.osg格式的文件 想转成IVE就报错了  osgconv不支持这样的转换么    还有就是 我用这个OSG文件 加载到场景里时  飞机静态的时候 还比较正常 ,可飞机 一旦 移动的时候 尾焰就被拉长了  速度 越快 尾焰越长 该怎么解决呢

该用户从未签到

发表于 2012-8-10 00:04:06 | 显示全部楼层
你的这个问题早就有人问过了 也已经解决了  你搜索一下吧

该用户从未签到

 楼主| 发表于 2012-8-10 09:12:35 | 显示全部楼层
buaahc 发表于 2012-8-10 00:04
你的这个问题早就有人问过了 也已经解决了  你搜索一下吧

我看到了那个帖子。。。
帖子是这样说的
一段时间没来//其实很简单就是在modularEmitter.cpp第75行,将prevEmitterTops,改为emitterToPs就可以了
修改源码生成新的lib 真的需要这样子做么

该用户从未签到

发表于 2012-8-10 13:07:18 | 显示全部楼层
如果Emitter和Updater放置在同一个MT节点下,那么这个MT的运动不会影响到粒子的物理属性,只是单纯的平移操作而已;如果在不同的MT下,那么MT的运动会影响到粒子飞散的效果,例如尾迹等

该用户从未签到

发表于 2012-8-11 02:40:56 | 显示全部楼层
huangcao-ok 发表于 2012-8-10 09:12
我看到了那个帖子。。。
帖子是这样说的
一段时间没来//其实很简单就是在modularEmitter.cpp第75行,将 ...

恩 我说的就是那个帖子。。。
惭愧我自己没试验过。。。
array不是回答您了么,问他~

该用户从未签到

 楼主| 发表于 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);
}

该用户从未签到

发表于 2012-8-14 16:17:26 | 显示全部楼层
您的代码中我没有看到特别的问题,您是否是移动smokeNode来改变整体的位置?还有您的osg版本是多少,osgParticle在2.9.9左右有一次比较大的改动

该用户从未签到

 楼主| 发表于 2012-8-14 21:00:56 | 显示全部楼层
array 发表于 2012-8-14 16:17
您的代码中我没有看到特别的问题,您是否是移动smokeNode来改变整体的位置?还有您的osg版本是多少,osgPar ...

smokeNode是一个尾焰的节点   同样两个尾焰节点用了transform rotate 间隔一定的距离 在飞机的尾巴 然后这两个MT节点同为一个 MT节点下的孩子 获取飞机的位置和姿态来移动和旋转此节点  我用的OSG版本是2.8.2 难道是版本的问题

该用户从未签到

发表于 2012-8-14 21:35:26 | 显示全部楼层
我用PositionAttitudeTransform会出现拉长现象,后改用matrixtransform就可以了。论坛有些帖子,仔细找找也许可以找到答案……
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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