cesium 粒子系统

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">
  <title>Hello World!</title>
  <link href="../Cesium/Widgets/widgets.css" rel="stylesheet" />
  <script src="../Cesium/Cesium.js"></script>
</head>
<body>
<div id="cesiumContainer" class="fullSize"></div>
<script>
  Cesium.Ion.defaultAccessToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJlZWVhNjZkZS0yZDgzLTRhZGEtOGJkYS1iMWUxNmM3NzNmNmUiLCJpZCI6NjM1MzEsImlhdCI6MTYyODIyNzYyMn0.Swb3G8ZboOXzXXiMLjEXIErFjXXZmbZrFIKXCxtIxnQ';
  var viewer = new Cesium.Viewer("cesiumContainer");
  Cesium.Math.setRandomNumberSeed(3);
  viewer.clock.clockRange = Cesium.ClockRange.LOOP_STOP; //循环结束
  viewer.clock.multiplier = 1;
  viewer.clock.shouldAnimate = true;
  viewer.camera.setView({
    destination: Cesium.Cartesian3.fromDegrees(117, 39, 50)
  });
  //修改参数 看http://cesium.xin/cesium/cn/Documentation1.72/ParticleSystem.html?classFilter=ParticleSystem
  var viewModel = {
    emissionRate:310,
    gravity: 28,
    minimumParticleLife: 0.5,
    maximumParticleLife: 0.6,
    minimumSpeed: 30,
    maximumSpeed: 26,
    startScale: 1,
    endScale: 10,
    particleSize:5,
  };
  // Cesium.knockout.track(viewModel);
  var entityPosition = new Cesium.Cartesian3();
  var entityOrientation = new Cesium.Quaternion();
  var rotationMatrix = new Cesium.Matrix3();
  var modelMatrix = new Cesium.Matrix4();

  function computeModelMatrix(entity, time) {
    return entity.computeModelMatrix(time, new Cesium.Matrix4());
  }

  var emitterModelMatrix = new Cesium.Matrix4();
  var translation = new Cesium.Cartesian3();
  var rotation = new Cesium.Quaternion();
  var hpr = new Cesium.HeadingPitchRoll();
  var trs = new Cesium.TranslationRotationScale();

  function computeEmitterModelMatrix() {
    //控制粒子发射的方向
    hpr = Cesium.HeadingPitchRoll.fromDegrees(0.0, 0.0, 0, hpr);
    trs.translation = Cesium.Cartesian3.fromElements(
            -4.0,
            0.0,
            1.4,
            translation
    );
    trs.rotation = Cesium.Quaternion.fromHeadingPitchRoll(hpr, rotation);

    return Cesium.Matrix4.fromTranslationRotationScale(
            trs,
            emitterModelMatrix
    );
  }
  var entity = viewer.entities.add({
    model: {
      // minimumPixelSize: 64,
    },
    //控制位偏移
    viewFrom: new Cesium.Cartesian3(-100.0, 0.0, 100.0),
    // 控制粒子的位置
    position: Cesium.Cartesian3.fromDegrees(117, 39, 5),
  });
  var scene = viewer.scene;
  var particleSystem = scene.primitives.add(
          new Cesium.ParticleSystem({
            // 用于广告牌的URI,HTMLImageElement或HTMLCanvasElement。
            // image: "../Cesium/Assets/Textures/waterNormals.jpg",
            image: "img_1.png",
            //粒子在其生命初期的颜色。
            startColor: Cesium.Color.LIGHTSEAGREEN.withAlpha(0.7),
            // 粒子寿命结束时的颜色。
            endColor: Cesium.Color.WHITE.withAlpha(0.0),
            // 在粒子寿命开始时应用于粒子图像的初始比例。
            startScale: viewModel.startScale,
            // 在粒子寿命结束时应用于粒子图像的最终比例。
            endScale: viewModel.endScale,
            // 设置以秒为单位的粒子生命的可能持续时间的最小范围,在该时间范围内可以随机选择粒子的实际生命。
            minimumParticleLife: viewModel.minimumParticleLife,
            //设置粒子寿命的可能持续时间的最大限制(以秒为单位),在该范围内将随机选择粒子的实际寿命。
            maximumParticleLife: viewModel.maximumParticleLife,
            //设置以米/秒为单位的最小界限,高于该界限时,将随机选择粒子的实际速度。
            minimumSpeed: viewModel.minimumSpeed,
            // 设置以米/秒为单位的最大范围,在该范围内将随机选择粒子的实际速度。
            maximumSpeed: viewModel.maximumSpeed,
            // 如果设置,则将覆盖用来缩放粒子图像尺寸(以像素为单位)的minimumImageSize和maximumImageSize输入。
            imageSize: new Cesium.Cartesian2(
                    viewModel.particleSize,
                    viewModel.particleSize
            ),
            // 每秒要发射的粒子数。
            emissionRate: viewModel.emissionRate,
            // ParticleBurst 的数组,在周期性的时间发射粒子爆发。
            bursts: [
              //这些脉冲偶尔会同步以产生多色效果
              new Cesium.ParticleBurst({
                time:0.1,
                minimum: 10,
                maximum: 100,
              }),
              new Cesium.ParticleBurst({
                time:0.2,
                minimum: 50,
                maximum: 100,
              }),
              new Cesium.ParticleBurst({
                time: 0.3,
                minimum: 200,
                maximum: 300,
              }),
            ],
            // 粒子系统发射粒子的时间(以秒为单位)。
            lifetime: 0.5,
            // 为此的粒子发射器(这里发射形式cesium官方有四种,可根据实际切换或开发)
            emitter: new Cesium.CircleEmitter(0.5),
  // {
            //emitter: new Cesium.CircleEmitter(2.0),
            // emitter:new Cesium.SphereEmitter(2.5),
            // emitter:new Cesium.ConeEmitter(
            //         Cesium.Math.toRadians(45.0)
            // ),
            // emitter:new Cesium.BoxEmitter(
            //         new Cesium.Cartesian3(10.0, 10.0, 10.0)
            // ),
  // }
            // 4x4转换矩阵,用于转换粒子系统局部坐标系内的粒子系统发射器。
            emitterModelMatrix: computeEmitterModelMatrix(),
            // 每帧都要调用一次回调函数以更新粒子。(控制粒子的变化)
            updateCallback: applyGravity,
          })
  );
  var gravityScratch = new Cesium.Cartesian3();
  function applyGravity(p, dt) {
    // 我们需要为地心空间中的每个粒子计算一个局部上方向向量
    var position = p.position;

    Cesium.Cartesian3.normalize(position, gravityScratch);
    Cesium.Cartesian3.multiplyByScalar(
            gravityScratch,
            viewModel.gravity * dt,
            gravityScratch
    );
    p.velocity = Cesium.Cartesian3.add(
            p.velocity,
            gravityScratch,
            p.velocity
    );
  }
  viewer.scene.preUpdate.addEventListener(function (scene, time) {
    particleSystem.modelMatrix = computeModelMatrix(entity, time);
    // 说明对发射器模型矩阵的任何更改
    particleSystem.emitterModelMatrix = computeEmitterModelMatrix();
  });

</script>


</body>
</html>

上一篇:czml的模型运动及轨迹实现


下一篇:Cesium获取经纬度的几种方法