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