今回はPBDを活用して、パーティクルが表面を這う表現を作成します。

記事の目次

    ●CGWORLD Online Tutorialsにて特別無料配信中!
    【無料】Houdini COOKBOOK +ACADEMY 特別編 ~コロナをやっつけよう!~

    PBDの活用

    今回はParticleのシミュレーションで、Grainを使ったPBDを利用してParticle同士のコリジョンを行い、サーフェス上をParticleが這っているような表現を検証してみたいと思います。

    最近ではこういったオーガニックな表現を無機質に取り込むことも増えていて、通常のParticle表現では再現できないような、リアリティのある動きをつくり出すことが要求されています。

    しくみとしてはそこまで複雑なものではないのですが、セッティングが少しピーキーだったりもするので、なるべく扱いやすいしくみを検証していきたいと思います。

    かつてのHoudiniでは、Particleは体積をもっておらず、Partice同士の干渉を再現するのは非常に難易度が高かったのですが、PBDの登場により、かなり簡単にかつ低コストでシミュレーションを行うことが可能になりました。そのため表現の幅は格段に広がっており、今回のような基本的な考え方を応用すれば、さらに多岐に渡った表現が可能になると考えています。

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

    01 Source Flow

    Sourceのながれを解説します。

    ベースのジオメトリを読み込み【A】【1】、VDB From Polygons SOPを使って【B】、SDFへ変換します。このSDFをVDB Smooth SDF SOP【C】で少々滑らかにします【2】

    この工程は、元となるジオメトリの形状によって調整します。このSDFをNullでCollision用のSDFとしてマークしておきます。次に、Convert VDB SOP【D】を使ってVDBからPolygonへ変換します【3】。変換したPolygonから、Scatter SOP【E】でPointを散布します【4】。このときの数に関しては、後の"pscale"の設定によって調整していきます。

    Pointに対して、VOP【F】を使って"pscale"を作成します。VOP内では、Noiseを2つ使っています【G】。1つ目は、2つ目の1D NoiseのPositionの空間に対して3D Noiseを加算しています。こうすることで、さらに歪んだNoiseを作成することができます。つくられたNoiseは、Fit Range VOP【H】を使って、最小値と最大値をParameterで調整できるようにしておきます。最終の値をBind Export VOPでAttributeとして作成します【5】

    作成された"pscale"を利用して、Relax Point SOP【I】を使って、Input2に接続したジオメトリに沿ってリラックスさせます【6】。こうすることで、"pscale"の大きさに応じて綺麗にパッキングされた状態のPointになります。

    このとき視認性を上げるために、実際の並びをSprite SOP【J】を使って、"circle.pic"を読み込み、"pscale"のサイズで表示します。Display OptionのGeometryタブからPointの表示をDiscに変えても"pscale"のサイズで表示できますが、輪郭などが出ないため、今回のようにパッキングされていると視認性が悪くなります。そのため、今回は仮にSprite SOPを使用しています。

    最後に、Dopnet【K】にSourceとなるPointと、CollisionとなるSDFをそれぞれ接続して準備完了です。

    02 POP Flow

    Particleのシミュレーションを構築します。

    Dopnet内で、POPのセッティングをしていきます。POP Object DOP【A】を作成し、POP Solver DOP【B】に接続します。 POP Source DOP【C】を作成し、Emission TypeをAll Points、Geometry SourceをUse First Context Geometryに設定します【1】。次に、BirthタブのImpulse Activationに対し、1フレーム目のみ発生するようにエクスプレッションを書き込みます【2】

    POP Force DOP【D】を作成し、NoiseのForceを作成します。これが全体の動きの元、全てになりますので、シミュレーションを行いつつ調整しましょう。

    次に、POP VOP【E】を使って、Particleがサーフェスに這うようにするためのセッティングを行います。

    POP VOPのInputsタブで、Input 2はSecond Context Geometryへ設定します【3】。内部では、Input 2で読み込んだSDFから、Volume Gradient VOP【F】とVolume Sample VOP【G】を使って、ParticleのPosisionを計算し直します。Volume Gradient VOPでは、元となるジオメトリ表面を起点にSDFの方向を出力し、Volume Sample VOPでは、表面を起点とした深度を出力します。それらを使ってVectorを反転し、深度に応じた距離をParticleの現在のPositionへ加算することで、Force等によって離れたParticleが表面へ戻る演算となります。このとき、Particleに対して、表面のVectorを法線へ代入しておきます。

    次に、SOP Solver【H】を使って、表面へ吸着したParticleをさらに均します。

    SOP Solver内部では、Object Merge SOP【I】で引っ張ってきたジオメトリを使って、Relax Point SOP【J】で表面へ均一に均します。このときのMax Iterationはそこまで高くなくて良いです。また、このSOP Solver自体がなくとも表面へ張り付く効果は得られますが、隙間が空きすぎたりするのを防ぐことが可能です。

    次に、POP Grain DOP【K】を作成し、ParticleをPBDとして扱えるようにセッティングをします。Assume Uniform Radiusのチェックを外して、"pscale"の大きさがそれぞれで異なるよう設定します。それ以外は、今回はPBD化するためだけに用いているので、特筆するような設定はしていません。

    ただし、このままではForceによってPBDのVelocityがステップごとに更新されてしまうため、サーフェス表面へ拘束しておくことが難しくなります。そこで、POP Wrangle DOP【L】を使って、Velocityを0にしておきます【4】

    ここでは既にSpriteのAttributeがあるため、本来必要ありませんが、SOPで設定をしていない場合はこのタイミングでSprite【M】を追加しても問題ありません。
    最後に、POP Solver DOPの設定をします。PBDの精度を高めるために、Min Substepsは少し高めに設定します【5】。こうすることで、無駄な重なりや微振動などを抑えることが可能です。

    03 Finish Flow

    Dopnetでの設定が完了したら、File Cache SOP【A】でシミュレーションをキャッシュします【1】

    今回は、Particleをそのままレンダリングするのではなくジオメトリを配置しますが、その際、Particleを置き換えるとジオメトリのPolygon数が膨大になってしまうため、Instanceを利用したいと思います。

    まず、配置するジオメトリをモデリングします【B】。今回の想定では円形のものになってしまいますが、そのレギュレーション内で、思い思いのものを作成してください。完了したら、位置やサイズを調整し【C】、キャッシュ【D】します。

    Attribute Create SOP【E】を使って、"instancefile"のAttriuteを作成します【2】。Stringsのタイプで、先ほど作成した配置用ジオメトリのパスを設定します【3】。これでInstanceの準備が整いました。

    確認のために、Instance SOP【F】を使って、Instance Attributeを"instancefile"へ設定します。そうすると、実際にInstanceされるジオメトリを表示することが可能です【4】【5】

    04 Operators

    ●Volume Gradient VOP&Volume Sample VOP

    今回、メインどころを大きく助けるために役立ったのが、Volume Gradient VOPVolume Sample VOPです。

    HoudiniではSDFを使用することが多々ありますが、SDFを利用したモデリングで非常に役立つオペレータです。SDFを単純なPrimitiveとせず、その情報を最大限に活かしてくれる、素晴らしい機能だと思います。

    VOPの中でもなかなかにマイナーではありますが、使い方如何では可能性は無限大で、筆者も好きなオペレータにランクインします。 今連載でも解説したように、SDFに限らず、Volumeから情報を取得する方法としては一番スマートで、使い方もシンプルです。だからこそ、その情報をどのように使用するかが腕の見せどころでもあり、難しい部分になります。ただ、言い換えれば、Volumeから取得していると言うだけで考え方は他のVOPとも同じなので、そこまで難しく考えずに柔軟に取り入れてもらいたいと思います。

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

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

    秋元純一 / Junichi Akimoto(トランジスタ・スタジオ/取締役副社長)

    日本でも指折りのHoudini アーティスト。
    アーティスト業務の傍ら、Houdiniアーティスト育成や布教活動に勤しむ

    www.transistorstudio.co.jp
    blog.junichiakimoto.com

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