POPを使った雨のシステムを構築します。
TEXT_秋元純一 / Junichi Akimoto(トランジスタ・スタジオ/ディレクター)
日本でも指折りのHoudini アーティスト。
手がけてきた作品は数々の賞を受賞している。
代表作に、HIDETAKE TAKAYAMA『Express feat. Silla(mum)』など。
www.transistorstudio.co.jp
blog.junichiakimoto.com
EDIT_小村仁美 / Hitomi Komura(CGWORLD)
●CGWORLD Online Tutorialsにて特別無料配信中!
【無料】Houdini COOKBOOK +ACADEMY 特別編 ~コロナをやっつけよう!~
中近景に降る雨を簡易的に表現
今回は、POPを使った雨のシステムの構築方法を検証していきたいと思います。エフェクトにおける雨の表現は非常に多岐にわたり、シチュエーションによって様々です。遠景に降る降雨の表現、中景に降る雨の衝突、近景ではコリジョンに伝う雨水の表現など、それぞれで異なります。
今回は中近景に使用することを前提とした、降雨と衝突して伝う雨水を表現するためのしくみを考えていきます。特に、衝突後の表面を這う雨水の表現は、きちんとシミュレーションしようとすると、かなり難易度の高いものになります。ただ、今回は何となくの見た目がそのようになるレベルまで落とし込み、Fluidなど利用せず、POPでのフローでなるべく簡易的に組んでいきたいと思います。また、SOPによるディテールの調整やウェットマップなども含めて、トータルでの検証を行なっていきます。
今回のHoudiniプロジェクトデータはこちら01 Source Setup
ソースのセットアップを解説します。
まず、ソースとなるジオメトリをインポートまたは作成します【A】。このジオメトリはコリジョンのベースとなるものなので最終的にはSDFに変換しますが、あまり重いと調整に支障が出ます。そのためなるべく最小限に留めておくのが良いでしょう。ただ、最終的なレンダリングにはハイモデルがあった方が良いです【1】。
インポートしたジオメトリをVDB from Polygons SOP【B】でSDFに変換します。これは、コリジョン用のVolumeとして使用します【2】。
またソースになるエリアについては、Grid【C】を使って範囲を指定します。これはどのような形でも構いません。これは、どこから雨が降り出すのか指定できていれば問題ないものですが、今回は範囲を最小限にしています【3】。
02 POP Flow
シミュレーションのセットアップを解説します。
まずは、POPによる大きな流れを解説していきます。大きくは、雨の発生からストリームを分けて、雨が弾くところ、雨が滴るところと切り分けて考えます。最初にコリジョンを読み込みます【A】。ジオメトリは表示用で、コリジョンはVolume Sampleを使ってSDFでセッティングします【1】。POP Object DOPはSolverと合わせて通常のセットアップをします。
次に降雨のセッティングです【B】【2】。ここは、SOPのソースエリアから降水するParticleを作成します。POP Collision Behavior DOPで衝突判定のGroupを作成しておきます。必要に応じてSolverのAdd Hit AttributeをONにします。
続いて、衝突した雨が弾くParticleを作成します【C】【3】。このParticleはPOP Replicate DOPで新たに発生させます。こちらも同じくPOP Collision Behavior DOPを使って衝突のGroupを作成します。上の画像にみられるDependencyのLink【D】のように、Groupを使って次のStreamの発生をコントロールしています。POPを利用するため質量の保存は行わず、発生で動きをコントロールします。
その後、弾いた雨粒がさらに衝突した際のGroupを作成します【E】。これを基に、表面を伝っていく雨水の先端Particleを作成します【F】【4】。このParticleは表面を伝わせるために、POP Collision Behavior DOPはSlideにして、さらにPOP Property DOPのClingを設定し、回り込む雨水を再現します。また、POP Interact DOPを使ってParticle同士が相互に影響しあう力を加えるなどして動きにディテールをもたせ、POP Drag DOPで摩擦による減速を再現するなど、少々動きを細かく制御します。
このParticleを基にして、伝う雨水の軌跡を作成します【G】【5】。これは元の動きから置いていかれるように作成します。これで、発生のコントロールは完了です。
このままでは、伝う雨水が表面から離れる際にその軌跡も作られてしまいます。そのエラーを消すためにSOP Solver DOP【H】を使用して余計なParticleを削除します。あらかじめ軌跡を発生させない方がコストは低いですが、少々Groupの設定が面倒なので、SOPベースで削除します。POP Force DOP【I】で重力を設定し、POP Wind DOP【J】で降水に風の影響を追加します。最後に、POP Kill DOP【K】で地面より下に向かう雨水を削除します。これで大きな設定は完了です【6】。
サーフェスから離れたParticleを削除するしくみを解説します。これはイレギュラーなやり方で、本来は発生させない方法を模索すべきですが、削除する方が今回は簡単だったためこのようなアプローチになっています。SOP Solver DOP【H】内では、Split SOP【L】でTrailのGroupを切り分け、さらにObject Merge SOP【M】でコリジョン用に作成したSDFを読み込みます。続いてVOP【N】を使ってVolume Sample VOP【O】でSDFを読み込み、Pointとの距離を測ります。その距離に基づいて、離れているParticleを削除します。
[[SplitPage]]
03 Sim Flow
シミュレーションのフローを解説します。
シミュレーションの調整が完了したら、ParticleをSOPに読み込み、Cacheとして出力します【A】。
次に、TrailのPartileを抜き出して、現状まっすぐに伝っていく雨水に、VOP【B】を使ってうねりを付け【1】、Particle Fluid Surface SOP【C】を使ってメッシュを張ります。その他のParticleも、Pscaleなどを調整してメッシュを張るなどしてディテールを付けます【2】。
ジオメトリにウェットマップを作成します。これは必要に応じて用意するかたちで良いと思いますが、今回は簡単にSolver SOP【D】を使って作成します【3】。作成したものをAttribute Transfer SOPで移し、Smooth SOPで滑らかにして完成です【E】【4】。
軌跡にディテールをつけるために、Noiseを使って歪ませます【F】。そのParticleに対してXYZ Distance VOP【G】で近い距離にあるPrimitiveを見つけ、Primitive Attribute VOP【H】でそのPrimitiveを使って元の形状に沿わせ直します。これにより、軌跡にうねりをつけることができます。
その他の設定として、Fit RangeやRamp Parameterを使って、AgeによってPscaleが変更されるようにします【I】。もしくは、IDを使ってRandomな大きさに調整するなどし、ディテールを付けます。
ウェットマップを作成するためにSolver SOPを使いますが、その前に、更新したいAttributeをそれぞれに作成しておきます。それらのAttributeをVOP【J】内部で毎フレーム加算することで、濡れていく様子を作成します。
VOPでは、Point Cloud Open VOP【K】を使って、それぞれのPoint Cloudを範囲や数を指定しながら読み込み、指定したAttributeをPoint Cloud Filter VOP【L】で抜き出して、それらを加算します。こうすることで、毎フレーム加算がくり返され、最終的には軌跡が通った場所が濡れていくマップを作成できます。
04 Operators
主要ノードを解説します。
●Solver SOP
今回紹介するノードは、Solver SOPです。
今回はPOPメインでしたが、さほど難しいノードなどは使用しておらず、どちらかと言うと手順やルールが複雑でした。それとは別に、ウェットマップを作成する手順を簡単に紹介しましたが、それを可能にしているのがこのノードです。
このSolver SOPは入れ子になっており、内部のDOP Networkの中にSOP Solver DOPがあり、さらにその内部が編集地点です。
重要なのは、直接的にシミュレーションをすると言うより、DOPの再帰するしくみを利用して、結果を更新し続けるような表現をする際に良く使用します。さらに詳しい使い方は、今後機会を設けて紹介していきたいと思います。
-
「Houdini COOKBOOK +ACADEMY」
Houdiniを基礎から楽しく学ぶオンライン講座
公開日程:毎週金曜日公開(予定)
価格:1,300円(税込)※セットでの割引販売有
※第一回「Houdiniの基本概念とインターフェイス」は無料公開中
受講対象:Houdiniをこれから学びたい方、Houdiniの勉強で挫折した方など
cgworld.jp/special/houdinicookbookacademy