記事の目次

    Volumeを用いてParticleを制御します。

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


    EDIT_小村仁美 / Hitomi Komura(CGWORLD)



    Volumeの利用

    今回は、Volumeを使ったParticleの制御を紹介します。Houdiniの特徴として、SOPとDOPの相互関係の親密さが挙げられますが、今回のようなアプローチは非常にHoudiniらしいといえます。Houdiniでは、SOPにおいて、Volumeの扱いやすさが年々向上しています。エフェクトを制作する際には避けて通れないVolumeですが、VDBなどの台頭もさることながら、Volumeを扱うためのツールの豊富さがそれを端的に表していると言えます。

    今回特にフォーカスしたいのが、SDFです。SDFはSigned Distance Fieldの略称で、このVolumeは距離のフィールドとして利用できるため、Volumeの境界線までの距離を取得できるのが大きな特徴です。これを利用することで、Particleの制御を大幅に向上させることが可能となります。また、Volumeを使うことで、Particleにより立体的なフィールドの考え方をもたせることができるのも、非常に重宝するポイントです。今回は、簡単な使用方法を解説しつつ、その理解を深めてもらえればと思います。

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

    01 SOP Flow


    まず、ベースジオメトリ【A】を準備して、ソースとなるPointを作成していきます。Pointであることが必須ではありませんが、今回はわかりやすくPointを使用します。まず、ベースジオメトリのサーフェスに、VOP【B】を使ってノイズの濃淡をAttribute化します。このAttributeを用いて、Scatter SOP【C】のDensity Attributeのパラメータに指定します。このとき、Relax Iterationsは切っておくとスムーズです。これが、表面用のソースとなります【1】


    次に、内部用のソースを作成します。今回はVDB from Polygons SOP【D】を用いて、ジオメトリ全体をVDB化します。ここでは調整しやすいようにDistance VDBで作成しますが、名前はdensityとしておくと面倒がありません。VDB Reshape SDF SOPやVDB Smooth SDF SOPを用いて調整し【E】、Convert VDB【F】でFogに変換します。このFogをVolume VOP【G】を用いてノイズとかけ合わせ、Densityにムラをつくり、Scatter SOP【H】でPointを作成します。ノイズを使えばScatterされるPointにムラを出すことができるので非常に簡単です【2】。同等のアプローチはISO Offset SOPでも可能ですが、今回ジオメトリ形状が複雑なので、より軽快に作業できるVDBを選択しています。


    続いて、SDFを作成します。まずVDB from Polygons SOP【I】を用いてDistance VDBを作成し、それをConvert VDB SOP【J】でVolumeに変換します。変換せずにVDBのまま使用したい場合は、VDB from Polygons SOPのFill Interiorにチェックをして内部を埋めます。また、Exterior Band Voxelsも必要に応じて増やしましょう。これでSDFの準備ができました【3】


    さらに、サーフェスの表面のVelocity Fieldを作成します。まず、PolyFrame SOP【K】でTangent方向にベクトルを作成します。次に、VOP【L】内で、Noise【M】のベクトルとそれぞれのTangentベクトル【N】との内積を作成し、Tangentベクトルとの積を求めます。それぞれを合算して正規化【P】します。これで表面を這うようなNoiseのベクトルをつくり出すことができます【4】



    これをSmooth SOP【Q】でさらに滑らかにし、Fluid Source SOP【R】のContainer SettingsをVelocityにします。これでジオメトリのVelocityをVolumeのFieldにすることができます【5】。また、Comb SOP【S】などを用いれば、自由にVelocityの方向を描けるので面白い結果になると思います。


    サーフェスのField作成と同じ方法で、ジオメトリから直接Fluid Source SOP【T】を用いてVelocity Fieldを作成します。このとき、Curl Noiseを用いて内部のVelocityを作成します。これで内部のFieldが完成です【6】


    次ページ:
    02 POP Flow

    [[SplitPage]]

    02 POP Flow

    VolumeでParticleを制御します。


    まず、Streamを2つに分けて作成します。表面に近いoutsideのPOP Source DOP【A】を用意して、SOPからソースPointを選択します。量感などは好みで調整してください。次に、POP Advect by Volumes DOP【B】でSOPからFieldを選択し【1】、Advection Type【2】をVelocityにして強さなどを調整します【3】


    その後POP VOP【C】でCollisionを作成します。Volume Sample VOP【D】で距離を出し、Volume Gradient VOP【F】でベクトルを出します。これらを使って、SDFの境界線へPointのPositionを移動します。これで境界線へ貼り付くCollisionを作成することができます。POP VOPにおいて、外部のデータを参照するために、Inputの設定をしておきます【4】。これでSOPのデータをVOP内で参照することができます。



    次に、内部のPOP Source DOP【G】を用意してParticleを発生させ、POP Advect by Volumes DOPを用いて【H】outside側と同じように設定します。続いて、POP VOP【I】を用いてCollisionを作成します。Volume Sample VOP【J】を用いて境界線までの距離を算出し、Idでバラバラになるように数値を作成して【K】境界線に近づくと減速するように設定します【L】。こうすることで、ソフトな衝突をするCollisionを作成することができました。また、境界線の外側に出てしまったParticleに対してAttributeを作成し【M】、POP Kill DOP【N】を用いて削除します【5】



    これでそれぞれ2つのStreamからなるParticleを作成できました【6】。それぞれのStreamごとにVOPなどが作用するように、Groupの指定などは忘れずに行いましょう【7】


    次ページ:
    03 Operators

    [[SplitPage]]

    03 Operators

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

    ●Volume Gradient VOP&Volume Sample VOP

    今回のメインとなるオペレータは、非常に地味なVOPではありますが、強力な武器にもなる2つです。

    Volume Gradient VOPは、参照するSDFに対して、サンプリングするPositionの傾き、すなわちベクトルを算出するノードです。SDFの境界から外にあるPositionでは外向きのベクトルをつくり、境界線内であれば内側を向くベクトルをつくります。

    Volume Sample VOPは参照するSDFに対して、サンプリングするPositionまでの距離を算出するノードです。SDFの境界線が0で、内側に入れば負の値、外側であれば、正の値が取得できます。

    いったんSDF化してしまえば、たった2つのノードで強力な値を取得することが可能なので、非常に強力な武器になることはまちがいありません。


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

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