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;
}