cesium 粒子特效

cesium 粒子特效

1. 什么是粒子系统

cesium的官网有篇文章详细介绍了粒子系统 cesium.com/learn/cesiu...

官方文章写的很清楚,看完后就知道怎么使用了

2. ParticleSystem参数简介

cesium的官方文档有详细说明 cesium.com/learn/cesiu...

js 复制代码
const particleSystem = viewer.scene.primitives.add(
  new Cesium.ParticleSystem({
    show: true, // boolean类型;  默认值true;  是否显示粒子系统
    image: "null", // 多种类型;  默认值无,所以必传,不然看不到粒子;  粒子显示的图片,可以是 URI、HTMLImageElement 或 HTMLCanvasElement
    imageSize: new Cesium.Cartesian2(1.0, 1.0), // Cartesian2类型;  默认值new Cesium.Cartesian2(1.0, 1.0);  设置图像大小,设置后 minimumImageSize,maximumImageSize将失效
    minimumImageSize: 'null', // Cartesian2类型;  默认值无;  设置最小边界(宽度乘以高度),超过该边界可随机缩放粒子图像的尺寸(以像素为单位)
    maximumImageSize: 'null', // Cartesian2类型;  默认值无;  设置最大边界(宽度乘以高度),低于该边界可随机缩放粒子图像的尺寸(以像素为单位)
    sizeInMeters: false, // boolean类型;  默认值false;  设置粒子的大小是以米为单位还是以像素为单位,true以米为单位调整颗粒大小,缩放后大小会改变,false以像素为单位调整大小,缩放后大小不变
    color: Cesium.Color.WHITE, // Color类型;  默认值Cesium.Color.WHITE,即原始颜色;  设置在粒子的 particleLife 持续时间内,应用于粒子图像的颜色,设置后startColor,endColor将失效
    startColor: '', // Color类型;  默认值无;  设置在粒子的 particleLife 持续时间内,应用于生命开始时图像的颜色
    endColor: '', // Color类型;  默认值无;  设置在粒子的 particleLife 持续时间内,应用于生命结束时图像的颜色
    scale: 1.0, // number类型;  默认值1.0;  设置在粒子的 particleLife 持续时间内,应用于粒子图像的比例,设置后startScale,endScale将失效
    startScale: 'null', // number类型;  默认值无;  设置在粒子的 particleLife 持续时间内,应用于生命开始时图像的初始比例
    endScale: 'null', // number类型;  默认值无;  设置在粒子的 particleLife 持续时间内,应用于生命结束时图像的最终比例
    speed: 1.0, // number类型;  默认值1.0;  设置类中的移动速度,设置后minimumSpeed,maximumSpeed将失效
    minimumSpeed: 'null', // number类型;  默认值无;  设置最小界限(以米/秒为单位),超过该界限将随机选择粒子的实际速度
    maximumSpeed: 'null', // number类型;  默认值无;  设置最大界限(以米/秒为单位),低于该界限将随机选择粒子的实际速度
    particleLife: 5.0, // number类型;  默认值5.0;  设置粒子的寿命时间(以秒为单位),设置后minimumParticleLife,maximumParticleLife将失效
    minimumParticleLife: 'null', // number类型;  默认值无;  设置粒子可能寿命的最小界限(以秒为单位),超过该界限将随机选择粒子的实际寿命
    maximumParticleLife: 'null', // number类型;  默认值无;  设置粒子可能寿命的最大界限(以秒为单位),低于该界限将随机选择粒子的实际寿命
    lifetime:  Number.MAX_VALUE, // number类型;  默认值Number.MAX_VALUE;  设置粒子系统发射粒子的时间,以秒为单位
    emitter: new CircleEmitter(0.5), // ParticleEmitter类型;  默认值new CircleEmitter(0.5);  该粒子系统的粒子发射器,发射器提供四种BoxEmitter,CircleEmitter,ConeEmitter,SphereEmitter发射器
    emissionRate: 5。0, // number类型;  默认值5.0;  每秒发射的粒子数
    modelMatrix: Matrix4.IDENTITY, // Matrix4类型;  默认值Matrix4.IDENTITY;  粒子系统的位置坐标,比如要将粒子放在某个经度,纬度,高度的位置上,需要将其转换成 4x4 变换矩阵,例如 const modelMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(Cesium.Cartesian3.fromDegrees(120.00425066, 30.00217308, 50))
    emitterModelMatrix: Matrix4.IDENTITY, // Matrix4类型;  默认值Matrix4.IDENTITY;  在粒子系统局部坐标系内变换粒子系统发射器的 4x4 变换矩阵
    updateCallback: 'null', // function函数类型;  默认值无;  每帧调用用来更新粒子的位置运动的回调函数,重点,很多运动效果在回调函数里处理
    loop: true, // boolean类型;默认值true;是否循环
    // ------------------不常用---------------
    bursts: 'null', // Array.<ParticleBurst>类型;  默认值无;  周期性地发射粒子爆发,是一个ParticleBurst数组
    mass: 1.0, // number类型;  默认值1.0;  设置粒子的最小和最大质量(以千克为单位),设置后minimumMass,maximumMass将失效
    minimumMass: 'null', // number类型;  默认值无;  设置粒子质量的最小质量(以千克为单位)。粒子的实际质量将被选为高于此值的随机量
    maximumMass: 'null', // number类型;  默认值无;  设置粒子质量的最大质量(以千克为单位)。粒子的实际质量将被选为低于此值的随机量。
  })
);

3. 效果展示

ts 复制代码
  add1() {
    // 位置
    const modelMatrix = Transforms.eastNorthUpToFixedFrame(Cartesian3.fromDegrees(120.00425066, 30.00217308, 50));

    // 运动回调
    let gravityScratch = new Cartesian3();
    const update = function (particle: any, dt: any) {
      Cartesian3.normalize(particle.position, gravityScratch);
      Cartesian3.multiplyByScalar(gravityScratch, CesiumMath.randomBetween(0.1, 0.5) * dt, gravityScratch);
      particle.velocity = Cartesian3.add(particle.velocity, gravityScratch, particle.velocity);
    };

    // 粒子系统
    const snow = new ParticleSystem({
      image: './point.png',
      imageSize: new Cartesian2(180.0, 180.0),
      color: Color.YELLOW,
      minimumSpeed: 2,
      maximumSpeed: 4,
      lifetime: 18.0,
      particleLife: 18.0,
      emitter: new CircleEmitter(200.0),
      emissionRate: 2.0,
      modelMatrix: modelMatrix,
      updateCallback: update
    });

    this.app.viewerCesium.scene.primitives.add(snow);
  }

  add2() {
    const modelMatrix = Transforms.eastNorthUpToFixedFrame(Cartesian3.fromDegrees(120.00425066, 30.00217308, 50));

    const size = 20.0;
    const minimumSnowImageSize = new Cartesian2(size, size);
    const maximumSnowImageSize = new Cartesian2(size * 2.0, size * 2.0);

    let gravityScratch = new Cartesian3();
    const update = function (particle: any, dt: any) {
      Cartesian3.normalize(particle.position, gravityScratch);
      Cartesian3.multiplyByScalar(gravityScratch, CesiumMath.randomBetween(0.1, 0.5) * dt, gravityScratch);
      particle.velocity = Cartesian3.add(particle.velocity, gravityScratch, particle.velocity);
    };

    const snow = new ParticleSystem({
      image: './rectangle.png',
      minimumImageSize: minimumSnowImageSize,
      maximumImageSize: maximumSnowImageSize,
      minimumSpeed: 1,
      maximumSpeed: 3,
      lifetime: 15.0,
      particleLife: 8.0,
      emitter: new CircleEmitter(200.0),
      emissionRate: 2.0,
      modelMatrix: modelMatrix,
      updateCallback: update
    });

    this.app.viewerCesium.scene.primitives.add(snow);
  }
相关推荐
前端snow7 小时前
ai agent --- 文件存储
前端
Frag0ut7 小时前
Chrome四大版本获取及共存指南:Stable/Beta/Dev/Canary
前端·chrome·浏览器·dev·beta·canary·共存版
IT_陈寒9 小时前
SpringBoot自动配置坑了我一把,原来是这样绕过去的
前端·人工智能·后端
广州华水科技9 小时前
单北斗GNSS变形监测在大坝安全监测中的应用与优势
前端
zeng不错9 小时前
B站 173 个投稿活动看到眼瞎?我写了个扩展,主打一个精准打击
前端
Latchh9 小时前
前端导出的JPEG红字发糊,质量要拉到100才清楚
前端·图像处理·人工智能·计算机视觉
默_笙10 小时前
🚦 请三个 AI 考官给 RAG 打分:量化评估实战(下)
前端·javascript
Joy T10 小时前
聊天系统中五大ID的演进与实战解析
java·前端·人工智能·spring·agent入门
Seraphina3611 小时前
DVWA(SQL注入-low,medium,XSS反射-low)
前端·数据库·笔记·sql·网络安全·web·xss
Access开发易登软件12 小时前
Access 导入 Markdown 表格:把文档里的数据写进表
前端·html·vba·markdown·access开发