絶対に挫折しないHoudini入門 13 - ダイナミクス

ダイナミクス

 Houdiniを使えば映画のVFXの様なエフェクトが作れます。ハリウッド映画の様なVFXに憧れて、いきなり流体や爆発のシミュレーションのチュートリアルをやってみたものの、何が起きてるかさっぱりわからん...となったことはないでしょうか。私はなりました

 流体のシミュレーションなどではダイナミクスつまりDOPネットワークが登場します。

 理解のためにEmit Particle Fluidシェルフツールを使って、DOPでの処理の流れを追ってみたいと思います。

 なお、この記事では基礎の基礎であるDOPが介在する処理の流れ、全体像についてのみ解説します。シミュレーションの調整やレンダリングといった実践的な部分はエキスパートの方のチュートリアル動画(ネットで探せばたくさん見つかると思います)を参考にしてください。
 なぜかというと、実践的なチュートリアル動画では今回の記事で解説する様な基礎の基礎みたいな部分が知ってて当然という前提になっていて、あまり説明されないと感じたからです。この記事は入門者用ですので、経験者には当たり前すぎる項目を丁寧に説明していきます。
 この記事を読んだ後に、実際のチュートリアル動画を観るともっと分かりやすい、というような内容を目指します。

DOP

 それでは、説明のための流体のシミュレーションを用意していきます。

 まず、シーンにSphereを配置します。Sphereオブジェクトを選択したまま、シェルフツールのParticle Fluids > Emit Particle Fluidをクリックします。するとシーンビューの下部に以下の様なメッセージが表示されますが、ここは無視してEnterを押します。

画像1

 たったこれだけで水を放出するシミレーションの土台が出来てしまいました。アニメーションを再生すると、Sphereから水のパーティクルが発生します。

画像2

 obj階層を見ると新しくノードが3つ自動で作成されました。ただし、particle_fluidinteriorと書いているノードは今回何もしませんので無視します。
 重要なのはsphere1、AutoDopNetwork、particle_fluidと書かれた3つのノードです。

流体の発生源

 obj/sphere1の中から見ていきます。自分で配置したSphereノードが以下の様に変更されています。

画像3

 このオブジェクト内ではシミュレーションに必要なパーティクルの発生源を作成しています。その処理を担うのはcreat_surfaceと書かれているFLIP Sourceノードです。Sphereノードからジオメトリを受け取ってシミュレーションに必要なボリュームに変換しています。このオブジェクト内でやっている処理はこれだけです。

 しかし、OUT_surfaceとRENDERと書かれているノードがあります。これらはNullノードです。名前の通り何もしないノードです。何もしないですが、便利なノードです。いろいろな使い方があります。このケースでは以下の事をしています。

1. OUT_surface: この後のDOPネットワークでここで作成したボリュームを受け取る必要があります。その際に、ノードを見つけやすいような目印の役割をしています。
2. RENDER: ボリュームがレンダリングされてしまわないようにダミーとして機能しています。

1についてはこの後の章で説明します。2についてですが、紫色のフラグはRenderフラグといいます。Ctrlを押しながらDisplayフラグをクリックするとON/OFFすることが出来ます。
 試しにRENDERのRenderフラグをOFFにしてRender Viewでレンダリングしてみるとこのようになります。

画像4

 意図した発生源の形状であるSphereではなく、ボリュームがレンダリングされてしまいました。ボリュームはDOPのシミュレーションで必要なだけであり、レンダリングしたくはありません。こういった場合に、Nullノードを単体で配置してRenderフラグをONにすることで、データは出力するけどもレンダリングはされないノードを作ることが出来ます。

DOPネットワーク

 次にAutoDopNetworkの中を見てみます。この様になっています。このノード内はDOPネットワークです。このノードでは実際のシミュレーション計算を行っています。

画像5

 objレベルでsphere1とAutoDopNetworkは繋がっていませんが実はつながっています

画像6

 右上のVolume Sourceノードでsphere1で作成したボリュームを受け取っています。ここで指定しているのはsphere1にあったNullノードです。目印として機能しているNullノードによって対象が見つけやすくなっています。(好みの問題はあります。)
 Houdiniはノード同士を線で繋げて処理を行うというイメージが強いですが、線でつながっていなくても実はパラメータ参照でつながっていることがあるので注意が必要です。

 Mergeノードは複数のボリュームを受け取った場合にマージする役割ですが、今回はボリュームは一つなので実質何もしていません。

 その下のFLIP Solverノードが実際のシミュレーション計算の核です。ここで流体の挙動を計算しています。パラメーターが無数にあります。FLIP Solverノードに繋がっている左上のFLIP Fluid Objectノードは流体としてふるまうパーティクルの設定をしています。

画像7

 FLIP Solverノードの下のMergeノードはここでは実質何もしていません。その下のGravity Forceノードで重力を与え、パーティクルを下へ落としています。FLIP Solverノードは重力を加味した計算をしないのだろうか? と不思議に思いましたがダイナミクスの計算ではフォースの計算とうフェーズでまとまっているようです。
参考: Houdini初級編:ダイナミクスシミュレーション > フォース
 試しにGravity Forceノードの代わりにDrag Forceノードを繋いでGoal Velocityなど変更してみると、下方向以外に流体が動きます。

画像8

 最後のOutputノード(OutputフラグがON)が最終的な流体シミュレーションの出力です。

サーフェスの作成

 obj階層3つ目のノードparticle_fluidの中を見ていきます。この様になっています。

画像9

 このノードでは、DOPの計算結果を受け取り、パーティクルからサーフェスを作っています。パーティクルだけでは水に見えないためサーフェスを作成してからレンダリングをするためです。
 また、シミュレーション結果を圧縮したりディスクにキャッシュとして保存したりなど、効率化に関する処理も担っています。

 一番上流のDOP I/Oノード(import_particle)はDOPが計算した結果を受け取っています。ここでも線ではなくパラメーター参照でつながっています。

 Fluid Compressノードで、流体シミュレーションを圧縮し、その下のFile Cacheノードでディスクに保存できます。

 その次のParticle Fluid Surfaceノードがパーティクルからサーフェスを作成しています。その後に再度File Cacheノードでディスクに保存する機会を設けています。

 この結果が流体としてレンダリングされることになります。

 以下の2つのノードはDOPの計算結果や、サーフェスのプレビュー用です。

画像10

 キャッシュの作成などアーティスト思考ではない(?)処理が差し込まれているため入門者にはとっつきにくいですが、効率化のために必要な処理ですので慣れましょう。

コリジョンオブジェクトの作成

 このままだとあまり流体に見えないのでコリジョンオブジェクトを配置して衝突させてみます。

 シェルフツールのCollisions > Ground Planeをクリックします。床が作成されます。Sphereが床にめり込んでいるので、sphere1オブジェクトを少し上に移動させます。

画像11

 アニメーションを再生すると床に流体が衝突します。

画像12

 ネットワークビューを見るとgroundplane_object1が作成されています。中を見るとこのようになっています。Object Mergeノードがオブジェクトを読み込んでいるだけでした。実体はDOP内にあるようです。

画像13

 AutoDopNetworkの中を見てみます。この様になっています。ノードのレイアウトが散らかっている場合はLキーを押すと整列されます。

画像14

 Ground PlaneノードStatic Solverノードが追加されています。それはFLIP Solverノードと一緒にMergeノードに繋がっています。

 ぱっと見Static SolverノードとFLIP Solverノードは直接つながっておらず、互いに関係が無いように見えます。なぜこれで水流が床にぶつかるのでしょうか?

 これを理解するにはこのあたりのヘルプを読むと良いと思います。

 とりあえず、すごく大雑把な理解としては、FLIP SolverノードやStatic Solverノードなどのソルバーノードは内部でリレーションシップと呼ばれるものが作成され、相互に作用するようです。それらのリレーションシップはGeometry Spreadsheetで確認できます。

画像15

まとめ

画像16

 ダイナミクスの流れが伝わりましたでしょうか。すごく複雑なことを行っているように感じますが、Houdiniのダイナミクスは基本的に以下の三段構えです(特にシェルフツールで作った場合)。これは流体でも布でも炎でも共通です。

1. シミュレーションに必要なオブジェクトの作成(SOP)
2. シミュレーションの計算(DOP)
3. シミュレーション結果からレンダリング用のオブジェクトを作成/キャッシュなどの後処理(SOP)

 この全体像を忘れずに実践的なダイナミクスのチュートリアルをいろいろとやってみると良いと思います。


もしこの記事があなたのお役に立てたなら幸いです。 よろしければサポートをお願いします。今後の制作資金にさせていただきます!