Solver SOPを使った成長のシミュレーションを組み立てます。

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


EDIT_小村仁美 / Hitomi Komura(CGWORLD)

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

プロシージャルとコーディングの棲み分けを考える

今回は、プロシージャルなアプローチで「スペースコロナイゼージョン」と呼ばれるシチュエーションを作成したいと思います。手法としてはいろいろありますが、今回はWrangleを使ったアプローチをメインに構築しています。VOPを使ったアプローチに置き換えて解説しようとも考えましたが、こういったシチュエーションの場合は非常に煩雑で回りくどくなってしまったので、シンプルなWrangleで解説します。

近年では、ちょっとしたことでもWrangleで済んでしまうことも多く、中々ジレンマを感じることも多いです。例えば、Houdiniは本来スクリプトやプログラムができなくても、アーティストに寄り添ったノードベースでプログラムライクなことが可能だったことも大きな魅力のひとつでした。ただ、やはり覚えてしまったら便利なのも事実です。したがって今後のHoudiniでは、プロシージャルな部分とコーディングの部分の上手な棲み分けを求められます。そういった部分も加味して、今回はWrangleの習得とノードベースな部分との切り分けもかねて解説していきます。

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

01 Source Setup

ソースのセットアップを解説します。


まずベースになるジオメトリを読み込み、それに対して、VDB from Polygons SOP【A】でSDFを作成します。その際、Volume名はdensityにしておきましょう。VDB Reshape SDF SOP【B】を使って少しだけErodeで痩せさせます。SDFにConvert VDB SOP【C】を使って、SDFからFogへ変換します【1】


次に、Volume VOP SOP【D】を使って、densityにNoiseをかけます。Noiseの種類にもよりますが、ネガティブな値が入らないように調整し【E】、コントラストなども調整できるようRampも使用しています【F】。見た目の問題だけですが、濃度を高くするために値を乗算しています【G】【2】



Scatter SOP【H】を使って、餌となるPointを作成します。Noiseで作ったdensityをもっていれば、自動的に濃淡でPointが生成されます。また、補助として、そのままのFogからも少なめに生成しています。これら2つをMergeします【3】


次に、ルートとなるPointを生成します。大まかなエリアをFog Volumeで作成し、ジオメトリのFogとかけ合わせてPoint発生エリアを作ります。それに対してScatter SOPを使ってPointを作成します【I】。この数が発生点になるため、最終的にどういった位置から発生させたいかをここで調整していきます【4】。最後に、ターゲットPointとルートPointにそれぞれGroupとカラーを設定します【J】


02 Solver Flow

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

Solverの大きな流れを解説します。まず、準備したソースに対して、Solver SOP【A】を接続します。この内部に増殖していくセッティングをします【1】。シミュレーションが完了したら、Blast SOP【B】を使って食べ残しを削除します【2】。生成されたPolygonはPointが離れているので、Fuse SOP【C】を使ってつなげます。最後にジオメトリのキャッシュを取って完了です【D】

Solver SOP内では、Wrangleで構築しています。まず最初のWrangle【E】では、ターゲットを保持するためのInteger Arrayを作成します【3】

次のWrangle【F】は、ターゲットを探し、そのリストをArrayに格納していきます。まず探す範囲を設定します【4】。次にnearpoint関数を使ってrootから近いPointを探します【5】。それをsetpointattrib関数でArrayにApend(追加)します【6】

次のWrangle【G】ではリストを基にPointを作成し、Primitiveとしてつなげていきます。また、次のリストを作成するためのrootを更新します。まず、成長する範囲を設定します【7】。リストアップしたターゲットを基に【8】、もしターゲットが格納されているPointであれば【9】、for関数を用いて、そのリストの長さ分ループ演算します【10】。先端のPointを抜き出し、その座標から進む方向を確定します【11】。方向と成長範囲を用いて、先端の座標から進んだ位置Pointを作成します【12】。そのPointに新たにrootのGroupを設定し【13】、成長点用の色を付けます【14】。さらに、先端と成長点を結ぶPrimitiveを生成して完了です【15】

最後のWrangle【H】では、食べた範囲を設定し【16】、進んだ範囲の余分なPointを削除します。その際に、範囲に入ったPointはnearpoints関数を用いてリストアップします【17】。それぞれを削除するためには、removepoint関数を用いてfor関数内で削除していきます【18】

次ページ:
03 Rend Geometry Flow

[[SplitPage]]

03 Rend Geometry Flow

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

キャッシュが完了したら、必要に応じてSmooth SOP【A】を用いて、Polygonのラインを滑らかにします。カクカクしてしまう場合もありますが、それをそのまま使っても問題ないので、最終形をどうしたいかで判断してください。

次に、Wrangle【B】を使い、Point番号を用いてパラメトリック座標系に一列に並べます。それを0〜1の範囲に並べ直し、それを用いて太さをコントロールします。また、後々使いやすくするために、UVなどにしています【1】

これをこのままPoiygon Curveとしてレンダリングしても良いですが、場合によってはPolygon化する必要もあります。その場合はPolywire SOPなどを用いて法線をNormal SOPできれいに整理します【C】。今回は、あくまでもビジュアライズ用途としてVOPで色を付けたりして確認しています【2】


04 Operators

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

●Attribute Wrangle SOP(Wrangle)

今回紹介するノードは、Wrangleです。

Wrangleと省略して呼んでいますが、正式名称は「Attribute Wrangle SOP」です。このノードは、VOPの内部で、Snipet VOPというものを利用して、VEXベースのVEXPressoionを用いてコーディングしていく特殊なノードになります。

以前は、VEXをコンパイルしてノード化して使用していた技術が、もっと簡易的に使用できるようになりました。余分な宣言やコーディングの煩わしい部分をある程度省いてくれるのと、Houdini内でエディットできるため、非常にコーディングしやすく、プログラミングの敷居を下げてくれます。とはいえ、ある程度の文法や関数への慣れは求められるため、基礎知識は必要になります。

ただ、筆者としては、Houdiniの導入時点からWrangleを多用してしまうことには懐疑的です。Wrangleが優秀すぎるがゆえに、何でもできてしまうことがある意味で諸刃の剣となってしまうことを懸念しています。デバック力が身についていない状態でWrangleを多用した場合、エラーを回避できなくなってしまったり、ノードが既に準備されているものまで、逆に回りくどくコーディングしたりする遠回りを強いられる可能性が高いです。現にそういった状況も多く見てきたので、本連載ではあまり取り上げていません。

とはいえ、近年の傾向を見るに、やはりWrangleの活用は避けられないのも事実です。今後は、VOPとWrangleを織り交ぜながら、バランスを取りつつ執筆していければと思っています。

WrangleとVOPをどちらも翻訳できる状態がベストですし、本当にコーディングする必要があるのか、まずは疑ってみる目を養うことも重要です。あくまでもツールのひとつと位置付け、頼りっきりにならず、広い視野でHoudiniを見ていただければと思います。

どちらにしても、Houdiniを使う上では、疑いの目が本当に大事になってきますので、Wrangleを通して注意喚起をしたいと思い付き、今回の記事を執筆しました。


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

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