Smoke Solverを分解して検証します。

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


EDIT_小村仁美 / Hitomi Komura(CGWORLD)

ミニマムな実装でSmokeのしくみを理解する

Smokeを使った内容が続いていますが、今回は、Smokeのしくみの根本に迫りたいと思います。HoudiniにおけるFluidのしくみは、表向きは簡単になっていますが、その内部は非常に複雑です。ただ、汎用性をもたせるためのセッティングになっていますので、実際、最低限のしくみにした際には、シンプルになっていきます。今回は、その構成のメインになっているMicro Solverを簡単に解説していきたいと思います。

Houdiniでは、通常のシミュレーションにおいてMicro Solverまでもち出すことがないように、あらかじめPyro Solverなどが用意されており、ユーザーの作業はパラメータの調整に留まるよう配慮されています。ただ、あくまでもPyroはプリセットのようなもので、プロダクションレベルではカスタマイズを前提としています。その際に必須となるのがMicro Solverです。ただ、根幹になっているしくみを知らなくては、カスタマイズのしようがありません。まずは、ベーシックなしくみを構築してその内部を探り、新たにディテールを追加するための下地を考察していきたいと思います。

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

01 Source Build

Sourceのセットアップを解説します。まず、SOPでSmokeのSourceを作成します。通常の手順ではPyro Sourceなどを駆使しますが、今回は敢えてミニマムな状態で作成し、そのしくみを知りたいと思います。

はじめに、SourceになるジオメトリにScatter SOP【A】を使って、表面にPointを散布します【1】。続いて、Attribute Wrangle SOP【B】で、Pointに "pscale" 、 "density" 、 "temperature" のAttributeを作成します【2】。次に、このPointをVDB【C】に変換しますが、このときVolume Rasterize Particle SOP【D】を使います。これにより、PointがもつAttributeをVDBに変換することができます。

Pointがもっている"pscale"の値が、Pointの周りにできるVolumeの大きさになります。あらかじめVDBの分割数を決めておきます。これを、必要なAttributeの数だけくり返し、Mergeします。これで現在2つのVDBが作成されたことが確認できます【3】【4】

02 Smoke Object

Smoke Objectを作成します。Smokeをシミュレーションするためには、まずデータを入れ込んでいくための箱が必要です。その箱とはDataのことを指し、Dataという箱を収納する棚をObjectと呼びます。


まず、箱を置くために、空の棚を用意します。Empty Object DOP【A】を作成し、Object Nameにはノードの名前が入るようにします【1】

次に、データを格納するための箱を準備します。Fluidの場合、それは主にFieldを指します。Smokeのシミュレーションにおいて、ミニマムで必要なものがVelocityのFieldです。これがないことには何も動きが生まれないので、まず、Vector Field DOP【B】からVector TypeのFieldを作成します。この際、これをセッティングの元にはしません。そして、Scalar Field DOP【C】を使ってDensity Fieldを作成します。Scalarとは、1次元のデータタイプのことです。このFieldのDivision、Size、Centerを基に、Vector Fieldもサイズが一致するようにReferenceしておきます【2】

同じように、Scalar Field DOPでTemperature Field【D】も作成します。それぞれのFieldのData Nameには、対応する名前を入れておきます。これは、任意というより、決まりとして"density"【3】、"temperature"【4】、"vel"【5】と入れておきます。Velocity Fieldでは、Container(シミュレーションが行われる限定エリア)の箱を開くか閉じるかを設定できます【6】

また、これらのFieldは、Scalar Field Visualization DOP【E】やVector Field Visualization DOP【F】で可視化することができます。通常我々が目にしているDOPの中のDensityは、このDensity FIeldをUse Smoke【7】にて可視化したものです。最後に、これらのDataをEmpty ObjectにApply Data【G】して完了です。

次ページ:
03 Solver Setting

[[SplitPage]]

03 Solver Setting

Smoke Solverのセットアップを解説します。


はじめに、先ほど作成したObjectのグループを、Multi Solver DOP【A】へ接続します。続いて、Source【B】のセッティングをします。まず、"density" と "temperature" をそれぞれ読み込んで来ます。読み込む際にGas Match Field DOP【C】を使ってField【1】をサンプリングし、もともとDataにあるField【2】とマッチさせます。次に、そのFieldに対してSOP Merge Field DOP【D】を用いて、SOP【3】からVolume【4】を読み込み、元のField【5】へ加算します【6】。これを必要なField分行い、最後にMulti Solver DOP【E】もしくはSwitich Solver DOPを使って計算させます。

次に、Advectionと浮力を設定します。Advectionは、FieldをVelocityによって進展させるためのセッティングです。まず、Gas Advect Field DOP【F】を使って、vel【7】をvel自身【8】で移流させます【9】。同じようにdensityとtemperatureもvelで移流します【G】。続いて、Gas Buoyancy DOP【H】を使って浮力を計算します。これは、tempertureによって発生した浮力をvelへ流し込む作用があります。その後、Gas Blur DOP【I】を使って、temperatureが拡散する様子をシミュレーションします。これはひとまずなくとも問題ありません。

いよいよ、Fluidの要となるGas Project Non Divergent DOP【J】とGas Project Non Divergent Multigrid DOP【K】です。これらのノードは、Divergenceをなくした状態にしてくれる機能をもっています。そもそもDivergenceとは何かと言うと、VelocityのVoxelへの入出量が不均衡になっている状態を言います。侵入してくる量に対して出力される量が少ない場合、簡単に言えば、Voxelが圧縮されたような状態になっています。

そういった不均衡をなくすことで、見た目では空気抵抗によって渦が巻いているような状態になります【10】。Divergenceが多い状態、いわばNon Divergentが効いていない状態では、そこに渦はありません【11】。Gas Repeat Solver【L】を噛ませた状態で、これらを複数回実行できるように準備しておきます。最後にGas Substep DOP【M】にまとめ、それをMulti Solver DOP【A】へ接続すれば、Smoke Solverのミニマム版の完成です。

04 Operators

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

●SOP Merge Field DOP

今回紹介するノードは、SOP Merge Field DOPです。本編でも少ししか登場しなかったオペレータがなぜ? と思われた方もいるかと思いますが、実はこのオペレータはHoudini 17から搭載されたもので、地味ですが、今後のHoudiniにおけるFluid発展の足がかり的存在とも言えるものだと、個人的には感じています。

何を隠そう、このオペレータはFieldをSOPから直接Mergeできるすぐれものですが、本質は、VDBを直接、アクティブな領域のみを考慮して読み込むことができるのです。これにより、HoudiniのFluidのワークフローは格段に向上したと言えます。VDBを直接読めることで、Vector Fieldも直接簡単に読み込めます。

VDBを利用したワークフローは年々浸透していっていると感じます。その恩恵をFluidでももっと受けられるようにと、ひっそりと搭載されたこのDOPを眺めながら願うばかりです。


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

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