[源码解析] Cesium粒子系统-01

172 阅读2分钟

前言

粒子系统可以实现绚丽多彩的特效,是游戏引擎中不可缺少的部分。Cesium中也实现了其粒子系统,虽然与Cocos creator这种综合性的游戏引擎比略显粗糙,但也给了我们学习其源码极大的便利性。

image.png

图1. Cesium中粒子效果

构成

Cesium中粒子系统的源码在cesium/packages/engine/Source/Core路径下,由粒子类Particle.js、粒子爆炸类ParticleBurst.js、粒子发射器ParticleEmitter.js以及粒子系统ParticleSystem.js构成,其中粒子发射器有不同种实现。 粒子类描述粒子状态是粒子效果的构成实体,粒子Burst类描述粒子系统某个时刻特定数量粒子炸开的效果,粒子发射器决定粒子的初始运动状态,粒子系统管理以上所有部分的状态和运行。

粒子类

Particle的主要属性值如下所示,基本上是大多粒子系统通用的属性值:

  • mass {nubmer}表示粒子的重量,单位为公斤
  • postion {Cartesian3}粒子的位置
  • velocity {Cartesian3}粒子在世界坐标系下的速度
  • life {nubmer}粒子的寿命,单位为秒
  • startColor {Color}粒子的初始颜色
  • endColor {Color} 粒子的结束颜色
  • startScale {number} 粒子的初始尺寸
  • endScale {number}粒子的结束尺寸
  • _age {number}以及_normalizeAge {number}是其内部属性,用于计算粒子存活的时间

除了上面的,还有和其实体表示相关的属性,Cesium的粒子实体用的是BillBoard类,具有永远朝着摄像机的特性。

  • _billboard {Billboard}
  • image {object}
  • imageSize {Cartesian2}

粒子类只有一个方法boolean update(dt, particleUpdateFunction)用于粒子属性的更新,dt为时间间隔单位为秒,particleUpdateFunction由外部定义,在调用时会传入粒子实例以及时间间隔。除此以外update内部默认对粒子的位置和存活时间进行了更新,如果需要设定复杂的运动规划,在particleUpdateFunction中覆盖位置就好。

  Cartesian3.multiplyByScalar(this.velocity, dt, deltaScratch);
  Cartesian3.add(this.position, deltaScratch, this.position);

  // Update any forces.
  if (defined(particleUpdateFunction)) {
    particleUpdateFunction(this, dt);
  }

  // Age the particle
  this._age += dt;
  ...

ParticleBurst

这个类主要是状态集只有三个主要属性值和一个内部属性,其作用就是记录一个相对粒子系统的时刻可以产生的粒子数量,像烟花那种爆炸的感觉。

  • time 相对粒子系统寿命开始时的某一时刻
  • minimum粒子最小的产生数量
  • maximum粒子最大的产生数量
  • _complete标识burst是否完成

总结

这一篇简单介绍一下Cesium的粒子系统组成,以及两个基础的类,没什么分析的内容。后续会介绍ParticleEmitter及其实现,以及最重要的ParticleSystem类。

链接

[源码解析] Cesium粒子系统-02 - 掘金 (juejin.cn)