Cesium实时目标跟踪最新特效教程系列2—粒子系统(实时发射波束跟踪目标)

知识共享许可协议 版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons

cesium粒子特效 实时跟踪目标发射波束, sourEntity 实时发射波束跟踪 tarEntity,官网上给出的demo是随机发射粒子,没有跟踪目标。下面给出了怎样实时发射波束且跟踪目标的。最主要的是粒子系统的updateCallback属性中根据tarEntity的实时位置来实时更新粒子位置。效果图如下

function generateSX(sourEntity,tarEntity){
   var curtime = viewer.clock.currentTime;
   var sourPos = sourEntity.position.getValue(curtime);

    var tarPos= tarEntity.position.getValue(curtime);
     
   var particleEntity = new Cesium.ParticleSystem({
      
         image : getImage(),//粒子形状
         imageSize : new Cesium.Cartesian2(20, 20),//粒子形状大小

         startColor : Cesium.Color.AQUA.withAlpha(0.7),//开始颜色
         endColor : Cesium.Color.WHITE.withAlpha(0.0),//结束颜色

         startScale : viewModel.startScale,//开始大小
         endScale : viewModel.endScale,//结束大小

         minimumSpeed : viewModel.minimumSpeed,//最小速度
         maximumSpeed : viewModel.maximumSpeed,//最大速度

 
         emissionRate : viewModel.emissionRate,
         
         bursts : [
             new Cesium.ParticleBurst({time : 5.0, minimum : 10, 
maximum : 100}),
             new Cesium.ParticleBurst({time : 10.0, minimum : 50,
maximum : 100}),
             new Cesium.ParticleBurst({time : 15.0, minimum : 200,
 maximum : 300})
         ],
         lifetime : 1.0,//生命周期
         loop : true,//是否循环
         modelMatrix:computeModelMatrix(sourEntity),
         emitter : new Cesium.CircleEmitter(2.0),
         emitterModelMatrix : computeEmitterModelMatrix(),

         updateCallback : function(particle,dt){//particle是当前粒子对象,
可以由很多属性,dt是时间步长。之前有一个属性是particleLife表
示每个粒子被发射出来后的生存时间。dt就是将这段时间均分的步长。
下面我们对粒子的位置进行改变。
             var result = new Cesium.Cartesian3();
             var curtime = viewer.clock.currentTime;
             var position= tarEntity.position.getValue(curtime,result);
             if(!Cesium.defined(tarEntity)){//如果目标消失
               scene.primitives.remove(particle);
               return new Cesium.Cartesian3();
            }
            
            if(!Cesium.defined(position)){ //如果获取不到目标实时位置                    
scene.primitives.remove(this);
               return new Cesium.Cartesian3();
            }
            var midpoint1 = Cesium.Cartesian3.midpoint(particle.position,
 position);
            var midpoint2 = Cesium.Cartesian3.midpoint(particle.position,
 midpoint1);
            var positionA = Cesium.Cartesian3.normalize(midpoint2, 
new Cesium.Cartesian3());//将粒子的位置向量正则化为单位值。
            Cesium.Cartesian3.multiplyByScalar(positionA , 1, 
positionA );//将单位向量按比例进行缩放
            particle.position= Cesium.Cartesian3.add(midpoint2, 
positionA , particle.position);//在粒子发射方向加上成比例
缩放的向量,更新粒子位置
         }
     });
    var particleSystem = viewer.scene.primitives.add(particleEntity);
    return particleEntity;
}

猜你喜欢

转载自blog.csdn.net/mingxingHAHA/article/details/95329159