今回は、Packed RBDに対して、Attractを用いたシミュレーションを行なっていきます。

記事の目次

    Information

    「HOUDINI COOK BOOK +」


    CGWORLD Online Tutorialsは、これからHoudiniを学習しようとしている方に向けて「Houdini COOKBOOK +Academy」を改訂しHoudini 19.5をベースとしたオンライン講座「HOUDINI COOK BOOK +」をリリースしました。

    第1回を無料公開中!

    RBDをAttractで引き寄せる

    Attractは引き寄せるようなForceをかけることができるため、様々な場所で応用することが可能です。例えば、磁石に吸い寄せられる砂鉄や、引力を表現する魔法など、用途は様々です。変わったところだと、蜂などの羽虫がまとわりつくような表現などにもうってつけです。

    元々はPOP向けのForceですが、今回はPacked RBDに対して使用していきます。Packed RBDは、Particle的に扱うことが容易なだけでなく、今回のように大量のオブジェクトに対しても非常に高速にシミュレーションをかけることができることが魅力です。さらに、Particleでは表現しきれない、体積をもった衝突判定でも本領を発揮します。基本的な構築はPOPと同等です。

    Attractを使えば、引き寄せるためのしくみ自体は非常に簡単なものですが、考え方としてはそれだけではなく、他にも多数のアプローチがあります。引き寄せられたい場所への道筋をあらかじめFieldをもたせる方法や、座標からベクトルを算出し、その方向へ力をかけたり、方法は様々です。

    今回は基本的なアプローチを紹介しますが、ぜひ自分ならではの方法も考えてみてください。

    今回のHoudiniプロジェクトデータはこちら

    01 SOP Flow / SOPのながれ

    まず、Attractを用いて引き寄せたいベースのジオメトリを読み込み、必要に応じてPolyReduceをかけます【A】。今回はそこまで正確性を求めていないので、なるべく軽量化しています【1】

    次に、このジオメトリに対して、Scatter SOP【B】を使ってPointを散布します【2】

    このPointに対してRest Position SOP【C】で"rest"のAttributeを作成します。その後、Attribute Noise SOP【D】を使って、P【3】に対してNoiseを加算します。これで歪んだPointをつくり出し【4】、それをClip SOP【E】でカットします。

    最後にWrangle【F】でPを"rest"の値に直せば、歪んだ状態でカットしている断面にすることが可能です【5】

    次に、引き寄せられるジオメトリを作成します。今回は、簡単にSphereを使ってベースを作成します【G】。そのSphereに対して、Attribute Noise SOP【H】でPにNoiseを加算し歪みをつくります。この方法は【D】と同等です。

    続いて、これらを配置するPointを作成します。Circle SOP【I】でエリアをつくり、そこにScatter SOP【J】でPointを作成します。このPointにWrangle【K】で"pscale"を作成します。fit関数でレンジを調整したrand関数【6】を用いることで、最小値と最大値【7】をつくり出すことが簡単にできます。同等のことが、Attribute Noise SOPに似たAttribute Randomize SOPで行うことも可能です。

    その後、Attribute Noise SOP【L】を使って法線N【8】をばらけさせます。このとき、Noiseの値をZero Centered【9】にすることで、負の方向を向いたベクトルを作ることが可能です【10】。これも同等にAttribute Random SOPでも構いません。

    このPointに対して、ジオメトリを配置しますが、ランダムにそれぞれの種類を選ぶ方法を解説します。

    まず、Pointに対して、Attribute Create SOP【M】を使い、"variant"【11】を整数値【12】で作成します。作成する数値は、配置するジオメトリの数で変動しますが、この例だと、0~4の5種になるように、Expressionを組みます【13】。 同じように、Merge【N】したジオメトリに対して、Connectivity SOP【O】に対して、"variant"を設定します【14】

    これで、繋がっている同士で、0~4の整数値が埋め込まれました【15】

    これらをCopy to Points SOP【P】を使って、配置します。この時、Piece Attributeに"variant"を指定します【16】。また、Pack and Instance【17】にチェックを入れて、Packed Primitiveとして配置して完了です【18】

    シミュレーションはDOP Network【Q】を用いて行います。シミュレーション後に、Dop Import SOP【R】でPacked Primitiveをインポートして、キャッシュ【S】をします。

    02 DOP Flow / DOPのながれ

    DOPのフローを解説します。まず、Ground Plane【A】とAttractと同等の形状をもつCollisionジオメトリをStatic Object【B】として読み出し、Static Solver【C】を設定します。

    次に、Packed RBD Object【D】をつくり、Copyで配置したPacked Primitiveを読み出します。このとき、Bullet Dataの設定からCollision PaddingとShrink Collision Geometryをなくします【1】。これは場合によりますが、今回は小さなジオメトリなので、余計な衝突判定をしないように設定しました。

    次に、Bullet Solver【E】を作成します。これを、Packed RBD Objectと共に、Multiple Solver【F】でApplyします。Bullet Solverは、Sleeping Timeを0【2】にして、Packed RBD ObjectでDeactive化されるものが出てこないようにします。

    続いて、POP Attract【G】をつくります。これが今回のメインとなる動きをつくり出すForceです。GoalをPointsに設定し【3】、SOPからGoalとなるPointを読み込みます【4】。Match MethodはPoint per Particleに設定し【5】、PointごとにAttractされるようにします。Forceは今回は単純に引き寄せるためのForce Scale【6】の数値を調整しています。

    その他のForceとして、エリアに回転の力をかけるためのPOP Axis Force【H】、NoiseのForceをかけるためのPOP Force【I】、Forceへ抵抗をもたせるためのPOP Drag【J】を使用しています。これらを組み合わせて、複雑な動きをそれぞれで調整することができます。

    全体の動きを軽量にトライするために、少量のPacked Primitiveで試し、問題がなさそうであれば、最終的なシミュレーションをして完了です【7】

    03 Operator / 今月のオペレータ

    ●Attribute Noise SOP

    今回メインに説明したのは、POP Attractではありますが、ここではあえて準備段階で活躍した、Attribute Noise SOPを紹介します。合わせて姉妹的立ち位置のAttribute Randomize SOPも紹介します。

    これらのオペレータは、HDAではありますが痒いところに手が届くように設計されており、これまではVOPやWrangle等で作成していたフローを簡単にこなしてくれます。 様々なパターンでNoiseやRandomをつくり出すことができますので、あえてつくる機会はかなり減ったと言えます。

    もちろん、シチュエーションによってはどうしても手作業でオートクチュールなフローを作成する必要は出てきますが、同じ内容を簡易的に試すことができると言うのは、まず手が無駄に止まることがないため重宝します。

    秋元純一 / Junichi Akimoto

    株式会社トランジスタ・スタジオ/取締役副社長

    2006年に株式会社トランジスタ・スタジオ入社。日本でも指折りのHoudiniアーティスト。手がけてきた作品は数々の賞を受賞している

    www.transistorstudio.co.jp

    TEXT_秋元純一 / Junichi Akimoto
    EDIT_小村仁美 / Hitomi Komura(CGWORLD)