zoukankan      html  css  js  c++  java
  • 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

    饮水思源,不忘初心。 要面包,也要有诗和远方。
  • 相关阅读:
    Java连接操作redis
    redis 6.0.x简介和安装
    设计模式之代理模式(proxy)
    设计模式之组合模式(composize)
    Linux Shell脚本调试方法
    linuxcfg.sh
    反向代理和正向代理区别
    WAF与IPS的区别总结
    【LemonCK】jQuery的基本使用
    【LemonCK】CSS盒子塌陷问题
  • 原文地址:https://www.cnblogs.com/mazhenyu/p/14930563.html
Copyright © 2011-2022 走看看