資料館/E3Dで納豆ミサイル

Last-modified: 2009-12-05 (土) 15:37:11

納豆ミサイルとは

マクロスでおなじみ、板野様が得意とするミサイルの表現法。
現実ではありえないほどミサイルの噴射煙の拡散が遅く、大量のミサイルが白く糸を引くことから命名された。絵で表すとこんな感じだ。

itano.jpg

納豆ミサイルへの挑戦

このように、大量のミサイルが飛び交うスピーディ且つ間違いなく死ぬほどのレッドアウトを引き起こすであろうアクロバティックな空中戦を、板野サーカスと呼ぶことがある。
板野サーカスでは、ただ単に目標にミサイルを飛ばすだけでなく、まっすぐ飛ぶ、縦横無尽に飛び回る、外れる、ソモソモあさっての方向へ飛ぶ、など性格付け、山盛りの弾幕をぶっ放すが流石にE3Dでそれは無理なようなので、糸引く納豆ミサイルをどうにかEasy3Dで表現したいと思う。




なお、ポリラインを利用した方が綺麗且つ割かし大量に納豆を飛ばす事ができる。
それについてはこちらを参照して欲しい。パーティクルでもじゃ~っと出す納豆もオラは好きなのだが。

構想

  1. ミサイルを生成
  2. ミサイルの座標にパーティクルをセットし、パーティクルを生成させる
  3. ミサイルを進ませる
  4. 2に戻る

これを繰り返せば、ミサイルの軌跡をパーティクルが結んでくれる。
煙っぽいテクスチャでパーティクルを作成し、時間と共に薄れたり拡散するようテクスチャを変えてやればよさそうだ。
ここで、最大の問題点はミサイルの速度である。
ミサイルの速度が速くなるほど、パーティクル生成位置の距離間隔は長くなる。2点間の距離*1が煙パーティクルの半径より大きくなってしまうと、煙が途切れてしまって納豆でなくなってしまう。

解決策は

  • パーティクルの半径をでかくする
    • 余りにも力強く太くしてしまうと、見栄えが悪くやっぱり納豆でなくなってしまう
  • パーティクルの生成間隔を狭める
    • パーティクルの生成個数が増えてしまう

などがあり、それぞれ問題点も抱えている。ミサイルの速度を下げるのが一番有効な気がしないでもない。オイラがWORZを作った段階では、速度はそれほど気にならなかったので、コアの大幅見直しが終わればマシな納豆をお見せできるだろう。
ミサイルを大量に用意すると何もせずとも描写処理だけでFPSが落ちるので、ここも参照せねばなるまい。

具体的手法

例えば、現在ミサイルが進行方向へ進んでいるとする。
あらかじめ、弾道表示用に煙のようなテクスチャのパーティクルを作成してやりにパラメータを設定しておく。
具体的には

  • E3DSetParticleGravity
    • パーティクルにかかる重力(Y方向の加速度)
  • E3DSetParticleVel0
    • パーティクルが生成されたときに持つ速度の範囲

主にこの二つの値をゼロに近づけておけば問題ない。パーティクルの速度範囲を広げると、煙が普通に拡散し、納豆ではなくなってしまうが、これも表現としてはアリ、むしろ自然だと思うので普通のミサイルとしても使える。
他に注目すべきパラメータはパーティクルの発生個数と発生数の上限である。
発生個数は、1以下の小数を指定すれば、数フレームおきにパーティクルを生成させることが出来る。例えば機雷など、ミサイルの速度があまりに遅い場合、毎フレームパーティクルを出しても煙が重なるだけで見栄え上の大した効果は得られず無意味である。


生成するパーティクルの数の上限は、煙の寿命とフレーム数と煙の発生頻度で算出できる。

必要なパーティクル数=(発生頻度)+(煙の寿命)*(最大FPS)*(発生頻度)

例えば、煙の寿命が5秒、FPS60、発生頻度1*2する場合に必要なパーティクルの数。
生成されたパーティクルが消えるのは300フレーム後なので、毎フレームパーティクルを生成した場合に必要なパーティクル数は消えたフレーム時の分を入れて300+1となる。

なお、E3Dの仕様で生成数の上限は、2000以下でなければならないようだ。

サンプル

納豆ミサイルをカメラが追うサンプルを作ってみた。
サンプルを作るにあたり、ミサイルはメタセコを用いて、煙のテクスチャはpixiaを使ってそれぞれ1分ほどで作った。テクスチャは透明色情報を保存する、にチェックを入れた上でpng形式で出力して使用した。

なお、納豆を美しく魅せるために、かなりの頻度でパーティクルの透明度を変更している。実際に納豆を一杯出した時、これほどの頻度で回していたらとてもじゃないがFPSの保障なんて出来ないので、各自透明化の処理は適度にやっておくこと。


filenattou.zip

ミサイル
ss1.jpg

ito.png




実行結果
natto.jpg

どうが

実際は滑らか。
&flash(http://www.youtube.com/v/l_J02HTRYtI,425x350,bgcolor=#000000);

考えうる改善点

  • テクスチャをもっとマシなものに変える
  • パーティクルのテクスチャを複数用意し、透明度と共に切り替える
    • どの程度速度が出るかが問題

*1 ミサイルが1単位時間(パーティクル生成間隔)の間に進む距離
*2 毎フレームパーティクルを生成