前言
粒子系统可以实现绚丽多彩的特效,是游戏引擎中不可缺少的部分。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
类。