>   >  Houdini Cook Book:Vol.110 Curl Line
Vol.110 Curl Line

Vol.110 Curl Line

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

その他の連載