Solver SOPを使ったCurve生成を解説します。

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


EDIT_三村ゆにこ / Uniko Mimura(@UNIKO_LITTLE

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

プロシージャルカーブ

今回は、Solver SOPを使ったカーブの生成を解説していきたいと思います。基本的には、SOPベースのプロシージャルなモデリングをメインに、Solver SOPの内部で動きをつくっていくような、POPのシミュレーションのシンプル版といったかたちです。SOPにおいては、ソースのセットアップと動きの基となるデータの生成を行い、シミュレーション後には、レンダリングに向けたジオメトリの整理を行うながれになります。非常にシンプルなしくみではありますが、Houdiniならではのプロシージャルなジオメトリを生成することができます。

今回、ソース生成のメインに用いるのはVDBで、動きは全てVDBでつくり出されるものです。HoudiniにとってVDBはなくてはならない存在となってきており、非常に高速でVolumeを生成できるVDBは、Houdiniでのシミュレーションやモデリングの要となります。今回の作例においても、VDBによって非常に高速なセットアップが可能になっているので、そのあたりも含めて解説していきます。

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

01 All Setup

全体のセットアップを解説します。


まずベースになるジオメトリ【A】【1】を読み込み、それに対してVDB from Polygons SOP【B】を使ってSDFを生成します【2】。



次に、VDB SOP【C】を使ってVDBの空のPrimitiveを生成します。その際Nameはvelにして、TypeはVector Floatにしておきましょう【3】。続いて、TypeはVector Floatにします【4】。Vector typeはVelocityに合うよう設定します【5】。また、分割数はSDFに合わせます【6】


その空のVector Volumeに対し、VDB Active SOP【D】を使ってVolumeをアクティブにします。空の状態で作成されたVDBのFogに対してReferenceを使い【7】、SDFで作成したバウンディングボックスに従って満たします【8】



次に、ジオメトリから作成したSDFをVDB Reshape SDFやVDB Smooth SDF【E】を使ってひとまわり小さくしていきます。このSDFはジオメトリの形状を取得するために使用します【9】。また、VDB Analysis SOP【F】を使ってこのSDFを解析するのですが、ここではClosest Point【10】を解析しています。新たに作成したVector Volumeにより、シミュレーションする際に必要なサーフェス表面の情報を得ることができます。



今回の動きの要となるデータを作成します。Volume VOP SOP【G】を使ってVelocity Fieldを作成します。Volume VOP SOPの内部ではCurl Noise VOP【H】を使用し、Volumeにうねりを加えます。またこのとき、Collision SDFのところに作成したSDF【E】を接続し、サーフェイスの境界をうねるようなFieldを作成できます。


このVolumeはVector Volumeですが、通常のFogとさほど変わりがないないため、xyzの要素をそれぞれ色分けしたとしても確認しにくいです【11】。従って、整列したPointを作成し、Volume Trail SOP【I】でStreamにして確認することで、大まかなNoiseの具合を確認することができます【12】



シミュレーションの下準備をします。初期の発生PointをScatter SOP【J】で作成します。今回のシミュレーションはSolver SOP【K】で行います。必要になるインプットは、初期Pointと元のジオメトリ、Velocity Field、Closest PointsのVolumeです。シミュレーションしたPointはTrail SOP【L】でCurveに変換します。必要に応じてPrimitiveごとにidをつくっておきましょう【M】

02 Solver Flow

シミュレーションのセットアップを解説します。


Solver SOP内でシミュレーションの設定を行なっていきます。シミュレーション自体は非常にシンプルな構成で、Prev_Frame【A】はひとつ前のフレームからの情報を呼び出すものです。この内部では現在のフレームと考えて問題ないでしょう。まずはScatter SOPで作成した初期Pointを読み出します。続いて、元のジオメトリInput_2【B】で新たにScatter SOP【C】を使い、フレームごとのPointを作成します。Pointの数は、フレームごとにばらつきをもたせているのですが【1】、毎フレームシードも変わるようにしています【2】。このPointを元々のPointとMerge【D】することで、フレームごとに積み重なってPointが増えていき、発生しているように見えます。


次に、VDB Advect Points SOP【E】を使ってPointに動きを付けます。このときにInput_3【F】のVelocity Fieldを読み込み、Input_4【G】のClosest Pointsも読み込みます。VDB Advect Points SOPはVelocity FieldによってPointを動かしますが、時間軸でフィードバックしてくれるノードではなく、必ずSolver SOP(SOP Solver)内で使用する必要があります。Velocity Field【3】を指定し、その後Closest Points【4】を指定します。また、動きが速すぎる場合の正確性を向上させるため、Substep【5】を高くする必要がある場合もあります。


毎フレームVDB Advect Points SOPによって移動させられるPointをSolveすることで、動きをもったPointを作成することができます【6】


次ページ:
03 Rend Geometry Flow

[[SplitPage]]

03 Rend Geometry Flow

最終出力用のセットアップを解説します。


シミュレーションが完了したらキャッシュをします【A】【1】。Primitiveの番号や作成したidなどでランダムな色で確認してみます【2】。今回はPrimitiveが消えていくことがないので問題ありませんが、もし消えてしまうような設定であれば、シミュレーション時にidを追加する必要もあります。注意しましょう。

レンダリングにはもう少し複雑な色情報が欲しいので、VOP【B】を使って作成します。このとき、VOPのRun OverはPrimitiveにしておきましょう。まず、Volume Sample File VOP【C】を使って、ジオメトリから作成したSDF【D】との距離を作成します。これによりラインに立体感をもたせることができます。また、Random VOP【E】でランダムな値を加算し、これらのデータを基にRamp Parameter VOP【F】などで色情報を追加します【3】

また、ランダムな値を基にpscaleを作成しておきます【G】。これはPrimitiveのAttributeになっているので、Attribute Promote SOP【H】を使ってPoint Attributeに変換します。これで完了です。

04 Operators

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

●Attribute Wrangle SOP(Wrangle)

今回はVDBがコアになったアプローチです。VDBはこれまでにも多く登場していますが、Houdiniにとって欠かせないものになっています。

Sparse Volumeの良さは軽快さにあります。その利点を活かして、非常にハイレゾな解析が可能になりました。またVDBには、VDB AnalysisやVDB Advect Pointsなどの便利な機能もあります。今回の作例のような処理が手軽にできるようになったのは、VDBの恩恵によるものです。

ノードひとつひとつを詳細に解説していくことはできませんが、VDBを使うことでこれまで面倒だったものが簡単に行えるようになった、ということだけでも伝わればと思っています。


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

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