查看: 2717|回复: 7

osgearth与spark结合

[复制链接]

该用户从未签到

发表于 2014-4-14 17:12:50 | 显示全部楼层 |阅读模式
我的程序是基于osgearth开发的场景,包括地形和影像数据。我参考arrary的osgRecipes工程中的osgspark的demo,将雨滴粒子添加到场景,但是在地形场景中看不到粒子效果。请教这是什么原因?

我的代码如下:


//创建spark节点
osg::ref_ptr<osg::Node> osgspark::createSparkNode(const osg::BoundingBox& bbox)
{
        SPK::randomSeed = static_cast<unsigned int>( time(NULL) );
        SPK::System::setClampStep( true, 0.1f );
        SPK::System::useAdaptiveStep( 0.001f, 0.01f );

        osg::ref_ptr<SparkDrawable> spark = new SparkDrawable;

        switch ( m_sparkType )
        {
        case 1:  // Explosion
                spark->setBaseSystemCreator( &createExplosion );
                spark->addParticleSystem();
                spark->setSortParticles( true );
                spark->addImage( "explosion", osgDB::readImageFile(m_strexplosion), GL_ALPHA );
                spark->addImage( "flash", osgDB::readImageFile(m_strflash), GL_RGB );
                spark->addImage( "spark1", osgDB::readImageFile(m_strspark1), GL_RGB );
                spark->addImage( "spark2", osgDB::readImageFile(m_strspark2), GL_ALPHA );
                spark->addImage( "wave", osgDB::readImageFile(m_strwave), GL_RGBA );
                break;
        case 2:  // Fire
                spark->setBaseSystemCreator( &createFire );
                spark->addParticleSystem();
                spark->addImage( "fire", osgDB::readImageFile(m_strfire), GL_ALPHA );
                spark->addImage( "explosion", osgDB::readImageFile(m_strexplosion), GL_ALPHA );
                break;
        case 3:  // Rain
                spark->setBaseSystemCreator( &createRain, true );  // Must use the proto type directly
                spark->addImage( "waterdrops", osgDB::readImageFile(m_strwaterdrops), GL_ALPHA );
                break;
        case 4:  // Smoke
                spark->setBaseSystemCreator( &createSmoke );
                spark->addParticleSystem();
                spark->addImage( "smoke", osgDB::readImageFile(m_strsmoke), GL_RGBA );
                //trackingModel = true;
                break;
        default:  // Simple
                spark->setBaseSystemCreator( &createSimpleSystem );
                spark->addParticleSystem();
                spark->addImage( "flare", osgDB::readImageFile(m_strflare), GL_ALPHA );
                break;
        }

        sparkhander = new SparkUpdatingHandler;
        sparkhander->addSpark( spark.get() );

        osg::ref_ptr<osg::Geode> geode = new osg::Geode;
        geode->addDrawable( spark.get() );
        geode->getOrCreateStateSet()->setRenderingHint( osg::StateSet::TRANSPARENT_BIN );
        geode->getOrCreateStateSet()->setMode( GL_LIGHTING, osg::StateAttribute::OFF );
        geode->getOrCreateStateSet()->setRenderBinDetails(10,"DepthSortedBin");



        return geode.get();
}

        //添加spark节点
        osgspark* pspark = new osgspark(SPARK_RAIN);

        //Explosion
        pspark->m_strexplosion = "explosion.bmp";
        pspark->m_strflash = "flash.bmp";
        pspark->m_strspark1 = "data\\spark1.bmp";
        pspark->m_strspark2 = "point.bmp";
        pspark->m_strwave = "wave.bmp";
        //Fire
        pspark->m_strfire = "fire2.bmp";
        //Rain
        pspark->m_strwaterdrops = "waterdrops.bmp";
        //Smoke
        pspark->m_strsmoke = "smoke.png";
        //Simple
        pspark->m_strflare = "flare.bmp";

       
        //get boundingbox
        osg::ComputeBoundsVisitor boundsVistor ;
        root->accept(boundsVistor);
        osg::BoundingBox bbox = boundsVistor.getBoundingBox();
        root->getBound();

        osg::ref_ptr<osg::Node> pNode = pspark->createSparkNode(bbox);
       
        sceneview->addEventHandler( pspark->sparkhander.get() );

        osg::ref_ptr<osg::MatrixTransform> geode_matrix = new osg::MatrixTransform;
        geode_matrix->addChild(pNode.get());       
        geode_matrix->setMatrix(osg::Matrix::scale(bbox.radius()/2.0,bbox.radius()/2.0,bbox.radius()/2.0)*osg::Matrix::translate(bbox.center()));
        root->addChild(geode_matrix.get());

该用户从未签到

发表于 2014-4-17 10:44:55 | 显示全部楼层
雨的特效范围太小,相对于地球这个大场景,容易找不到

该用户从未签到

 楼主| 发表于 2014-4-18 20:37:38 | 显示全部楼层
ago 发表于 2014-4-17 10:44
雨的特效范围太小,相对于地球这个大场景,容易找不到

是的,我已经解决了。谢谢!

该用户从未签到

发表于 2014-6-1 12:35:24 | 显示全部楼层
lijieguang2124 发表于 2014-4-18 20:37
是的,我已经解决了。谢谢!

怎么解决的,望回答

该用户从未签到

 楼主| 发表于 2014-6-2 12:10:12 | 显示全部楼层
风云轩 发表于 2014-6-1 12:35
怎么解决的,望回答

参照array的例子就可以,只需要把粒子的位置设置正确。

该用户从未签到

发表于 2014-6-3 19:55:43 | 显示全部楼层
lijieguang2124 发表于 2014-6-2 12:10
参照array的例子就可以,只需要把粒子的位置设置正确。

好的,谢谢

该用户从未签到

发表于 2015-4-3 10:40:08 | 显示全部楼层
请问楼主有Spark在vs2010的编译包吗?

该用户从未签到

 楼主| 发表于 2015-4-4 11:09:32 | 显示全部楼层
xinqing3604 发表于 2015-4-3 10:40
请问楼主有Spark在vs2010的编译包吗?

好像没有VS2010的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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