粒子火焰特效

js引用代码

//设定火灾的坐标
    var particleSystem;
    function addfire(position) {
        //    viewer.camera.zoomIn(1000000);  114.72981, 23.706387
     /*     var staticPosition=staticPositions; 114.72749099157829, 23.7058309496897708, 51*/
        viewer.entities.removeById('uniqueId');
        var staticPosition = Cesium.Cartesian3.fromDegrees(114.72947391009367,23.705717414432744, 51);//静止的位置,火焰的位置
        viewer.camera.flyTo({ // 精确定位
               destination : new Cesium.Cartesian3.fromDegrees(114.72947391009367,23.705717414432744, 151),
//               orientation : {
//                   heading: 2.36745498231085,
//                   pitch: -1.52538971696467,
//                   roll:0.0012112433713417485,
//                  //2.00745498231085,-1.5038971696467,0.0012112433713417485
//             }
        });
        var credit=viewer.scene.frameState.creditDisplay;
        $("#toolbarfire").show();
         //Set the random number seed for consistent results.
        var scene = viewer.scene;  
        viewer.entities.removeById("addfire");
        scene.primitives.remove(particleSystem);
        Cesium.Math.setRandomNumberSeed(3);

         //Set bounds of our simulation time
         var start = Cesium.JulianDate.fromDate(new Date(2015, 2, 25, 16));
         var stop = Cesium.JulianDate.addSeconds(start, 360, new Cesium.JulianDate());

         //Make sure viewer is at the desired time.
         viewer.clock.startTime = start.clone();//开始时间
         viewer.clock.stopTime = stop.clone();//
         viewer.clock.currentTime = start.clone();
         viewer.clock.clockRange = Cesium.ClockRange.LOOP_STOP; //Loop at the end
         viewer.clock.multiplier = 1; 
         var viewModel = {
             rate : 5.0,
             gravity : 0.0,
             minimumLife : 1.0,
             maximumLife : 1.0,
             minimumSpeed : 5.0,
             maximumSpeed : 5.0,
             startScale : 1.0,
             endScale : 4.0,
             particleSize : 20.0,
             transX : 2.5,
             transY : 4.0,
             transZ : 1.0,
             heading : 0.0,
             pitch : 0.0,
             roll : 0.0,
             fly : false,
             spin : false,
             show : true
         };

         Cesium.knockout.track(viewModel);
         var toolbar = document.getElementById('toolbarfire');
         Cesium.knockout.cleanNode(toolbar);
         Cesium.knockout.applyBindings(viewModel, toolbar);

         var entityPosition = new Cesium.Cartesian3();
         var entityOrientation = new Cesium.Quaternion();
         var rotationMatrix = new Cesium.Matrix3();
         var modelMatrix = new Cesium.Matrix4();

         function computeModelMatrix(entity, time) {
             var position = Cesium.Property.getValueOrUndefined(entity.position, time, entityPosition);
             if (!Cesium.defined(position)) {
                 return undefined;
             }
             var orientation = Cesium.Property.getValueOrUndefined(entity.orientation, time, entityOrientation);
             if (!Cesium.defined(orientation)) {
                 modelMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(position, undefined, modelMatrix);
             } else {
                 modelMatrix = Cesium.Matrix4.fromRotationTranslation(Cesium.Matrix3.fromQuaternion(orientation, rotationMatrix), position, modelMatrix);
             }
             return modelMatrix;
         }

         var emitterModelMatrix = new Cesium.Matrix4();
         var translation = new Cesium.Cartesian3();
         var rotation = new Cesium.Quaternion();
         var hpr = new Cesium.HeadingPitchRoll();
         var trs = new Cesium.TranslationRotationScale();

         function computeEmitterModelMatrix() {
             hpr = Cesium.HeadingPitchRoll.fromDegrees(viewModel.heading, viewModel.pitch, viewModel.roll, hpr);
             trs.translation = Cesium.Cartesian3.fromElements(viewModel.transX, viewModel.transY, viewModel.transZ, translation);
             trs.rotation = Cesium.Quaternion.fromHeadingPitchRoll(hpr, rotation);
             return Cesium.Matrix4.fromTranslationRotationScale(trs, emitterModelMatrix);
         }

         //Generate a random circular pattern with varying heights.
         function computeCirclularFlight(lon, lat, radius) {
             var property = new Cesium.SampledPositionProperty();
             for (var i = 0; i <= 360; i += 45) {
                 var radians = Cesium.Math.toRadians(i);
                 var time = Cesium.JulianDate.addSeconds(start, i, new Cesium.JulianDate());
                 var position = Cesium.Cartesian3.fromDegrees(lon + (radius * 1.5 * Math.cos(radians)), lat + (radius * Math.sin(radians)), Cesium.Math.nextRandomNumber() * 500 + 1750);
                 property.addSample(time, position);
             }
             return property;
         }

         //计算模型随时间变化的位置
         var circularPosition = computeCirclularFlight(113.95662405441563, 22.773078356865265, 0.03);
         
     /*    for(var i=0,i<5,i++){*/
            var entity = viewer.entities.add({ 
                 //Set the entity availability to the same interval as the simulation time.
                 availability : new Cesium.TimeIntervalCollection([new Cesium.TimeInterval({
                     start : start,
                     stop : stop
                 })]),
                 position : staticPosition,
                id : 'addfire'
             });
     /*    }*/
         // viewer.trackedEntity = entity; //添加实体以实体为中心点
            
           particleSystem = scene.primitives.add(new Cesium.ParticleSystem({
             image :'/Prison3D/imges/fire.png', ///Prison3D/WebContent/imges/fire.png

             startColor : Cesium.Color.RED.withAlpha(0.7),
             endColor : Cesium.Color.YELLOW.withAlpha(0.6),

             startScale : viewModel.startScale,
             endScale : viewModel.endScale,

             minimumLife : viewModel.minimumLife,
             maximumLife : viewModel.maximumLife,

             minimumSpeed : viewModel.minimumSpeed,
             maximumSpeed : viewModel.maximumSpeed,

             minimumWidth : viewModel.particleSize,
             minimumHeight : viewModel.particleSize,

             maximumWidth : viewModel.particleSize,
             maximumHeight : viewModel.particleSize,
          
             // Particles per second.
             rate : viewModel.rate, 
             bursts : [
                 new Cesium.ParticleBurst({time : 5.0, minimum : 300, maximum : 500}),
                 new Cesium.ParticleBurst({time : 10.0, minimum : 50, maximum : 100}),
                 new Cesium.ParticleBurst({time : 15.0, minimum : 200, maximum : 300})
             ],
             lifeTime :  0.8, //每个粒子的生存时间
            emitter : new Cesium.CircleEmitter(0.5), 
         /*   emitter :   new Cesium.ConeEmitter(Cesium.Math.toRadians(45.0)),*/
             emitterModelMatrix : computeEmitterModelMatrix(),
             forces : [applyGravity]
         }));

         var gravityScratch = new Cesium.Cartesian3();

         //重力效果
         function applyGravity(p, dt) {
             // We need to compute a local up vector for each particle in geocentric space.
             var position = p.position;
             Cesium.Cartesian3.normalize(position, gravityScratch);
             Cesium.Cartesian3.multiplyByScalar(gravityScratch, viewModel.gravity * dt, gravityScratch);

             p.velocity = Cesium.Cartesian3.add(p.velocity, gravityScratch, p.velocity);
         }

         viewer.scene.preRender.addEventListener(function(scene, time) {
             particleSystem.modelMatrix = computeModelMatrix(entity, time);
             // Account for any changes to the emitter model matrix.
             particleSystem.emitterModelMatrix = computeEmitterModelMatrix();
             // Spin the emitter if enabled.
             if (viewModel.spin) {
                 viewModel.heading += 1.0;
                 viewModel.pitch += 1.0;
                 viewModel.roll += 1.0;
             }
         });

         Cesium.knockout.getObservable(viewModel, 'rate').subscribe(
             function(newValue) {
                 particleSystem.rate = parseFloat(newValue);
             }
         );

         Cesium.knockout.getObservable(viewModel, 'particleSize').subscribe(
             function(newValue) {
                 var particleSize = parseFloat(newValue);
                 particleSystem.minimumWidth = particleSize;
                 particleSystem.maximumWidth = particleSize;
                 particleSystem.minimumHeight = particleSize;
                 particleSystem.maximumHeight = particleSize;
             }
         );
          //显示 的类型
         var options = [{
             text : 'Circle',
             onselect : function() {
                  particleSystem.emitter = new Cesium.SphereEmitter(5.0);
             } 
         } ];   
   }
    
    //移除粒子
    function  remofire(){
        viewer.entities.removeById("addfire");
        viewer.scene.primitives.remove(particleSystem);
    }
    
   

 

界面代码

 <div id="toolbar" class="param-container tool-bar"></div>//存放粒子

 <button onclick="addfire('')" >火焰</button> //触发火焰特效  可以输入位置,修改一下对应的参数

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值