トランジスタスタジオ・秋元純一氏によるHoudini連載「Houdini Cook Book Entry」。Houdiniをより基礎の部分から解説し、最後にはふり返りとして課題も用意しています。第9回はPackを使ったRBDシミュレーションについて解説します。

秋元純一 / Junichi Akimoto
株式会社トランジスタ・スタジオ/取締役副社長
2006年に株式会社トランジスタ・スタジオ入社。日本でも指折りのHoudiniアーティスト。手がけてきた作品は数々の賞を受賞している
破片を生成し、徐々に崩壊させるシチュエーション
今回は、Packを使用した高速なRBD(剛体)シミュレーションについて解説します。RBDシミュレーションは、硬い物体の衝突や動きを計算するもので、主に破壊された破片や変形のない物体の衝突をリアルに再現する際に使用されます。例えば、建物が崩壊して破片が飛び散るシーンや、硬い物体同士がぶつかる場面のシミュレーションでよく活用されます。
今回の解説では、モチーフをバラバラの破片にして、徐々に崩壊していくシチュエーションを表現してみます。Houdiniでは破壊を表現する場面が多く求められますが、そのアプローチは様々です。とはいえ、基本的にはRBDを用いたアプローチが中心で、多くの場合、現実の物理法則に基づいたシミュレーションが行われます。今回は、ややエフェクティブな表現に偏っていますが、外的要因となる力が異なるだけで、基本的なセットアップは一般的なRBDシミュレーションと変わりません。
破壊エフェクトを制作する際、シミュレーションの下準備が非常に重要です。ほとんどの場合、この準備が全体の出来を左右すると言っても過言ではありません。今回は、下準備に少しトリッキーなアクセントを加えることで、よりコントロールしやすい破壊表現を実現しています。それでは具体的な手順を見ていきましょう。
01 All Flow / 全体のながれ

STEP 01
まずはじめに、ベースとなるジオメトリをインポートし、PolyReduce SOPを使ってリダクションをして整理します【A】【1】。
STEP 02
このベースのジオメトリに対して、RBD Material Fracture SOP【B】を使って、破片のジオメトリを作成します。
RBD Material Fracrure SOPは、コンクリート、ガラス、木材の砕け方を再現できるもので、今回は、コンクリートの砕け方を利用して破片を作成しています。ベースとなる考え方はVoronoi Fractureと呼ばれるもので、ボロノイ関数を利用したセル様の分割を作り出すことができます。
今回はシンプルに破片を作成するに留めますが、細かなディテールを追加することも可能で、破壊に必要な代表的な素材の作成が可能です。

この破片を、Pack SOP【C】を用いてPack Primitiveへ変換します。この時点で一度中間キャッシュを作成しておきます【D】。

必要に応じて、破片ごとに色を付けたり【E】【2】、Exploded View SOP【F】などを使って、どのように砕けているかを確認するしくみを作っておきましょう【3】。
STEP 03
次に、Pack PrimitiveをAdd SOP【G】を使って、単純なPointへ変換します。このPointに対し、Rest SOP【H】を使って"rest"のAttributeを作成し、Attribute Noise SOP【I】でPに対してノイズをかけてデフォームさせます。

ベースのジオメトリにScatter SOP【J】を使って数点の基準点を作成し、そのPointにAttribute Create SOP【K】でInt型の"active"のAttributeを作成し、値を1にします。
このAttributeを先ほどのPack PrimitiveをベースにしたPointに対してAttribute Transfer SOP【L】で流し込み、これをアニメーションさせます【3】。

この時点で、元のPack PrimitiveにPointがもっている"active"をAttribute Copy SOPで流し込み、Unpackして、どのようにPack Primitiveに"active"が流れ込んでいるか確認してください【M】。この色の変化は、AttributeのVisualizationで確認します【5】。
STEP 04
続いて、DOP Network【N】を作成し、シミュレーションのセットアップを行います。

今回は、Pack Primitiveを用いたRBDなので、RBD Packed Object DOP【O】を使用します。これをRigid Body Solver DOP【P】でシミュレーションしていきます。
ベースとなる地面は、Groundplane DOPとStatic Solver DOP【Q】に設定しMergeします。 シミュレーションのForceは、POP Force DOP【R】を用いて、浮力とNoiseを与えます。

次に、動き出すためのきっかけとして、"active"を用いたアニメーションの流し込みにSOP Solver DOP【S】を使用します。この内部はSOPと同様になっており、シミュレーションのObjectに対して、SOPからObject Merge SOP【T】でもってきた"active"のアニメーションPointをAttribute Copy SOP【U】で転送します。
こうすることで、毎サブステップの転送がかかり、SOP上のアニメーションのDOPシミュレーションへの流し込みが可能になります。
STEP 05
シミュレーションが完了したら、DOP Import SOP【V】を使って、"rbdpackedobject"だけをインポートします。 これをUnpack SOP【W】でPolygonに戻し、キャッシュをとって完了です【X】【6】。
02 Hints / 制作に役立つヒント
RBD Material Fracture SOP

今回使用したRBD Material Fracrure SOPは、大きく3つの分割を簡易的に表現するために便利なノードです。
コンクリートやガラス、木材に関しては、特に建築物などの破壊エフェクトに良く用いられる素材で、自分で初めから作成するのは面倒なので、こう言った便利なノードがあると非常に楽にセットアップ作業が進められます。また、このノードは、単純に分割するだけではなく、細やかな設定で汎用性高く破片を生成することができるだけでなく、Constraintの設定も同時に行えるため、リアルなシミュレーションには欠かせない要素となります。
ただ、非常に挙動が重いノードでもあり、不必要に親切でもあるため、無駄にメモリと時間を費やすこともありえます。ベストなのは、このノードのしくみに倣って、自分自身でカスタマイズした破片生成のしくみをセットアップできるようになるのが、本当に細かいアプローチをとるためには重要なネクストステップだと考えます。
03 Issues / 今回の課題
Issue 01:Voronoiの分割 / Effect ★★☆☆☆
Voronoi Fractureを使って、Cube状に分割する方法を考えてみましょう。
Issue 02:Velocityのコントロール / Effect ★★★☆☆
Velocityを利用して、破壊のシミュレーションをコントロールしてみましょう。
Issue 03:Particleの利用 / Effect ★★★★☆
Particleを利用して、自動的に分割する場所を作成し、自動制御で砲弾痕を作成してみましょう。
こちらの制作例は、今回のプロジェクトデータ内に用意しています。ひととおり制作できたら、ぜひ確認してみてください。
今回のプロジェクトデータはこちらから>>TEXT_秋元純一 / Junichi Akimoto
EDIT_小村仁美 / Hitomi Komura(CGWORLD)