記事の目次

    Packを利用して破片を制御します。

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


    EDIT_小村仁美 / Hitomi Komura(CGWORLD)



    Packの制御

    今回は、Particleの制御の応用として、Packを使ったシミュレーションを試みたいと思います。Pack Objectは、言い換えれば1つのPointとして見ることができます。そのため、POP、すなわちParticleの代用として使用することができます。もちろん、シチュエーションは限られますが、通常のParticleを使用するよりも、より高度なシミュレーションが可能になります。

    具体的なポイントは、今回のアプローチの要となる衝突判定にあります。通常のParticleは、Pointのシミュレーションの後に、インスタンスやコピーなどでパーツに置き換えるのが主流ですが、それだと、パーツ同士の干渉などはシミュレーションできません。パーツ同士をしっかり衝突判定させるためにはRBDなどを用いる必要がありますが、それは非常に負荷が高くなるのも事実です。また、動きの制御も難しくなります。そこで今回は、それらのハイブリッドなシミュレーションを実現すべく、Packを利用したアプローチを検証していきたいと思います。Packは、Pointであるため、その制御がしやすい上、シミュレーションのコストも低いので、今回のシチュエーションにはうってつけです。

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

    01 SOP Flow

    まず、Packの準備から始めます。ソースとなるジオメトリ【A】を準備して、それをVDB from Polygons SOP【B】からVDBへ変換します【1】。それを、VDB Reshape SDF SOP【C】を使って、Erodeで内側へ侵食させて細らせ【2】、さらにVDB Smooth SDF SOP【D】で滑らかにします。これをConvert VDB SOP【E】でPolygonに変換して、コリジョン用のジオメトリとします。

    次に、基のジオメトリからVDBに変換したSDFと、細らせて滑らかにしたSDFにVDB Combine SOP【F】を使ってその差分【3】を取得し、Polygonに変換します。これにより、外殻だけを残した状態をつくり出すことができます【4】。外殻のVDBをConvert VDB SOP【G】を使って、VDBのClassをSDFからFogに変更します。

    これに対して、Scatter SOP【H】でPointを散布して、外殻部分のみにPointが来るようにします。次に、Voronoi Fracture SOP【I】を使って外殻のジオメトリを細かく分解します。これにAssemble SOP【J】を使い、それぞれのピースをPackに変換します【5】。これでPackの下準備は完了です【6】

    今回は、ジオメトリの外殻を作成するためにVDBを使用していますが、この限りではありません。ピースがそれぞれに"name"のアトリビュートをもっており、さらにそれぞれがPackに変換されているというところが最も重要です。

    ここまで完了したら、ジオメトリをあらかじめキャッシュしておくと良いでしょう【K】。特にVDBやVoronoi Fractrureなどは、クッキングに時間を要することが多いので、ふとした瞬間にクッキングが再開してしまわないよう、区切りを付けておくと作業がしやすくなります。

    02 Pack Flow

    Packを用いたシミュレーションを解説します。


    DOP内にPackのセットアップをしていきます。まず、Pack Object DOP【A】を作成し、SOPで、キャッシュした状態のPackジオメトリを選択します。続いて、Rigid Body Solver DOP【B】を作成して接続します。その後、SOP Solver DOP【C】を作成し、その中にPointをアクティブ化するためのしくみを作成します。


    まず、Object Merge SOP【D】でキャッシュしたPackのジオメトリを読み込み、Add SOP【E】などでPointに変換します。これは必須ではありませんが、可視化【F】をしやすくするための準備になります。Sphere SOP【G】を作成し、アクティブにさせるスタート地点を決めます。半径を調整することで、より範囲を見やすくします。次に、このSphereに対してAttribute Create SOP【H】で"active"のアトリビュートを作成し、値を1にしておきます。これも名前は任意で構いませんが、わかりやすい名前にしておきましょう。これをAttribute Transfer SOP【I】を使って基のジオメトリに転送します【1】。この際に、SphereのRadiusとDistance Thresholdをリンクさせることで、より制御がしやすくなります。これを、DOP内のPack【J】にAttribute Copy SOPを使ってコピーすることで、シミュレーションにアクティブの制御を加える下準備ができました。


    SOP Solver DOPの準備ができたら、次は、POP Axis Force DOP【L】を使って、渦のフォースを加えます。この際、VEXPressionsを用いて、activeを使った制御ができるようにコーディングします【2】。POP Force DOP【M】を使って、ノイズを加える際も同じです【3】。このように、Packを使ったシミュレーションではありますが、ForceなどはPOPのものを使用しています。また、PackがPointとして扱えるからこそ、アクティブなアトリビュートの作成などが簡単に行えます。

    後は、コリジョンとなるオブジェクト【N】を配置して完了です【4】。このように、Packを使うことで、Rigid BodyをあたかもParticleを扱うようにセットアップすることが可能になります。これも、Packという独特の使用法の賜物です。シミュレーションも非常に軽く、説得力のあるものが作成できます【5】

    次ページ:
    03 Operators

    [[SplitPage]]

    03 Operators

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

    ●Pack SOP

    今回、直接は登場していないノードですが、メインとなっているPackについて紹介します。Assemble SOPの内部にあるため表には出てきていませんが、Packジオメトリを作成する上でなくてはならないのがPack SOPです。Pack SOPは、元々あるジオメトリをPack Primitiveに組み込みます。Pack Primitiveは単一のPrimitiveになり、1つのPointとして扱われます。その中に組み込まれたジオメトリの参照情報が格納されるため、実際にPack Primitiveに元々ある膨大なジオメトリ情報がメモリに格納されることはありません。そのため、非常に軽量化されたジオメトリとして扱うことができます。

    今回のようにnameを使ったPackのFragmentの場合以外でも、インスタンスやジオメトリのキャッシュなどでも重宝します。ただし、Packにしている状態では、ジオメトリ自体を編集することはできません。そんな制約があったとしても、今回のようなシチュエーションでは問題なく、むしろ通常のRigid Bodyからは想像もできないくらい低コストでシミュレーションを行うことができます。

    Packはその表示方法も選択することができます。Display Asは、どのような状態で表示するかを選択できます。当然、CentroidなどのPoint表示の方が軽量化できますが、概ねPackの時点でも軽量化が済んでいますので、後は、表示のグラフィック能力と相談して決定します。Packでは、Pack By Nameを使って、複数のフラグメントに分割してPackすることができます。今回は、Assembleで一括処理しましたが、個別に処理することも可能です。また、Packには、Packed Edit SOPやUnpack SOPなど、Packした後の処理に使用するノードも用意されています。


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

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