前回に続き、Houdiniの基本的なノードのみを使用して「蟻地獄」のようなパーティクルアニメーションを作成していきます。
TEXT_森田悠揮 / Yuuki Morita(OnenessArt)
EDIT_三村ゆにこ / Uniko Mimura(@UNIKO_LITTLE)
中心に向かって崩れ落ちていくパーティクルアニメーション
地面を作成したらパーティクルアニメーションに必要なベクトルアトリビュートを作成し、POP Network内でそのベクトルを利用して「粒子のアニメーション」を制御していきます。 使用するのはどれもSOPの基本的なノードですので、初心者の方でも挑戦しやすいかと思います。
自然かつきれいに収束していくよう制御する
【1】Gridを作成
Gridを作成します。次にSubdivideノードを繋げて頂点数を増やします。
【2】Mountain SOPで地形を作成
Mountain SOPで地形を作成します。ノードツリーは以下のような感じです。
【3】Mountain SOPからNullへ繋げる
Mountain SOPからNullへ繋げて地形のオブジェクトとします。別フローでScatterノードを繋げます。
【4】中心に向かって崩れ落ちていくパーティクルアニメーション
スキャッタしたポイント群をPOP Network内でベクトルアトリビュートを基に動かして、蟻地獄のような「中心に向かって崩れ落ちていくパーティクルアニメーション」を作成。
今回の記事のメインワークですね。
【5】Groupにまとめる
崩れ落ちていく地点となる箇所のポイントを「Start」という名前のGroupにまとめます。画像でハイライトされている地点が「Startグループ」に指定したアニメーションの開始地点となります。
【6】グループのポイントにFloat値のアトリビュートを与える
Startグループのポイントに「Infected」という名前を付けたFloat値のアトリビュートを与えます。このアトリビュートの値を拡散させていくことでアニメーションの基礎となる「ベクトルアトリビュート」を生成するため、非常に重要なアトリビュートとなります。
【7】Attribute Wrangleを作成
Solver SOPを繋げて内部へ入り、Attribute Wrangleを作成します。
【8】広がっていくようなシミュレーションを作成
[nearpoints] で自身の位置から指定した個数の指定範囲内のポイントを参照します。サンプリングしたポイントの中にInfectedアトリビュート値が [0] 以上のものがあれば、Accum変数に数値を一定数加算していき、最後に「その数値を参照したポイント数」で割った数をInfectedへ加えるという操作になります。つまり、近くに [Infected=1] のアトリビュート値が存在すれば、自身のポイントにもInfected値が付与されていくというわけです。これにより、徐々にInfected値がStart地点から広がっていくようなシミュレーションができます。
【9】Infected値を可視化する
Solverを出てColor SOPへ繋げ、Infected値を可視化してみます。値が大きくなるに従って白に可視化されます。
【10】確認
タイムスライダを進めてみると、画像のようにStart地点から徐々に白い領域が広がっていくのがわかります。
【11】Infectedアトリビュートをトランスファー
RemeshしたMountainオブジェクトをAttribute Transfer SOPの [Target] に接続し、Solver SOPをSource側に接続します。ここでトランスファーするのは「Infectedアトリビュート」です。
【12】Infected値をならす
Attribute Blurで少しInfected値をならします。
【13】ベクトルアトリビュート [x] に代入
ならしたInfected値をベクトルデータに変換したいので、Attribute Wrangleノードで適当な名前を付けたベクトルアトリビュートの [x] に代入します。
【14】PolyFrameノードとAttribute Promoteノードを接続
PolyFrameノードとAttribute Promoteノードを接続します。まず、PolyFrameノードで先ほど作成したgradというベクトルアトリビュートを参照し、数値の高低を基に新たなベクトルアトリビュート [tangent] を作成します。
【15】Attribute PromoteでPointアトリビュートへ変換します。
このままでは作成されたTangentアトリビュートがVertexアトリビュートとなっているため、「Attribute Promote」で「Pointアトリビュート」に変換します。
【16】確認
可視化してみると、このようなベクトルデータが生成されていることがわかります。Groupノードで作成した「Start地点」に向かってベクトルが発生しています。
【17】VOP内でダブルクロス(外積 ×2)する
Tangentベクトルをさらに「面」に対して完全に平行なデータにするため、ダブルクロス(外積 ×2)をVOP内で行いました。事前に求めておいた「Nアトリビュート」と外積します。
【18】流れ込む速度を調節できるようにする
外積によって新たに生成したTangentベクトルアトリビュートを基に、パーティクルを実際に動かしていきます。POP Network内で「POPVOP」を作成。ポイントクラウドによって、Input2から毎フレームTangentベクトルアトリビュートの値を取得し、パーティクルのvアトリビュートへ加算していきます(加算値はMultiplyで微調節できるようにしています)。これで中心へ向かって流れ込む速度をおおよそ調節可能になります。サーフェイスから離れすぎたら「Minpos」などで吸着させると良いでしょう。
【19】時間を進めてみる
時間を進めると、自然なかたちでそれぞれのポイントがきれいに収束していくようになりました。
【完成】
Profile.
-
森田悠揮 / Yuuki Morita
フリーランスキャラクターデザイナー/デジタルアーティスト/造形作家
国内外問わずアート、映画、ゲーム、広告、デジタル原型など様々なジャンルで活動しているフリーランスのアーティスト。ZBrushでの生物や怪獣などのクリーチャーデザインを得意とする傍ら、Houdiniを用いた動画、アート制作なども行う。
初の著書 『the Art of Mystical Beasts』ボーンデジタルから発売中。
website: itisoneness.com
Instagram: yuukimorita
Twitter: @YuukiM0rita