On this page |
シミュレーションはオブジェクト、ソルバ、(通常は)フォースを持ちます
-
Sphereツール(Create シェルフタブ)を⌃ Ctrlを押しながらクリックして、原点に配置します。
-
球が選択された状態で、 Rigid Bodies シェルフタブからをクリックします。
-
Houdiniのウィンドウ下にあるプレイバーの再生ボタンをクリックします。
球が落下します。なぜなら球がシミュレーションオブジェクトになっているからです。シミュレーションオブジェクトを作成すると、Houdiniは自動的にオブジェクトレベルでシミュレーションネットワークを作成します。そこには、シミュレーションの挙動を定義したノードが配置されています。ネットワークエディタにAutoDopNetwork
という名前のネットワークが表示されます。
TMI
シミュレーションネットワークは必要なだけ作成することができ、ネットワーク内部に入ってダイナミクスノードを手動で定義することができます。また、再シミュレーションメニューの Current Simulation サブメニューで別のネットワークを選択するまではシェルフツールを使っても、AutoDopNetwork
にノードを作成することができます。
AutoDopNetwork
をダブルクリックして中に入ると、Houdiniがシミュレーションのネットワークを構築したことを確認することができます(Lを押すとネットワークのレイアウトを中心に表示します)。
ネットワークはとてもシンプルですが、Houdiniのダイナミクスの基本概念がわかると思います。そのネットワークには、 オブジェクト 、 ソルバ 、 フォース でシミュレーションが構成されています。
ダイナミクスオブジェクト は、 ある事 をシミュレーションするのに必要なパラメータを保持しています。上記のネットワークでは、球オブジェクトのノードには、シミュレーションするオブジェクトのジオメトリのパス(あなたが作成した球を参照します)、密度/温度/摩擦、初期位置/回転/速度などのパラメータがあります。
ソルバ はシミュレーションするオブジェクトの挙動を計算します。これはシミュレーションの状態を見て、内部ルールを使ってタイムステップ毎に修正します。上記のネットワークでは、RBDソルバがリジッドボディの球の動きと衝突をシミュレーションします。
フォース とは、オブジェクト(シーン内すべてのオブジェクトまたは個々のオブジェクト)に追加することができる情報で、例えば、"このオブジェクトは風の影響を受ける"、"このオブジェクトの動きは抵抗力で鈍くなる"といった内容です。上記のネットワークでは、Gravityノードがオブジェクトに"力のデータ"として接続されています。ソルバがオブジェクトの力のデータを見て、球をタイムステップ毎に重力のシミュレーションをした結果によって球を下に落とします。Drive Simulationシェルフタブのツールはシミュレーションにフォースを追加することができます。
Houdiniは異なるタイプのソルバを持っています
以下が主なソルバです。
-
リジッドボディ - HoudiniはDOPと完全に統合したネイティブソルバを持っています。さらに、特定のタイプのジオメトリには、高速なBulletとODEソルバもあります。
-
パーティクルシステム - パーティクルシステム(POP)はダイナミクスシミュレーションと作用します。例えば、RBDオブジェクトの壁にパーティクルを噴射すると、壁に当たります。
2つのオブジェクトを衝突させるには、ストリームを結合しなくてはならない
他のネットワークタイプでは、Mergeノードはノードの出力を結合して1本にします。ダイナミクスネットワークでは、Mergeノードは リレーションシップ を作成します。このリレーションシップとは、どのオブジェクトが他のどのオブジェクトに影響しているのか記述した特別なデータタイプのことです。
ダイナミクスでメインタイプのリレーションシップは、 collision リレーションシップです。これは、オブジェクトが他のオブジェクトと衝突した時に、オブジェクトの形状/動き/挙動が変化することを意味します。また、RBD、ワイヤー、布シミュレーションには constraint リレーションシップ(ピンとスプリングのようなもの)があります。
リレーションシップについて覚えておくべき重要なことは、計算時間がかかることです。そのため、シミュレーションを最適化するには、お互いに本当に必要なリレーションシップだけを作成したり、1方向のリレーションシップ(オブジェクトが他のオブジェクトに影響を与えるが、その逆がない)を使用する方法を探すべきです。
Geometry Spreadsheetには、どのオブジェクトが影響を与えているのか可視化したアフェクターマトリックスが含まれています。
ビューポートでのシミュレーションの可視化
ダイナミクスの可視化を参照してください。
フラグのオン・オフ
パーティクルやサーフェスノードネットワークと同様に、青のディスプレイフラグは、ネットワークで"出力したいノード"または"一番下流にあるノード"をマークします。つまり、ディスプレイフラグがオンのノードから上流までの範囲がシミュレーションの範囲となります。
DOPには バイパス フラグがあり、そのノードのシミュレーションの状態を確認することができます。通常では、Geometry Spreadsheet Viewでデータのデバッグに使います(以下参照)。
オブジェクトやデータのバイパスを アニメーション するなら、ノードの Activation パラメータにキーフレームを設定します。 Activation が0以外の数値であれば、ノードがアクティブになり、ネットワークに影響を与えます。反対に、 Activation が0なら、ノードは何の影響も与えません。
Geometry Spreadsheet Viewでシミュレーション内部の状態を確認
Geometry Spreadsheet View からシミュレーションのオブジェクトとデータにアクセスすることができます。新しくGeometry Spreadsheet Viewを開くまたは、 Windows ▸ Desktop ▸ Technical でGeometry Spreadsheet Viewペインのあるレイアウトに切り替えます。
左側のツリーには、シーンのオブジェクトとリレーションシップなどのカテゴリが階層で表示されます。右側には、左側で選択したデータの フィールド とその値が表示されます。
このペインはシミュレーションの構造を検査するのにとても役に立ちます。現在のフレーム、現在のディスプレイノードで、どのデータがどのノードに繋がっているのか、データパケットの名前と固有のID、またデータを構成している値を確認することができます。
Geometry Spreadsheet Viewは、シミュレーションを再生する度に動的に更新します。これはデータが時間が経過するにつれてどのように変化するのか確認するときに役に立ちますが、シミュレーションの再生が遅くなります。その時は、ペインの分割線上の矢印を使えば、Geometry Spreadsheet Viewを折り畳むことができます。
複数オブジェクトと複数ソルバ
-
RBD Object - Number of Objects 、
$OBJID
-
Rigid Body Fracture
DOP Networkのシミュレーションの構築方法
ネットワークは上から下へ、左から右へ評価します。複数入力のノードに関しては、1番目の入力を上から下へ、2番目の入力を上から下へ・・・のように評価していきます。
サブステップ
ソルバの衝突検出をより正確にするには、ソルバの Maximum Substeps パラメータの値を大きくします。この値を大きくすると、通常はシミュレーションの計算時間が長くなります。
シミュレーションを含んだDOP Networkの Timestep パラメータを使えば、全体的にシミュレーションの解像度を上げることができます。
ダイナミクスエンジンはタイムステップ(Houdiniが停止してシミュレーションの状態を再計算する時間の間隔)でシミュレーションを計算します。通常はフレームタイム(Houdiniが各フレームを表示する時間の長さ。例:24FPSなら1/24秒)を使いますが、必須ではありません。長いタイムステップはHoudiniではシミュレーションを走らせるのが楽になりますが、正確性に欠けます。 短いタイムステップは計算に時間がかかりますが、より正確な結果が出ます。
ダイナミクスのタイムステップを設定するには、DOP Networkオブジェクトのパラメータを開、 Simulation タブから Time Step パラメータを設定します。
ダイナミックネットワークの個々のソルバノードでは、 デフォルトのタイムステップを細かくするSubstepsの数値を制御することができます。タイムステップを変更すると全体のシミュレーションの それぞれの計算の精度が細かくなってしまう のに対して、これを使うと、特定のシミュレーションにのみ計算精度を上げることができます。
ソルバでSubstepsを制御するには、ソルバの Minimum Substeps と Maximum Substeps のパラメータを設定します。 Minimum Substeps の値を大きくすれば、ソルバは各タイムステップをより細かい計算ステップにします。 Maximum Substeps を制限することで、シミュレーションは最終的に妥当な計算時間に落ち着くことを確認することができます。
Tip
PlaybackオプションのInteger Frame Valuesをオフにして、StepをSubstep値に設定すれば、矢印キーを使ってSubstep間を移動することができます。
オブジェクトとシミュレーションネットワークはデータを押し合う
球を作成してリジッドボディにした時のダイナミクスセットアップでは、ダイナミクスネットワークは、ジオメトリネットワークから球のジオメトリをインポート(ダイナミクスネットワークのトップにあるRBD Objectノードにインポート)して、そのジオメトリの動きをシミュレーションします。
元の球のジオメトリオブジェクトのネットワークには、シミュレーションから動きをインポートし、 オブジェクトに戻します (DOP Importノードがジオメトリネットワークの下にあります)。
つまり、ダイナミクスネットワークでジオメトリの位置などが変更された後でも、レンダリングするものは、元のオブジェクトです。AutoDopNetwork
オブジェクトは、デフォルトではディスプレイフラグがオフになっています。つまりレンダリングされません。
これは、単にMantraが実際にレンダーオブジェクトに対してセットアップするからです。つまり、シミュレーションの動きをオブジェクトにインポートことで、オブジェクトが持っているレンダリングコントロールすべてが使えるようになっているのです。技術的にオブジェクトレベルで直接ダイナミックネットワークをレンダリングすることはできますが、通常は、そのジオメトリには、 レンダリングしたくないガイドとユーザーインターフェースジオメトリ が含まれています。
TMI
Pyro FXツールのようなシミュレーションツールでは、シミュレーション結果をソースオブジェクトにインポートして戻すようなことをせずに、新しいオブジェクトを作成して、シミュレーションの結果をレンダリング用に保持します。例えば、Flamesツールは、ソースジオメトリから炎を生成します。このツールは、オブジェクトレベルで新しくimport_pyro_build
オブジェクトを作成して、シミュレーションの結果をインポートします。
Houdiniダイナミクスはキログラム、メートル、秒の単位を使います
ソルバは現実の世界の物理現象をシミュレーションするので、シーンの数値を現実の世界の単位に合わせる必要があります。Houdiniのダイナミクスシステムの開発者は基本となる SI 単位を使うことに決めました。つまり、1Houdiniユニット単位は、1メートルに相当し、重さは常にキログラム、時間は常に秒で指定します。他の単位は常にメートル、キログラム、秒から派生しています(例えば、密度は、kg/m3で指定します)。