記事の目次

    Packを発生させてParticleのように制御します。

    TEXT_秋元純一 / Junichi Akimoto(トランジスタ・スタジオ/ディレクター)
    日本でも指折りのHoudini アーティスト。
    手がけてきた作品は数々の賞を受賞している。
    代表作に、HIDETAKE TAKAYAMA『Express feat. Silla(mum)』など。
    www.transistorstudio.co.jp
    blog.junichiakimoto.com


    EDIT_小村仁美 / Hitomi Komura(CGWORLD)



    Packを常に発生させるセットアップ

    以前、連載Vol.90にてPackをParticleのように扱う方法を紹介しましたが、今回はさらにそれを発展させ、Packを発生させつつRBDとParticleの良いところをハイブリッドさせる方法を取り上げます。通常のRBDはイニシャルフレームで読み込まれたものをシミュレーションしますが、それでは発生のコントロールが難しく、あまりスマートではありません。POPの発生のしくみを応用することで、Packを常に発生させることができます。

    以前解説したPackをParticleとして制御したものは、いうなれば、単純なPointとしてシミュレーションしていましたが、今回は、ちゃんとPackのRBDとしてシミュレーションできるようなセットアップが必要になります。そのためには、少し通常よりも複雑なセットアップをしなくてはいけませんが、それもセオリーとして覚えてしまうことで、今後の応用へも活かすことができると思います。

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

    01 SOP Flow

    ソースの準備をします。

    はじめに、コリジョンとなるジオメトリを準備します【A】。次に、Curve SOP【B】を使ってコリジョンを取り巻くようにNURBSカーブを作成します。これがCurve Forceのジオメトリとなります。

    その後、Group SOP【C】を使ってルートとなるPointを指定します。このPointに対してSphereをコピーして、ISO Offset SOP【D】を使ってVolumeを作り、そのVolumeに対してScatter SOPで【E】Pointを散布します。ここのPointの数は、毎フレームの発生の数になります。これに、ランダムな"pscale"を作り【F】、Boxをコピーします。

    上記のBoxをPackに変換します。通常であればCopy to Points SOP→Pack and Instanceの設定でPack化することができますが、その方法では"name"のAttributeがつかないので、その設定を別途したいと思います。これも、Assemble SOPで対応できますが、毎フレーム発生するPackに対応するためのセットアップ方法を解説します。

    Connectivity SOP【G】で繋がっているもの同士のアトリビュート【1】を作成します。次にAttribute Create SOP【H】で"name"のアトリビュートをPrimitiveに対し、Stringのタイプで作成します【2】

    Attribute Wrangle SOP【I】を使って、"name"に対してフレームごとに増えていく番号を作成して値を設定します【3】。続いて、Pack SOPにより"name"ごとにPackにします。そのPackに対してAttribute Wrangle SOPを使い【K】"name"のアトリビュートを追加します【4】。これで、カスタムされたAssembleを設定できました。

    今回はあまり使用していませんが、例えばPackをレンダリング用のジオメトリに差し替えるなど様々な用途に使えるよう、発生に対応したセットアップと言えます。これで、DOPの下準備が完了です【5】


    次ページ:
    02 DOP Flow

    [[SplitPage]]

    02 DOP Flow

    Packを制御します。


    DOPの中で、シミュレーションのセットアップをします。まず、Ground Plane DOPとStatic Object DOPを使って、コリジョンの設定をします【A】。続いて、RBD Packed Object DOPを作成します【B】。ここでSOPで作ったソースを選択します【1】。これにより、ObjectはPackとしてセッティングできるようになります。

    発生には、POPのセッティングを使用します。POP Source DOP【C】を使ってソースを読み込みます【2】。こうすることで、毎フレームPackジオメトリが読み込まれることになります。

    次に、動きの制御にはPOP Force DOP【D】でノイズを作成し、POP Curve Force DOP【E】を使ってDOPで作ったカーブに沿って動くためのForceを発生させます【3】。これらの動きをシミュレーションするためにPOP Solver DOP【F】を作成します。


    また、今回はPack同士の衝突もシミュレーションしたいので、Bullet Solver DOP【G】を使います。ただ、既にPOP Solver DOPを使用していますので、このような場合にはMultiple Solver DOP【H】を使い、RBD Packed Object DOPに対して複数のSolverを適用します。このように、Objectには複数個のSolverを適用する術があることがわかります。今回のように、POP的な制御とRBDの制御を組み合わせることで、より直感的なアプローチを組み上げることができます【4】


    最後に、SOP Solver DOP【I】を使って、ImpactのデータをAttribute化しておきます。SOP Solver内でImpactのアウトプットから、Attribute TransferもしくはAttribute Copyなどを用いて、Impulseのデータを取得します【J】。こうしておくことで、衝突を可視化することもできます【5】


    次ページ:
    03 Operators

    [[SplitPage]]

    03 Operators

    主要ノードを解説します。

    ●Multiple Solver DOP

    今回のメインとなるオペレータは、Multiple Solver DOPです。

    DOPのObjectに対して、2つ以上のSolverを計算させたい場合に使用します。接続した順番通りに適用される仕様になっています。

    通常では、各SolverがObject上の異なるDataに対して作用するように設定します。例えば、RBD Solverを2つ計算させた場合、Objectが2倍の速さで動きます。これは、同じ名前のPosisionに対して作用しているからになります。

    各Solverが異なるData名をもつことも重要です。Unique Data Nameを使って、それぞれのSolverのData名が同じにならないようにしましょう。今回のシチュエーションの場合は、順番やData名はあまり気にしなくとも問題ないと思いますが、場合によっては、思わぬ結果を招きかねないので、注意が必要です。

    Micro Solverなどを使ってカスタマイズをしていく際やオリジナルのSolverを作成する際には、必ず必要になるDOPノードです。


    • 「Houdini COOKBOOK +ACADEMY」
      Houdiniを基礎から楽しく学ぶオンライン講座

      公開日程:毎週金曜日公開(予定)
      価格:1,200円(税込)
      ※第一回「Houdiniの基本概念とインターフェイス」は無料公開中
      受講対象:Houdiniをこれから学びたい方、Houdiniの勉強で挫折した方など
      cgworld.jp/special/houdinicookbookacademy