Fluidの流れを可視化します。

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


EDIT_小村仁美 / Hitomi Komura(CGWORLD)



H17の新Smokeを利用したAdvection

これまでの連載でも何度か登場してきたAdvectionですが、今回はHoudini 17で新しくなったSmokeを利用して再度解説したいと思います。Houdiniで言うAdvectionは、Fluidの流れをParticleに用いることが主流となりますが、そもそもの単語の意味としては、気象用語の「移流」です。その名の通り、流れに乗って動くイメージです。

このAdvectionを使うことで、様々な表現が可能になります。例えば、筆者がよく用いるパターンで言えば、火の粉や空間に舞うホコリをリアルに動かしたい場合などが挙げられます。キャラクターなどが動いた際に、その空間内に発生する気流に基づいて塵を乗せることで、よりリアルで、かつ簡単に空気感を表現することができるのです。リアルな動きに対してさらに情報量を足していくことで、より説得力のある画づくりが可能になります。

今回は、サブ的なエフェクトではなく、メインになりうるようなものを検討してみたいと思います。エフェクトがプロシージャルモデルとなるようなセットアップを考えていきましょう。

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

01 Smoke Setup

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

まず、Collisionになるジオメトリを用意し、それをVDB form Polygon SOP【A】でSDF化します【1】。次に、SmokeのSourceとなるエリアをSphereなどで指定し【B】、こちらもSDFに変換します【2】

この2つのSDFをVDB Combine SOP【C】でIntersectionしている箇所だけをPolygon化します【3】。これをPyro Source SOP【D】でPoint化します。今回は、Volumeで内部まで密度をもったSourceに変換しています【4】

その後SourceエリアをEdit SOP【E】などで変形し、VOP【F】を使って、その差分からVectorを作成しVelocityに変換します。それをAttribute Transfer SOP【G】でSourceのPointへ移します【5】。必要に応じて、densityやtemperatureに対してAttribute Noise SOP【H】を使いNoiseを追加します。最後に、Volume Rasterlize Attribute SOP【I】でVolumeに変換すればSourceの完成です【6】

今回は、Collisionの内部にSmokeを閉じ込めるようにしたいので、Collisionもあらかじめ準備しておきます。DOP内部でも準備できますが、より正確に軽く変換したい場合は、SOP上で準備しておく方が良い場合があります。今回はすでにCollisionをVDBのSDFに変換していますので、それをそのまま利用します。また、HoudiniのSDFは複雑な形状が崩れる場合がありますので、今回はこのままVDBを利用したいと思います【J】。また、ContainerのサイズもCollisionを超えることはないので、あらかじめBouding Box SOP【K】でサイズの指針を作成しておきます。

DOP内では、通常のPyroのセットアップをします。Smoke Object DOP【L】は、SOPで指定したBouding BoxのサイズからContainerのサイズを計測します【M】。Static Object DOP【N】のCollision設定は、Volume Sampleを指定してSDFから作成します【O】。そして内部にSmokeを留めるために、Invert Scanを使ってSDF情報を反転します【P】。シミュレーションをして、きちんとCollisionが取れているから確認します【7】


後は、Pyro Solver DOP【Q】でSmokeの挙動を調整していきます。Velocityを表示して、うねり具合などを確認することも重要です【8】。Densityが隅々まで行き届いていることが確認できたら、シミュレーションの調整をいったん完了とします【9】

次ページ:
02 Particle Setup

[[SplitPage]]

02 Particle Setup

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


Smokeのシミュレーションが完了したら、そのままそのフロー【A】にPOPのフローを追加していきます。この2つを切り分ける場合もありますが、シチュエーションに応じて変更します。今回のシミュレーションはそこまで複雑で重いものではないので、今回は同時並行的に調整をかけていきます。まず、POP Object DOP【B】を作成し、新たに独立したObjectのフローを作成します。次に、POP Solver DOP【C】を作り、POP Source DOP【D】で、発生させたいジオメトリを選択します。今回はSmokeで使用したDensityのエリアから発生するように設定しています。

その後、POP Advect by Volumes DOP【E】を使ってParticleの動きを制御します。Velocity SourceはDOP Dataから参照します【F】。この場合、DOP Objectにはsmoke【G】を選択します【H】。Advection TypeにはUpdate Velocity【I】を選択し、ParticleのVelocityとBlendします。強さなどを調整して、動きを制御します【1】

続いて、POP Kill DOP【J】を使って、遅いParticleを消していきます。こちらも必要に応じて使用します。RuleはVelocityの長さが指定よりも短くなった場合消えると言う設定になっています【K】。最後に、Particleだけを表示して、想定の動きになっているか確認して完了です【2】

03 Line Setup

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

最後に、Particleの動きを可視化するために、Polygonのラインに変換したいと思います。まず、DOP I/O SOP【A】を使って、Particleだけを抽出しキャッシュを取ります【1】。次に、Trail SOPを使って、毎フレームその場に残るようにPreserve Original、Trail Lengthを$Fと設定します【2】

このPoint全てをAdd SOP【C】を使って接続しますが、その際に、[By Group→Add]をBy Attributeに設定し、Attribute Nameはidにします。これにより、idごとにPolygonのラインに変換することができます【3】。後は、レンダリングに向けた設定を行います。VOP【D】を使って、色情報を追加します。今回はidやageにより時間経過で色味を変え、さらにランダムに色相が変わるような設定にしました。色味の変更などは一括で行うことで、制御を簡略化しています【E】

また、ラインの太さもランダムに変わるように、Attribute Wrangle【F】で簡単なVEXpressionを書いて完了です【4】

04 Operators

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

●POP Advect By Volumes DOP

今回の主役は、POP Advect By Volumes DOPです。このノードは、Fluidシミュレーションで作成したデータをParticleに移流させることを目的としたオペレータです。基本的には、velのFieldを利用し、Particleのforce,v,Pを変更することを目的としています。

内部はPOP VOPで構成されており、全てがVOPによって構築されています。開発時から時間が経過しているためか、古いやり方がそのまま残っていますが、概ね完成された概念ですので、参考になります。必要に応じて新たに自分で構築しても良いと思います。そのくらい良く使用しますし、カスタマイズしがいのあるオペレータです。

Advection Typeによって、Particleの挙動を変更できます。Fluidに完全に合わせたい場合は、Update Velocityで設定を変更します。vel FieldをForceとして使用する場合は、Update Forceに設定します。Update PositionはParticleのPを直接動かしますので、Particleのvelocityとvel fieldを切り離して制御できます。


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

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