>   >  Houdini Cook Book:vol.87 VDB Stroke
vol.87 VDB Stroke

vol.87 VDB Stroke

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

その他の連載