日本でハリウッドVFXを制作! 「経産省アイディアボックス」 結果:  
●まとめエントリはこちら ●FAQ ●お問い合わせは左のメールフォームから

2010年1月8日金曜日

個々のパーティクルの特性は何で決まるか?

昨日のエントリ「radiusPP = linstep(0,lifespanPP, age)」は、今ひとつ要点を得なかった。
なぜ、パーティクルにスポットを当ててみようと思ったのかもう一度考えてみた。

1)パーティクルの動きを予測してエクスプレションを作れるようにする。
2)パーティクル・エクスプレションの汎用的なエクスプレッションを知る。

この二つができれば、いろいろなエクスプレッションを、文字通りメモしたり記憶するのではなく、「そのエクスプレッションを作るための考え方」を身につけることが出来る。


----------------------------------------
まずデフォルトのエミッタ1つ作り、フィールドを使用しないシーンで考えてみる。

パーティクル・エクスプレッションでは、リアリティーを追求するときは、パーティクル単位アトリビュートにエクスプレションを使う事が増える。

的確なエクスプレッションを作るには各パーティクルの動きがどうなるのかを予測する必要がある。
しかしながら実際のエミッタからは大量のパーティクルが様々な方向へ発生し続けているため、とらえどころのない感情におそわれ混乱してくる。


まずこの感情を克服するには、すべてをシンプルにしていく必要がある。
シンプルな物は理解しやすい。


エミッタからは次々と新しいパーティクルが生み出されており、シーン内では、それがすでに生み出されたパーティクルと混在している。

「このパーティクルが生まれて3秒でこうなって...。」「このパーティクルが生まれて1秒で」などと頭の中でトラッキングしていると考えることが多すぎてすぐに混乱する。

エクスプレッションを使ってやりたいことは「パーティクルをよりよくコントロールすること」である。


まず沢山のパーティクルがある状態では、各パーティクルの動きを完全には把握することができない。「把握できない」と感じるなら、「コントロールできない」と感じても当然である。
まずここをシンプルにすることが役に立つ。

一番簡単な方法は、シーンそのものをシンプルにする方法。
●パーティクルが放出される方向をDirectionalにして一方向にする。
●放出されるパーティクルを少なくする。「rate」にキーフレームを打つことで可能になる。
●それでも駄目なら放出されるパーティクルを1つに絞る。

慣れない内は上記の方法をとるのが良いだろう。


----------------------------------------
では、大量のパーティクルが存在し、それを上記のような状態に変えたくないときはどうすればよいか?
ひとつは上記の方法をとったR&D用のシーンファイルを作成する。
もう一つは、頭の中で整理する。


まず基本的なことから考えを整理してみる。
●まず自分がやりたいことは「パーティクルのコントロール」である。
●そしてそれは、「パーティクルが画面内に存在する」から、コントロールできるのである。


ここでカギとなるのは「パーティクルが画面内に存在している」ということだ。
いいかえれば発生してから消えるまでということになる。

「発生する」のは、タイムライン上のタイミングでみると個々のパーティクルによって様々である。
これを整理するために、
1)発生したフレームを「1」と考える。
2)発生フレームをタイムライン上の「1」にそろえて考える。

これに加えて、以下のように考える。
●すべてのパーティクルの移動方向を同一にする。
いいかえれば、「パーティクルの放出方向をDirectionalにして一方向にする」のと同じ事。


こうすると、それぞれのパーティクルを比較検証できる。
Lifespanがコンスタントで、他がデフォルトであれば、すべてのパーティクルが同時に出現し、同じサイズで、同じ方向へ、同じ速度ですすみ、同じ時に消えるはずだ。
・・・・・・・●



----------------------------------------
さて、各パーティクルにユニークな特性を持たせるには、それぞれがユニークなアトリビュート値を持つ必要がある。

それを簡単に行えるようにしたのが「パーティクル単位アトリビュート」だと思うのだが、
例えば以下のような物がある。
position :位置
velocity :位置
acceleration:位置
rgbPP:見た目
opacityPP:見た目
radiusPP:見た目


右側に書いたのは、それぞれどのようなものに影響しているかということだが、大きく分けて
「位置」
「見た目」
に影響する物に、分けられる。

これらに手を加えれば、各パーティクルに動きや見た目の変化が生じるはずだ。

でも他に、各パーティクルのユニークな物と特徴付けるものはないか?
各パーティクルの特性を決めるが、使っても動きや見た目の変化を生じさせないで、基本的な要素として役に立つようなもの。

パーティクルIDは各パーティクルを示しているが特性をユニークにする物ではない。

ここで思い出したいのが「パーティクルの存在」とはなんであったかということである。
「発生してから消えるまで」
ようするに寿命である。
LifespanPPは、ランダムに設定すれば個々のパーティクルがそれぞれユニークな値を持つことになる。
これが各パーティクルの特性を決めることになる。
簡単に言えば「特性」は「寿命」によって分けられる


これがLifespanPPがいろいろな面で使われる理由と思われる。
見た目や動きに変化を与えず、放出された時点で各パーティクルへユニークな特性を付与する。

これをベースにさまざまな、パーティクル単位アトリビュートをコントロールすれば、それぞれの特性にあった変化を持たせることも出来る。
そして同じLifespanPPの値を用いるので、ひとつのパーティクルにおける様々なパーティクル単位アトリビュートの変化を統一させることが出来る。


----------------------------------------
ここから導き出されるシンプルな考え方がある。
パーティクルが変化するエクスプレッションを作るとき、時間ではなく「放出されて消滅するまで」のサイクルで考える方法である。

個々のパーティクルはそれぞれ寿命は違うが、ライフサイクルとして考えた場合はどれも同じである。
birth(誕生)--- exist(存在) --- Die(死)
ここでは時間の単位は考慮する必要がない。


したがってそのサイクルの中の変化だけを考えそのエクスプレッションを作成し、
後で、各パーティクルの違いを生み出すためにlifespanPPを使うようにすると良い。

LifespanPPは
●値をランダムにすれば、各パーティクルの特性をユニークにする。
●「消滅」の時を、あらわす。



昨日の「radiusPP = linstep(0,lifespanPP, age)」の各要素を考えてみる。
1)時間が経つにつれて変化することに関係: 「linstep」 「age」
「linstep」だけでは機能しない「age(秒)」を使う事で時間という概念が取り込まれる。

2)個々のパーティクルにユニークな特性を持たせることに関係: 「lifespanPP」「rand」
「lifespanPP」だけではすべてのパーティクルは一様である。
「rand」を使ってその値を指定することで、各パーティクルがユニークな物になる。

すべてのパーティクルサイクルを同じと考える場合、lifespanは任意の物でよい(例えば「1」)
radiusPP = linstep(0,1, age)
これにより生じる変化で特徴をつかむことができる。

あとは、この時間が延ばされるか縮められるかのちがいだけとなる。
そしてそれは、この「1」を「lifespanPP」に置き換えるだけでよい。


lifespanPPの数値(秒数)は、
「パーティクル毎の特性を決めるための数値」
「消滅時の状態の数値」
として使う事が出来る。

また、あるパーティクルに対する様々なアトリビュートに対し、「同一の変化率を持たせたい」ときにも使える。(たとえばパーティクルID24のパーティクルのサイズと透明度、加速度などに同じ変化率を適用する場合)


これはよりエクスプレッションに着目する場所がわかりやすくなるのではないかと思う。


※ 経験が少なすぎで今ひとつ、まとまりきれません。
強引なところがあると思いますが、今回は、これでとりあえず終わりにします。

 

0 件のコメント:

コメントを投稿