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>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值