記事の目次

    VDBを使ってSDFモデリングを構築します。

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


    EDIT_小村仁美 / Hitomi Komura(CGWORLD)

    VDBの利点を最大限に活かしたプロシージャルモデリング

    今回は、VDBをメインに据えて解説していきたいと思います。Houdiniの歴史の中でも比較的新しい機能と言えるVDBですが、そもそもは、DreamWorks Animationにおいて開発されたオープンソースのプロジェクトで、OpenVDBが正式な名称です。Houdiniはいち早くそのライブラリを搭載し、Voxelの扱いを飛躍的に向上させました。

    OpenVDBはSparse Volume(疎構造ボリューム)と呼ばれる技術を使っており、これまでは高密度で維持しなければならなかったVoxelを必要最小限で維持することができるため、非常に高速な処理を可能としています。これによって、従来コスト的に難しかったジオメトリを高密度なSDFで保持することができるようになり、今回のようなテーマでモデリングに活用することが可能になりました。

    また、VDB関連のオペレータが充実している点も、その使いやすさの一端を担っています。例えば、Volumeで存在している状態であればVoxelの足し引きなどのBoolean(論理演算)がしやすいため、それを利用したCombineなどが挙げられます。そういった下地がある状態で、今回のように直感的なモデリングに対して応用するのはたやすいことです。Houdiniにおけるモデリングは、時間軸をつけることでエフェクトとしても再利用できるアセットになります。これこそがプロシージャルモデリングの醍醐味とも言えます。

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

    01 All Flow

    VDBを使用してモデリングします。全体のワークフローは下記のようになります。

    ノードの全体像

    まずはじめに、ベースとなるジオメトリを準備します。作業がしやすいように、サイズや位置などを整理しておきます。また、今回はこのジオメトリに対してプロジェクションするので、ポリゴン数をPolyReduse SOPなどを用いて適正に削減し別途キャッシュしておきます【A】【1】

    下準備ができたら早速Stroke SOP【B】を使って、ラインを描きます。Stroke SOPのProjectionをGeometryに設定し【2】、準備したジオメトリに貼り付けるように描いていきます。このとき、ただのラインでは太さなどを確認できないため、あらかじめそれを確認できるように準備しておきます。Stroke SOPでラインを描いた際には、様々なAttributeが生成されます。その中に、"stroke_pressure"があります。それをVOP【C】を用いて"pscale"に変換します【D】。StrokeのRadius【3】は描きやすいサイズでよく、最終的にはこちらで太さの調整をします。また、描いたままのラインはPointが均一ではなく、描いた速度などによって疎らになります【4】


    それをResample SOPを使って均一にします【5】。このラインに対して、Sweep SOPなどで擬似的に太さをつけ、こちらを表示しながら描いていくと、より直感的に作業ができます【6】。こちらはHDAにして確認用のアセットにしてしまっても良いでしょう【E】。また、Stroke SOPでくり返し作業をしていくと重くなってしまい、描く作業がカクついたりもします。そのため、Stroke SOPは小分けに作業ができるしくみを取ることをオススメします。

    描く作業が一段落したら、元のジオメトリの法線方向を取得し、Peek SOPを用いて、内側に押し込みます【F】【7】。これは必須の作業ではありませんが、今回は表面に張り付いていると言うよりもさらに内側にめり込んだ表現にしたいため、ここで用います。

    確認用と同じくResample SOP【G】でPointの均一化を図り、VDB from Particles SOP【H】を使ってPointをVDBに変換します【8】。このとき大事なのは"pscale"とVoxel Size【9】のバランスで、バランスが取れていないと、細かすぎたり足りなくて表現できなかったりもします。ラインが細ければ細いほど、細かいVoxelが必要になります。

    次に、変換したVDBを滑らかにします。変換してそのままのものはボコボコしていたりもしますので、VDB Smooth SDF SOP【I】を用いて滑らかにします【10】。また、太らせたり細らせたりしたい場合は、VDB Reshape SDF SOP【J】を用います。OperationのDilateが太く、Erodeが細くなります【11】

    最後にConvert VDB SOP【K】でPolygonに変換してラインの完成です【12】


    続いて、ベースのジオメトリに、ラインの形状に合わせて溝を作ります。まず、ベースのジオメトリを、VDB from Polygon SOP【L】を用いてSurfaceのVDBへ変換します【13】。このとき、Voxel Sizeはラインの方へ合わせておくか、ディテールがこちらの方が細かい場合はさらに細かくしておきます。

    ラインのVDBをVDB Reshape SDF SOP【M】を用いて太らせます。これは溝の幅にあたりますので、好みで調整します。次に、VDB Combine SOP【N】を用いて、ベースからライン部分を彫り込みます。今回はSDF同士の計算なので、OperationはSDF Differenceに設定し【14】、引き算します。この際、お互いのVoxel Sizeが異なる場合は、Resampleでどちらに合わせるか設定します【15】。これでくり抜きが完了しました【16】

    くり抜いた時点では、エッジの部分があまりきれいな状態ではありません【17】。それを解決するアプローチを採ります。VDB Reshape SDF SOP【O】を用い、ラインのVDBを溝よりも太らせたものを用意し、それをConvert VDB【P】でConvert to VDBに変換します。このとき、VDB ClassはConvert SDF to Fogに設定、FogのVDBに変換しておきます【18】。これをマスクとして、VDB Smooth SDF SOP【Q】で、マスクで選んだ部分だけを滑らかにします【19】。このようなアプローチで、他のディテールを維持しながら、必要な部分にだけスムースをかけることができます。Fogに変換したのは、マスクとして使用するため、中身を持ったVDBが必要だからです。

    最後に、Convert VDB SOP【B】でPolygon【20】に変換して完了です。Polygonに変換する際には、Adaptivity【21】を設定し、Polygonを必要最小限に抑えることもできます。こちらもシチュエーションに応じて設定してください【22】


    次ページ:
    02 Operators

    [[SplitPage]]

    02 Operators

    今回は、VDBを用いたフローがメインになっています。VDBを扱うためのオペレータは非常に充実しており、全てをここで解説することは叶いませんが、今回登場した中でも特に重要な4つを再度解説します。

    VDB from Polygons SOP

    VDB from Polygonsは、PolygonからFogまたはSDFのどちらかのVDBを生成することができます。基本的には閉じられているジオメトリであれば、正確で綺麗に変換できます。要は、ボリュームをもつジオメトリである必要があると言うことです。もちろん、サーフェス上に作成することもできますが、場合によっては、上手く作成できないこともあります。サーフェス周辺にしかVoxelを作成しないため、Iso Offsetなどで通常のVolumeを作成するより軽く、より高解像度での作業が可能になります。

    VDB Reshape SDF SOP

    VDB Reshape SDFは、SDFの形状からDilateで法線方向に膨張、Erodeは法線方向に収縮させることができます。Openは、内側に収縮させ、同じ分外側に膨張させます。これによって、孤立している山や島を消すことができます。Closeはその逆で、穴や谷を埋めることができます。

    VDB Smooth SDF SOP

    VDB Smooth SDFはSDFの値を平滑化します。例えば、曲率が高い場所はより滑らかに、平面はそのままになります。その結果、凸凹が抑えられ、滑らかなSDFになります。

    Convert VDB SOP

    Convert VDBは、VDBを通常のVolumeもしくはPolygon、Polygon Soupに変換できます。また、VDBのFog、SDFへClassの相互変換ができます。Polygonに変換する場合、Adaptivityでディテールがある部分は細かく、平坦な部分は粗く、といった細かな設定もできます。また、第2インプットから、NormalなどのAttributeも引き継ぐことができます。

    下図は、上記の例で作成したジオメトリです。2つのVDBを使ってマスク処理をしながら変形させたSDFをPolygonにしたものです。このように、2つのVDBを組み合わせるのはVDB Combineだけではなく、マスクを駆使することで、VDBの処理能力は格段にアップします。