[3ds max: PFlowBox3] 実践その1 爆発っぽい形(?)を作る

昨日に引き続きBox3ネタ行きます。
前回言った通り今回はちょっと実践的なネタということで、以下の動画のような爆発っぽいパーティクルアニメーションの解説を行いたいと思います。


早速ですがPFlowのチャートはこんな感じになってます。

薄紫の枠で囲ってあるのがBox3のDataオペレータを使用した箇所です。

delete undergroundとdelete slowerの2個は各種Test系オペレータのように左側にアウトプットが付いているのが確認出来ると思いますが、これはData Testオペレータといって、Dataオペレータと同じように中でサブオペレータをつないで自分でテストが出来るタイプのオペレータです。
今回は邪魔なパーティクルを消すための判定用に使っています。

他は普通のDataオペレータです。

ざっくり流れを解説するとこんな感じです。

  1. パーティクルをエミットして配置。
  2. Z < 0のパーティクルを削除。
  3. この場合原点にSphereタイプのエミッタがおいてあるので、半分ほど消えます。

  4. スピード、各種フォースを設定。
  5. Velocityをベースにノイズを作成。
  6. ここが今回の一番の肝になります。

  7. 遅いパーティクルを削除。
  8. パーティクルにドラッグをかける。
  9. これは自前でやりたかったのでDataオペレータを使ってあります。

  10. 床のコリジョンとlifespanを設定。

PFlowでやっている部分に関しては省略させてください。

ではまず最初はdelete undergroundから。
ネットワークはこんな感じになります。

これまで解説して来た事でほぼ全て説明出来る範囲のネットワークとなってます。
比較的簡単かなとは思いますが、いかがですかね。

ざっと説明すると、パーティクルのポジションのZ要素、つまり高さだけを取得し、Conditionで0未満かどうかを調べています。それが0未満、かつNew In Event、この場合はエミッタから生まれた瞬間だった場合、別のイベントに移ります。
ここではパーティクルを削除するためのイベントに接続しているので、Z < 0のパーティクルは全て削除される、ということになります。

このデータでは原点にSphereタイプのエミッタを置いていて、地面に着弾した爆弾というイメージでアニメーションを作りたかったので、地下に発生した余分なパーティクルを削除したという感じです。

 
次行きます。これが一番大物のnoiseExplosionです。

比較的大物ですが、やってることはそんなに難しくないのでざっくり流れから解説して行きます。

まずvelocityをnormalizeしたものをturbulenceの入力にし、Real型の出力を得ます。
それを任意の数でN乗し、normalize済みのvelocityと掛けます。
ここまでで爆発形状の大体の部分は完成です。

ただしこのままだと元のパーティクルの速度を無視しているので、それを掛けてやります。

最後に、最終的な速度の調整をして、New In Eventを挿して終了です。

流れとしてはこんなものです。

まず説明する必要があるのは左上、velocityのNormalizeに関してですかね。
これはベクトルの正規化と呼ばれる処理で、ベクトルの長さを1にするものです。

なぜvelocityを正規化するか。
それは同じ方向に向かうパーティクルに対しては同じ値のノイズが返ってきて欲しいからです。

最初に設定した速度にバリエーションが設定されている、つまり速度が違うようなインプットの場合、velocityの向きが一緒だったとしても、その大きさが違った場合には違った値が返ってきます。
まぁ別にそれでもいいんです。良いんですが、これの場合だと、後ろにいたパーティクルが前に前にいたパーティクルを追い抜いてしまった、というようなことがあり得るのです。
ですが実際にはそういうことは起こらないはずなので、方向ごとに同じ値を返すために正規化している、という感じになります。

ちょっと分かりづらいですかね、、すみません。。
ただベクトルの正規化に関しては非常に良く使うテクなので覚えておいて損はないと思います:)

次にそのベクトルをTurbulenceと書かれたオペレータに突っ込んでいます。
このオペレータは先日解説したRandomオペレータで、これはVectorを入力にとってRealを出力するタイプのモードです。

Turbulenceというのは、周期の違うノイズを何回か重ねて作られるもので、まぁ一般的なノイズです。
Eと書かれた緑色の入力は、各種パラメータを外に出してあるだけです。
Box3では、たまにこのEと書かれたタイプのやつが出てくるんですが、ちょっと詳しくは覚えていないので、今回は割愛します。確か特定のオペレータからの入力しか受け取れないものとかそんなんだったはず、、

で、次にそこで受け取った値を、ここでは4乗しています。
R1**R2と書かれたノードのところです。

これを行うことで爆発の形状、つまり最終的なパーティクルの速度に大きな差をつけることが出来ます。

例えば以下は球状に発生させたパーティクルのポジションを入力にしてturublenceの値を求め、任意の数でN乗した値でパーティクルをNormal方向に移動させたものです。

値が大きいものの方がメリハリのある形になっているのが確認出来ると思います。
これをvelocityに与えてやることで、そのまま速度にメリハリを持たせることが出来る、というわけです。

ただしやりすぎると右下のようにやりすぎた感じになりますしw、ノイズの細かさにもよるのでその都度値の調整が必要です。

(ホントは値が0-1にきれいに収まっていればこんなに飛びだしたりとかしないはずなんですが、収まっていないということなんでしょうね。
この辺はその都度どういう範囲の値を返すのか検証して、適切な処理をすることが望まれます。
今回はとりあえずスルーしてやったのでこんな結果になってます:P 失礼しました。)

これ以降は特に難しいことはなく、速度の調整をあれこれやっているという感じです。

一つだけ、右下にNew In Eventが確認出来るかと思いますが、velocityの調整は1度だけ、生まれた瞬間にだけ行えればOKなのでここで使用しています。
そうしないとその都度Velocityが設定されてしまい、ドラッグを掛けた意味もむなしくどんどん遠くに飛んでいくということになってしまいますw

画像にも解説を少し加えておいたので、併せてご覧下さい。

 
さらに進めます。
次はdelete slower、これはData Testオペレータで、名前からそのままなのですが遅いパーティクルを削除します。

これは既に解説した内容でカバー出来ますので、特に解説無しでも大丈夫だと思います。
Speed Magnitude、つまりスピードをスカラー値でとって、それが0.0005以下なら別イベントに送り込む、という感じです。

こちらもNew In Eventがくっついていますが、ノイズで作成した爆発用のスピードが遅いものだけを消すためにこうなっています。
ドラッグがかかって遅くなったものは対象に含まれません。生まれたばかりのパーティクルのみが処理の対象です。

ノイズでスピードを作成した際、ノイズに対してN乗する処理を行いましたが、あれの数字を大きくしていくとほとんどのパーティクルの速度が限りなく0に近づいていきます。
そうなると爆発地点に留まるパーティクルが非常に増えるため、あまり望ましくありません。
なので、一定値より遅いパーティクルはあらかじめ削除してしまえ、ということでこういう処理を行っています。

ところで、さっきからパーティクルを消すためにData Testオペレータを使用して別イベントに送りこんで消していますが、実はBox3内部でも普通に出来るらしいということを、このデータを作った後に知りましたw

Amount Changeというサブオペレータがあるのですが、それを利用するとSpawnしたりDeleteしたり、その名の通り量を変更するような処理をDataオペレータ内で実行することが出来るようです。

ですがこれに関しては僕が使ったことがないのでスルーしてこのまま行くことにしました。
実際に使用する際は、お好きな方法を使って頂いて問題ないと思います。

 
そして最後、dragの解説をします。

これも名前の通りなのですが、パーティクルにドラッグを掛けます。
ドラッグなんてデフォルトの機能であるじゃん、って話なんですが、ちょっと試してみたいことがあったのでひとまずやってみた次第です。
なので内容的にはこれで合ってるか大分怪しいのでご注意ください:P

画像にもあれこれ解説は書いているのですが、単に速いやつほど強いドラッグがかかるという風にしたかっただけです。
要は空気抵抗って速いやつほど強く受けるはずなので、それを簡単にモデル化してみた、という話です。

減算で対応しているあたりとか諸々、本当か?という箇所があって、まだ自分の中で明確にモデル化出来ていないので、まぁ仮に、参考までに、という程度に見て頂けると嬉しいです。

空気抵抗に関してはWikipediaの抗力のページを参考にしました。

いきなり数式が見られると思うのですが、これで重要なのは速度の2乗に比例した空気抵抗が発生する、という点。
その他の値は任意の値だし良く分からないので省くことにしました。

そこで僕が取った方法は、今回の場合かなり強引ですがパーティクルのVelocityを0 – 1に収めてしまい、それを2乗する。
その値に対して任意の数字を掛けて、本来のスピードから引くことにより、2乗に比例した空気抵抗が作成出来るはず、と思って、上の画像のような組み方になりました。
本当はMax Speedを決めてSpeedをNormalize(つまり0 – 1に収める)してやる方が良いと思うのですが、この時はなんとなくこうやってしまいました:P

これはNew In Eventではなく毎フレーム計算されます。

 
と、解説は以上になります。。
いかがでしょうか。。

一応、再度動画貼っておきます。

ちなみにこの方法、僕はBox3でやるよりもむしろMayaで日常的に使っているものなので、他のソフトでも同様に使用できるものだと思います。

ふーんなるほどね、と感じて頂けたら幸いです:)

Box3はDataオペレータをどんどん増やしていけますし、基本的なパーティクルの情報に対するアクセスも楽なので、パーティクルアニメーションを作成するという点では非常に優れたツールだと感じています。ユーザは極端に少ないですがポテンシャルはMaya以上なんじゃないですかね。まだ解説してませんがMatrixとかQuaternionとかも扱えますし。

Max2013 SAPのユーザの方はAdvanced Data Manipulationとか言う名前に変わったBox3(中身は一緒っぽい)が使えるようになっていますし、どしどし使ってみて頂きたいツールです:)
そして2014では通常のMaxにも標準搭載!となることを願ってます!!
mParticle(旧Box2)だけとか言わずに是非Box3もお願いします。
頼むぜAutodeskさん。

 
何か分かりづらい箇所、どうしても納得できない部分、説明が足りていないところなどあればコメント下さい。
よろしくどうぞ(・・)ノシ

お疲れ様でしたー。

「[3ds max: PFlowBox3] 実践その1 爆発っぽい形(?)を作る」への2件のフィードバック

  1. PFの詳しい応用例ありがとうございます。
    PFを時間がある時に少しづつ触っていますが
    今のところ「TPではこうやるが、PFではどうやるんだろう」
    という比較が操作基準になっていたんで、「おぉ!そうやるんだ」的な発見が楽しいです

    PFは最初触った時ノードが少ないなという印象で、一つのノードに機能が集約されているようで
    パッと見て何が可能かわかりにくく中身を見て初めて細かい部分が分って来る感じなので
    ざっとでもマニュルを読んで機能を頭に入れておく必要が有りそうですね

    PFは、スタック的な部分とノード的な部分が上手く作られていて視認性も良好で
    ちゃんと整理していると時間を経た後で見返しても何をやっているかがとてもわかりやすいようです。
    TPの方は独自のグールプという考え方があり、これが使い易い場合もあるし(特に階層的な管理で)
    複雑になってくると逆に視認性が悪く、どうなってるか分らなくなる時があるので
    PFのイベント管理とどちらが良いか色々なシチュエーションで試して見ようと思っています。
    ここら辺の操作は機能的優劣というより好みの問題も大きいのでしょうね。

    仰る様にPFではTPよりもさらにミクロレベルの操作が出来るのがよくわかりました。
    最近ノードベースの操作のアプローチが多いアプリが増えてきましたが
    細かい操作が出来る反面、同じ効果でも不効率な組み合わせを作ってしまうこともあるので
    人の作ってる組み合わせを見て、「あぁこうやった方が良いな」と目から鱗が落ちる経験もあり
    ここら辺がCGの面白さや、まさに「経験工学やなぁ」などと感じる部分で
    CG屋は画家よりも大工に近いと思う瞬間でもあります。

  2. >saintcatさん
    コメント遅くなってしまってすみません:P

    喜んで頂けて何よりです!
    PFだけのチュートリアルならまだ母数も多いんですが、Box3にフィーチャーしているので見ている人の何割が分かるんだろうとか思いながら書いてましたw
    未来のために、Max2014にBox3相当のものが付いてくれると信じて書いていたものの反応頂けると嬉しいですw

    >PFは最初触った時ノードが少ないなという印象で、一つのノードに機能が集約されている
    そうなんです。これは最初に結構戸惑ったところです。
    だからこそまとめておきたかったというのもありまして:P

    >PFは、スタック的な部分とノード的な部分が上手く作られていて
    これもそう思います。
    PFとBox3は同じ方が作られたと聞いていますが、Box3の事まで想定してPFを設計したのであれば相当頭の良い方だなーと思いました。
    事実PFだけでも簡単なことは十分出来ますし、それどころか結果に到達するまでのスピードが他のツールと比べて異様なまでに早い!
    最初に触った時はぶっ飛びましたよww
    それと同時にBox3を使う事で細かい制御も可能ですし、これは2つ一緒に使って初めて1つのツールなんだなーとも感じました。

    PF、TPともに良い点悪い点あると思いますが、普段どちらを使うにしてもいろんな考え方を知っておくのは知識としては良いんじゃないかなーと思っていますので、この一連の記事が少しでも普段の制作の足しになってくれれば幸いです:)

コメントを残す

メールアドレスが公開されることはありません。