資料館/収束するパーティクル

Last-modified: 2008-01-19 (土) 11:58:00

がいよう

E3Dは、設定した地点からパーティクルを簡単に噴出させることが出来る。
その機能を用いて、逆にその周辺から任意の地点へ収束していく粒子を表現することに挑戦する。
ビーム砲がエネルギーをチャージしている時にエフェクトとして出せるんじゃないかと思う。
絵で理想を表すとこういう感じだ。
tekito.jpg
周辺の粒子が、任意の地点(この場合は銃口)へ収束していく。

方法

今の所考えている方法。
以下、パーティクル生成位置*1を始点、収束させたい任意の地点を目標点と呼ぶ。

  1. 毎フレーム、目標点周辺を始点がランダムに移動
  2. 数フレーム置きに以下を実行
    1. 始点と、目標点のベクトルを計算
    2. ベクトルの方向、長さと寿命から、パーティクルの速度を計算
    3. パーティクルを生成

あらかじめ下準備として、パーティクルの重力は0にしておく。また、パーティクルの速度がばらつかないように、E3DSetParticleVel0で毎回速度を指定し、minvelとmaxvelには同じ値を突っ込む。
これで、目標点へ向かって飛んでいくパーティクルの出来上がりだと思う。
実際に出来上がったので解説を交えて。

サンプル

画面の中心に向かって粒子が収束していくサンプルを作ってみた。蓋を開けてみれば原理は簡単で、上記した事をそのまま実装しただけである。
ただし、めんどくさかったので数フレーム置きにではなく、必ずベクトルの算出などを行っている。恐らく生成頻度を何か別の変数にどんどん加算していって、1以上になったら0に戻し、ベクトル算出を行えば多少は処理が軽くなるかも。

始点からパーティクルが飛ぶべきベクトルは、(目標点の座標-始点の座標)でx,y,zそれぞれ求まる。
パーティクルの寿命が尽きる頃に丁度目標点へ飛んで欲しいわけなので

(パーティクルが飛ぶべきベクトル)/(パーティクルの寿命)

を三つ求め、それぞれをE3DSetParticleVel0のminvelとmaxvelに突っ込めばおk。

サンプルソースは例によって自分でbmpファイルを生成し、それをテクスチャとしてパーティクルを生成する。
ダウンロードは一番下。
実行結果(全く分からないと思うので自分で動かしてみること)
ss.jpg
結構綺麗に出てるね。あとは生成頻度とか弄ってやればおk。

filesyusoku.hsp

どうが

テクスチャを自前で用意して撮影したもの。
実際はもうチョッと滑らか
&flash(http://www.youtube.com/v/09LWtPshG2k,425x350,bgcolor=#000000);


*1 E3Dsetparticleposで設定されるパーティクルの噴出点