当前位置: 首页 > 工具软件 > ClayGL > 使用案例 >

2021SC@SDUSC 【软件工程应用与实践】Claygl项目代码分析(七)

刘承运
2023-12-01

2021SC@SDUSC

(接上文)

目录

ParticleRenderable.js

4.2函数

updateParticles


ParticleRenderable.js

4.2函数

updateParticles

    updateParticles: function(deltaTime) {

        deltaTime /= 1000;
        this._elapsedTime += deltaTime;

        var particles = this._particles;

        if (this._emitting) {
            for (var i = 0; i < this._emitters.length; i++) {
                this._emitters[i].emit(particles);
            }
            if (this.oneshot) {
                this._emitting = false;
            }
        }

        var len = particles.length;
        for (var i = 0; i < len;) {
            var p = particles[i];
            p.age += deltaTime;
            if (p.age >= p.life) {
                p.emitter.kill(p);
                particles[i] = particles[len-1];
                particles.pop();
                len--;
            } else {
                i++;
            }
        }

        for (var i = 0; i < len; i++) {
            // Update
            var p = particles[i];
            if (this._fields.length > 0) {
                for (var j = 0; j < this._fields.length; j++) {
                    this._fields[j].applyTo(p.velocity, p.position, p.weight, deltaTime);
                }
            }
            p.update(deltaTime);
        }

        this._updateVertices();
    },

参数为增量时间deltaTime;

        deltaTime /= 1000;

1000应为秒、毫秒之间的转换,将以毫秒为参考的deltaTime转化为秒对应的增量时间;

        this._elapsedTime += deltaTime;

接着令消逝时间加上该部分时间;

        var particles = this._particles;

定义particles获取_particles;

        if (this._emitting) {
            for (var i = 0; i < this._emitters.length; i++) {
                this._emitters[i].emit(particles);
            }
            if (this.oneshot) {
                this._emitting = false;
            }
        }

判断是否处于可发射状态;

若处于可发射状态,则使用_emitters中所有发射器发射particles中的粒子;

接着,若是该渲染为一次性的,则将可发射状态设为false;

        var len = particles.length;

接着定义粒子总数量len;

        for (var i = 0; i < len;) {
            var p = particles[i];
            p.age += deltaTime;
            if (p.age >= p.life) {
                p.emitter.kill(p);
                particles[i] = particles[len-1];
                particles.pop();
                len--;
            } else {
                i++;
            }
        }

这部分用于更新粒子年龄和检测处理超龄粒子:

对于每一个粒子,令粒子年龄增加增量时间,然后判断粒子年龄是否已经到达或超过其最大寿命;

若是,则用kill()将该粒子放回粒子池,用队尾粒子替换该位置粒子,移除队尾粒子,更新长度;

否则,更新并检测下一粒子。

        for (var i = 0; i < len; i++) {
            var p = particles[i];
            if (this._fields.length > 0) {
                for (var j = 0; j < this._fields.length; j++) {
                    this._fields[j].applyTo(p.velocity, p.position, p.weight, deltaTime);
                }
            }
            p.update(deltaTime);
        }

之后,对于所有还在其生命周期内的粒子,检测其领域总数(即是否有受到力的影响),若有,则对粒子应用所有领域,之后更新粒子的位置和方向。

this._updateVertices();

最后调用_updateVertices(),该部分将在下篇分析。

(待续)

 类似资料: