cesium化繁为简-粒子系统-模拟下雪(雨)【转】
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript" src="./js/ctx.js"></script>
</head>
<body>
<div id="cesiumContainer">
</div>
<div id="toolbar">
</div>
<script>
var initCesium = new InitCesium();
var viewer = initCesium.initViewer('cesiumContainer', {
shouldAnimate : true,
terrainProvider: Cesium.createWorldTerrain()
});
var scene = viewer.scene;
scene.globe.depthTestAgainstTerrain = true;
scene.camera.setView({
destination : new Cesium.Cartesian3(277096.634865404, 5647834.481964232, 2985563.7039122293),
orientation : {
heading : 4.731089976107251,
pitch : -0.32003481981370063
}
});
// snow
var snowParticleSize = scene.drawingBufferWidth / 100.0;//例子系统大小
var snowRadius = 100000.0;//雪的半径
var minimumSnowImageSize = new Cesium.Cartesian2(snowParticleSize, snowParticleSize);//最小 雪大小
var maximumSnowImageSize = new Cesium.Cartesian2(snowParticleSize * 2.0, snowParticleSize * 2.0);//最大 雪大小
var snowSystem;
var snowGravityScratch = new Cesium.Cartesian3();//竖直位置--名词存疑-实际上是一个坐标
//每个粒子系统在仿真过程种,都会调用更新回调函数来修改粒子的属性。
// 回调函数传过两个参数,一个是粒子本身,另一个是仿真时间步长
var snowUpdate = function(particle, dt) {
//计算提供的笛卡尔坐标的标准化形式
snowGravityScratch = Cesium.Cartesian3.normalize(particle.position, snowGravityScratch);
//所提供的标量对所提供的笛卡尔分量进行多重变换。最后写入到snowGravityScratch中,随机下落的距离
Cesium.Cartesian3.multiplyByScalar(snowGravityScratch, Cesium.Math.randomBetween(-30.0, -300.0), snowGravityScratch);
//粒子速度,两个笛卡尔坐标相加--赋值到第三个分量中,等价于速度自增velocity+=velocity
particle.velocity = Cesium.Cartesian3.add(particle.velocity, snowGravityScratch, particle.velocity);
//判断相机位置距离,
var distance = Cesium.Cartesian3.distance(scene.camera.position, particle.position);
//如果距离大于雪的半径,则透明度为0,否则逐渐增加
if (distance > snowRadius) {
particle.endColor.alpha = 0.0;
} else {
particle.endColor.alpha = snowSystem.endColor.alpha / (distance / snowRadius + 0.1);
}
};
snowSystem = new Cesium.ParticleSystem({
modelMatrix : new Cesium.Matrix4.fromTranslation(scene.camera.position),//粒子系统发射器的位置
minimumSpeed : -1.0,//最小速度
maximumSpeed : 0.0,//最大速度
lifetime : 15.0,//例子生命周期长度
emitter : new Cesium.SphereEmitter(snowRadius), //例子系统发射器,包裹圆形,椭圆,盒子,cone形状的发射器
startScale : 0.5,//起始比例
endScale : 1.0,//终止比例
image : '../data/snowflake_particle.png',
emissionRate : 7000.0,//每秒发射的粒子数量
startColor : Cesium.Color.WHITE.withAlpha(0.0),//起始颜色
endColor : Cesium.Color.WHITE.withAlpha(1.0),//终止颜色
minimumImageSize : minimumSnowImageSize,//最小大小
maximumImageSize : maximumSnowImageSize,//最大大小
updateCallback : snowUpdate
});
scene.primitives.add(snowSystem);
</script>
</body>
</html>
————————————————
原文链接:https://blog.csdn.net/A873054267/article/details/103551730