心灬魔 发表于 2015-1-16 18:08:54

关于在osgEarth上创建粒子效果不正常问题

我在osg中做了一个喷泉效果,如图1,状态正常,当我在地球表面获得一个世界坐标以后(坐标值:osg::Vec3d(-1460944.73106, 5518487.81601, 2839320.897);)出现了如图2的失真现象,希望各位大神帮帮忙,代码:

osg::Vec3d worldPos = osg::Vec3d(-1460944.73106, 5518487.81601, 2839320.897);
        osg::Vec3d offset = worldPos;
        offset.normalize();
        worldPos += offset*20;
        osg::Vec3d spherePos = osg::Vec3d(-1460948.82485, 5518482.83934, 2839320.358);
        osg::Group* fountainNode = new osg::Group;
        osg::ref_ptr<osgParticle::ParticleSystem> parSystem = new osgParticle::ParticleSystem;
        parSystem->setDefaultAttributesUsingShaders("Images/smoke.rgb", true, 0);
        parSystem->getDefaultParticleTemplate().setLifeTime(5.0f);
        parSystem->getDefaultParticleTemplate().setShape(osgParticle::Particle::POINT);
        parSystem->setVisibilityDistance(-1.0f);
        osg::StateSet* stateset = parSystem->getOrCreateStateSet();
        stateset->setAttribute(new osg::Point(3));
        stateset->setTextureAttributeAndModes(0, new osg::PointSprite, osg::StateAttribute::ON);

        osg::ref_ptr<osgParticle::RandomRateCounter> counter = new osgParticle::RandomRateCounter;
        counter->setRateRange(15000, 20000);
       
        //重力模拟对象;
        osg::ref_ptr<osgParticle::AccelOperator> accelOperator = new osgParticle::AccelOperator();
        osg::Vec3d asoff = offset*-50;
        accelOperator->setAcceleration(asoff);

        //阻尼运动模拟;
        osg::ref_ptr<osgParticle::DampingOperator> dampingOperator = new osgParticle::DampingOperator;
        dampingOperator->setDamping(0.9f);

        //跳跃模拟;
        osg::ref_ptr<osgParticle::BounceOperator> bounceOperator = new osgParticle::BounceOperator;
        bounceOperator->setFriction(-0.05);
        bounceOperator->setResilience(0.35);
        bounceOperator->addDiskDomain(worldPos-offset*2, offset, 6.0);
        //bounceOperator->addPlaneDomain(osg::Plane(worldPos, 6.0));

        //水槽模拟;
        osg::ref_ptr<osgParticle::SinkOperator> sinkOperator = new osgParticle::SinkOperator;
        sinkOperator->setSinkStrategy(osgParticle::SinkOperator::SINK_OUTSIDE);
        sinkOperator->addSphereDomain(worldPos, 5.5);

        //标准编程对象模块;
        osg::ref_ptr<osgParticle::ModularProgram> program = new osgParticle::ModularProgram;
        program->setParticleSystem(parSystem);
        program->addOperator(accelOperator);
        program->addOperator(dampingOperator);
        //program->addOperator(bounceOperator);
        program->addOperator(sinkOperator);

        osg::ref_ptr<osgParticle::SectorPlacer> placer = new osgParticle::SectorPlacer;
        placer->setCenter(worldPos);

        osg::ref_ptr<osgParticle::RadialShooter> shooter = NULL;
       
        //发射器模块;
        osg::ref_ptr<osgParticle::ModularEmitter> emitter = new osgParticle::ModularEmitter;
        emitter->setParticleSystem(parSystem);
        emitter->setCounter(counter);
        emitter->setPlacer(placer);
        shooter = dynamic_cast<osgParticle::RadialShooter*>(emitter->getShooter());
        shooter->setPhiRange(0, osg::PI);
        shooter->setThetaRange(0, osg::PI*2);
        shooter->setInitialSpeedRange(5, 10);
        if (shooter)
        {
                osgParticle::rangef phiRange = shooter->getPhiRange();
                osgParticle::rangef theRange = shooter->getThetaRange();
        }
        osg::ref_ptr<osg::Geode> geode = new osg::Geode;
        geode->addDrawable(parSystem);
        osg::ref_ptr<osgParticle::ParticleSystemUpdater> parUpdater = new osgParticle::ParticleSystemUpdater;
        parUpdater->addParticleSystem(parSystem);
        fountainNode->addChild(emitter.get());
        fountainNode->addChild(program.get());
        fountainNode->addChild(geode);
        fountainNode->addChild(parUpdater);

friendbaby 发表于 2015-1-16 18:10:33

心魔还需心药医
页: [1]
查看完整版本: 关于在osgEarth上创建粒子效果不正常问题