資料館/パーティクルをフレーム単位で操作

Last-modified: 2008-01-14 (月) 03:04:16

概略

E3Dのパーティクル命令は、全て『秒』を基準にして操作することになっている。
フレーム数と秒を言ったり来たりするのは面倒なので、いっそのこと全部フレーム単位で扱おうじゃないか

りろん

E3DRenderParticle particleID,FPS,scid

パーティクルの描写命令。これの2番目の引数に1を指定するだけ。
この描写命令が呼び出されるたびに、1/FPS秒時が進んだことになる。引数に60を指定すれば、描写命令が60回呼び出された段階で1秒が経過したことになり寿命が1秒のパーティクルは消える。

っつーことは、この引数に1を指定してやれば、内部では1フレーム=1秒として扱われることになる。

メリット

寿命の指定が楽

例えば、ゲームなんか作ってて、5フレームだけエフェクトを出したい、何て事がままある。
まあパーティクルの寿命に5/(現在のFPS)を指定してやればいいんだが、フィーリングというか、メンドクサイので。

スピードが操作しやすい

E3DSetParticleGravity
E3DSetParticleVel0

これらで指定する速度は、秒速である。重力がない場合にパーティクルが毎フレーム進む距離は実際には速度/FPSとなっている。
FPSが60の場合

E3DSetParticleVel0 pid,-1000,-1000,-1000,1000,1000,1000:E3DRenderParticle pid,60,scid
E3DSetParticleVel0 pid,-100,-100,-100,100,100,100:E3DRenderParticle pid,6,scid
E3DSetParticleVel0 pid,-1000/60,-1000/60,-1000/60,1000/60,1000/60,1000/60:E3DRenderParticle pid,1,scid

これらは同じ動作をする。*1
ただしE3DSetParticleGravityで指定する重力を求める場合、2乗されていることを忘れないようにしなければならない。

E3D付属のサンプルの例。以下の2つはほぼおんなじ挙動をする。
FPS60で、従来の秒指定

E3DSetParticleGravity ptlid1, 4000
E3DSetParticleLife ptlid1, 2.0
E3DSetParticleVel0 ptlid1, -1000, 4000, -1000, 1000, 4000, 1000
E3DRenderParticle ptlid1, 60

FPSは同じく60だが、フレーム単位で操作

E3DSetParticleGravity ptlid1, 4000/(60*60)
E3DSetParticleLife ptlid1, 2.0*60
E3DSetParticleVel0 ptlid1, -1000/60, 4000/60, -1000/60, 1000/60, 4000/60, 1000/60
E3DRenderParticle ptlid1, 1

何でこんな事考えたか

XXフレームでどこどこまで到達するパーティクルを飛ばして、そこで消える、という指定をやりやすくしたかったから。


*1 ただし実際には1000/60は16.6666666なので誤差が出ると思う