我正在使用Three.js的ShaderParticleEngine库来创建粒子发射器。

我在Internet上挑选了几个代码片段来使发射器正常工作。
首先,我认为那是行不通的。

但实际上,发射器显示在地图上,但屏幕上只有一个静止的粒子。
经过一些调试后,我无法理解粒子在移动,但是移动得非常缓慢。我需要使用tick(delta * 1000)来查看发射器的运行情况。结果非常丑陋(充满空隙,只有颗粒)。我没有低FPS的问题。

我发现的唯一解决方案是删除tick函数调用中的delta参数:particleGroup.tick()

结果更好,但仍在欺骗,请自行判断:

在线发射器编辑器:


我的结果:


我听不懂我使用库示例中建议的相同代码,并使用发射器编辑器中的导出功能。
如果我尝试其他变化(例如,关于粒子寿命/速度),则在游戏中得到的结果会大不相同,也许是因为未提供delta参数而导致粒子寿命计算不正确?

我的游戏循环:

var animate = function () {

    requestAnimationFrame( animate );

    render();

    stats.update();

};

var render = function() {

    time = ctx3d.clock.getElapsedTime();
    delta = ctx3d.clock.getDelta();

    particleGroup.tick(delta);

    if(ctx3d.move)
    {
        ctx3d.ship.position.z += delta * 500 * 3000;
        //ctx3d.camera.position.x = ctx3d.ship.position.x;
        //ctx3d.camera.position.z = ctx3d.ship.position.z;
    }

    ctx3d.renderer.render(ctx3d.scene, ctx3d.camera);

}


增量值逐个循环:

30.0000010000003385357559
9.999985195463523e-7
30.0000020000006770715117
0.0000010000003385357559
30.0000020000006770715117
0.0000010000003385357559
0.0000020000006770715117
30.0000010000003385357559
0.000002999999196617864
0.0000010000003385357559
9.999985195463523e-7
0.000002999999196617864
0.0000010000003385357559
0.000001999998858082108108
0.0000010000003385357559
20.0000020000006770715117
9.999985195463523e-7
0.0000010000003385357559

最佳答案

我希望可以将其发布为答案...

我已经将粒子引擎的次要版本提高到了0.7.7,为您的“外观不太光滑”的发射器实现了修复。

之前发生的事情是:


SPE.Emitter.tick()值调用的dt
tick函数根据传递给它的dt参数确定应将多少个粒子标记为有效。对于更大的dt值,更多的粒子被标记为活动的,对于较小的值,更少的粒子被标记为alice。
然后,发射器将重置这些粒子并等待下一个调用。


假设每帧将一个以上的粒子标记为alive,并且它们都起源于空间中的同一位置,那么所有粒子在被激活时都将位于同一位置。这就是为什么您看到一些“团块”发生的原因。

现在发生的是:


和以前一样,使用SPE.Emitter.tick()值调用dt
现在,tick函数确定应将多少个粒子标记为活动的,并在对其进行标记的同时,将每个粒子的年龄设置为传入的dt值的一部分。


因此(!),假设每帧发射100个粒子,并且将dt值0.016传递到发射器的tick函数,则将被标记为活动的这100个粒子中的每个粒子的年龄值均指定为,其中(0.016 / 100) * i是粒子索引(在这种情况下,值为0到100)。

我希望这是有道理的。您可以在此处查看更改:https://github.com/squarefeet/ShaderParticleEngine/blob/master/src/ShaderParticleEmitter.js#L240-L246

Master分支已更新。

关于javascript - Three.js/ShaderParticleEngine — SPE.Group.tick错误的增量参数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26723575/

10-10 00:50