Houdini 20.5 の新しい MPM ソルバなら、驚くほど有機的な崩れの表現をごく単純なセットアップで作成できます。ここでは Houdini 20.5 スニークピークで紹介された除雪シーンを作るための各ステップを、複数のチャプターに分けてブレイクダウンしていきます。

始める前に、MPM シミュレーションはメモリの消費が非常に激しく、このプロジェクトの最終的な高品質キャッシュは約 2 TB に達することを頭に入れておいてください。尚、このプロジェクトでは、Windows 10、RTX 3090 (555.99)、AMD Ryzen Threadripper 2970WX 24コア プロセッサ、128GB RAM を使用しました。


ステップ 01 - マテリアルの下準備



このプロジェクトのコンセプトは雪のディテールに注力することでした。そこで目指したのが、地面の上を回転する雪の塊が、崩れ砕ける表現です。

衝突用モデルの準備作業はごく単純で、必要な材料を揃えるところから始めます。

ここでは質の高い除雪車のモデルを使い、そこに動きのノイズをつけ、除雪車らしいアングルにオフセットしています。満足のいく動きができたら、残るは、平均的な除雪車のスピードを調べること、follow path ノードを使ってシーン内でそのスピードを再現することです。

mpmcollider ノードを配置 → 衝突の種類を指定 (Animated Rigid) → Use Input Animation にチェックを入れる→ 以上です。

mpmcollider ノードの中には、衝突の種類に応じて調整可能な以下のオプションがあります:

  • Collider Type

  • Use Input Animation

  • Geometry タブ → Custom Voxel Size と Fill Interior

残りの衝突にも、この全ての工程を繰り返し、適切な Collider Type を指定するよう気を付けてください。

衝突の準備ができたところで、mpmcontainer と mpmsolver を見ていきましょう。その後、実際の雪のソーシングに進みます。




ステップ 02 - MPM Container と MPM Solver



MPMcontainer はセットアップ全体の「司令塔」となるノードで、そこからシミュレーション、ソーシング、コリジョンのボクセルサイズ (「解像度」)、タイムステップ、開始フレームを制御していくことができます。他にも複数のアトリビュートがあり、例えば Grid Scale は、このセットアップだとデフォルト値が最適で、複数マテリアルのシミュレーションでマテリアル同士のくっつきを防ぎたい時に役立つことがあります。




ステップ 03 - MPM マテリアルのソーシング

まずサーフェスをインポートし、mpm source ノードを配置したら、Material Preset を Snow、Behaviour を Chunky に設定します。この処方で各マテリアルのバランスを良好に保てるので、大きく変える必要はありません。

それを踏まえ、ここではあえていじってみましょう。

以下、変化をつけたい時のために覚えておくべき変数です:

  • E (@E) で表される Stiffness (剛性) 

  • Density (@density) で表される Density (密度) 

  • Nu (@nu) で表される Volume Preservation (ボリューム保存) 

このシーンでは、氷の塊とパウダー状の新雪を使って、積もりたての雪を表現していきたいと思います。

労力対効果を高めたい時に有効なのが剛性です。マテリアルの可塑性を保つには、中央の剛性を高くしておくことが欠かせません。左の画像では Stiffness をゼロに設定、右の例では中心部の密度を高くした状態 (x10²) から、マテリアルのプリセット値へと徐々にフェードさせています。



現実世界でのマテリアルの密度を参考にして、小さいパーティクル数でイテレーションすることが重要です。今回のケースから言えるのは、実際の氷や新雪の密度が 300~917 kg/m3であるのに対し、良い感じの大きな塊状になったディテールと粉っぽい塊とを同時に残す上で確実なのは、400~860 kg/m3 の間でバリエーションを作ることだということです。* 出典はこのページの一番下を参照 *

これらのノイズは、バリエーションを用意して特定の演出に沿わせやすくするためのものです。MPM の強みは、あくまでフォースの挙動を模倣することでマテリアルの有機的な破砕を作れる点にあることを覚えておくのは重要です。

ごく細かなダストは、後ほど、セカンダリの POP シミュレーションで作成します。



ボリューム保存は、マテリアルに任意の荷重がかかった時に生じる直角方向のフォースの大きさのことで、固体力学の分野では、ポアソン比とも呼ばれています。これについては、各マテリアルのポアソン比を記載した良い資料がたくさんあります。それらの数値を出発点に、少ないポイント数でシミュレーションし、徐々に絞り込んでいくのが、望ましい雰囲気やルックを作るための秘訣です。

 -簡単に言えば、このボリューム保存の値は感度が良く、高くするほどマテリアル全体に伝わるフォースが増え、低くするほど全体に広がって消えるフォースが増える、ということです -

以下、ポイント数を 700 万から 2400 万に増やしていき、数値を変えてテストしたものです。



  • どの領域を変形させたいのか、よく検討してください。MPM シミュレーションのポイント数はすぐに8000万くらいまで跳ね上がってしまうのに加え、ポイントの1つひとつに後から非常に役立つアトリビュートが格納されています。何を使いたくて何が必要になるのかを考え、不要なアトリビュートは必ず削除してください。

  • 低めの解像度でシミュレーションをし、少し形が見えてきたところで質を上げた長時間のシミュレーションをかけると良いでしょう(2000万ポイントもあれば、最終ルックのイメージができます)。

  • 作りたい具体的なルックがある時は、最初に使うメッシュの厚みと、それぞれのサーフェスの粘度を考慮するようにしてください(オン/オフではなくスライダです)。

  • 使うマテリアルが増えると、必要なアトリビュートを全て保存するのに必要になる VRAM も増えます。最終シミュレーションを実行する前に、レンダリングの途中でクラッシュしないよう使用可能なメモリの限度を計算するようにしてください(パーティクルが勢いよく飛び出すのと同時に VDB グリッドのサイズが拡大することが多いです)。

  • シミュレーションを始める前に、必要となるスケールを把握し、その際にポイントのサイズも考慮してください。デフォルト値は 2 です。中距離まではそれで対応できますが、接近するほど、より多くのポイントが必要になります。

  • シンプルに保ちましょう。

  • 最善の結果が得られるよう、各マテリアルの比較表を参照してください。




ステップ 04 - ポストシミュレーションのメッシュ化



ポストシミュレーション工程に入ると MPM セットアップの細部が強調され、粒子の粗さが目立つことが見込まれます。

このセットアップでの最善策は、VDB ブロックを使ってポイントを実行することです(particlefluidsurface でも同じ処理ができます):

ここでは @dx (ディテールのアトリビュート) を使ってボクセルサイズを指定し、MPM パーティクルを変換しています。パーティクルを SDF に変換したら、そこから vdbreshapesdf を使って本格的にボリュームを演出していきます。このケースでは、Dilate (拡張) → Smooth (スムース) → Erode (縮小) (外側のエッジのみ) → Erode (拡張したのと同じ分を縮小)を行っています。

 下が結果のルックです:




ルックに満足できたら、ベロシティフィールドとマージし、SDF ボリュームのキャッシュを取りましょう。 - こうしておくと、この後のセカンダリシミュレーションで、衝突用の良いソースを確保する際に役立ちます - 

ひとつわかったのは、クオリティを高く保つには、ボクセルサイズとパーティクルのスケールのバランス調整が特に重要であるということです。最終アウトプットをどのようなものにしたいか、早めに決めておくと良いでしょう。

VDB グリッドによるメインの MPM シミュレーションのラスタライズが済んだら、シェイプ調整をした SDF ボリュームを使ってこのボリュームをクランプし、アーチファクトが生じない程度に、最大限シャープなルックにしていきます。

これは最終ルックで重要な役割を果たしうる作業で、メインのシミュレーションよりも多くのディテールを引き出すことができますが、浮遊物などのアーチファクトの発生が見込まれます。一方、元に戻せばより一体感のあるルックを保てますが、ごくシャープな高ディテールは失われます。

もうひとつの便利な技には、画像処理を扱う時と同じように、シミュレーションデータのゲインやコントラストを調整し、その結果を再び SDF でクランプするという方法があります。ここで試みているのは、最終レンダーで浮遊物やボヤケが生じることのない、ごくシャープなルックを作ることです。レンダリングを待たずに結果を確認したい時は、新しい COP ネットワークでシミュレーションをすると良いでしょう。


ノイズのフラクタルの後に Contrast ノードを繋げると、シャープ化の効果を得られますが、値を減算してからその結果を乗算することでも同じ結果が得られ、なおかつボリュームフィールドへの適用も簡単です。

異なる値の例:





この時点で結果に満足ができるはずですが、この後も引き続き、LOP 内での微調整が可能です。



  • MPM のメッシュ化は長時間に及ぶことがあるので、複数のバッチに小分けし、満足できたものをフルシミュレーションに適用すると良いでしょう。

  • 最終マテリアルを早い段階でブロッキングし、それを使ってイテレートするようにしましょう。

  • シャープさが増すにつれ、浮遊するボリュームも増えることに留意してください。秘訣は、忍耐強く程よい地点を探ることです。

  • SDF ボリュームの中身が詰まっていることを入念に確認しましょう。中身が詰まっていないと、セカンダリパスでの問題回避のために検証が必要になる場合があります。




ステップ 05 - セカンダリのセットアップ

セカンダリは雪のシーンを作る上で重要な役割を果たすため、事前の計画が重要です。主要アトリビュートになるのは @jp です。この JP は、休息状態のパーティクルである低い値は残したまま、重大な負荷、つまりマテリアル内で破綻や負荷が起きている領域を描出します。


まず、この JP アトリビュートから然るべきポイント群を抽出してメインの MPM ソースとし、そこからポイント間の値の差を出し、それをソースから選り分けて調整することで (画像1枚目) 望ましい雰囲気のシミュレーションにしていきました。もうひとつの要素として、大きな雪の塊が地面にぶつかった時に、パーティクルのクラスターが発生するようにもしました (画像2枚目) 。その後、全てのソースポイントをマージし、それらが一切コリジョンサーフェス内に存在していないことを確認して、不自然なパーティクルの放出が起こらないようにしています。

  • Collisions (衝突) の要素: メインの地面、(先ほど抜かりなくキャッシュを取った) MPM の SDF、衝突用の車体、衝突用のブレード

  • -上記の要素には、静止オブジェクトの使用も可能です-

  • Wind Particles (風のパーティクル): パーティクルの密度に基づき空気抵抗を加えます。このようなパーティクルのシミュレーションをしてから、影の要素に進むのが良いでしょう。

  • 残りは通常の POP セットアップで、そこにスリープ化の設定を加えてシーンを最適化し、さらに、一部のパーティクルが地面に潜った時のために、地面の下に Kill の閾値も設定しました。


メッシュ化のプロセスは先ほどと同じです。パーティクルの pscale の 0.8/1.2 分だけパーティクルをラスタライズしてノイズにコントラストをつけ、よりシャープな見た目にしていきます。ここでもやはり、秘訣は忍耐強さです。1フレームを選り分け、動きの多い部分を使って、そこから作っていきましょう。


  • この場合も、パーティクル数がすぐに膨れ上がる可能性があります。今回の場合は、シーケンス終了時のパーティクル数が 1000 万以内だとバランスが取れました。

  • 長時間のシミュレーションをかける前に、使用しているカメラアングルに見合う適切な @pscale の値を検証しておくと良いでしょう。ここでは 0.0012 でした。また、ディスクで視覚化するのも大いに役立ちます。




ステップ 06 - 雪のグリント (閃光)

次のステップは必須事項ではありません。ディテールには、カメラアングルやライティング、動きの都合上、途中で画面から消えてしまうものがありますが、これはグリント (閃光) で良いでしょう。


いくつか念頭に置くようにしたのは、グリントは凍結した細かい水滴であるため、サーフェス上でランダムに発生させる必要があることと、元の MPM シミュレーションで使ったオリジナルのアトリビュートを幾つか残すようにすることでした。サーフェス上のポイントの速度を適切な値に設定できたら、copy to point に進むと、これらのポイントにディスクを配置することができます。





  • シミュレーションのごく一部を使って、グリント (閃光) のサイズをテストしましょう。場合によって、レンダーフォグボリュームによるダブルチェックをして、サーフェス上にとどまることを確認する必要があります。
  • ここでは、ポイントには Blast ノード、ボリュームには VDB Clip ノードを使うのがベストです。
  • ディスクに少量のノイズを加えると、より面白みのある結果が得られることがあります。




ステップ 07 - Solaris でのレンダリング

レンダーセットアップは標準的なツリーです。唯一考慮すべき要素は、雪本体およびグリント (閃光) のマテリアルにいっそうの注意を払うことです。

グリント (閃光) は、光沢の強い透明なマテリアルでなければなりません。対する雪には Material Linker を使い、ボリュームに簡単なクラウドマテリアルを割り当て、欲しい見た目に応じて密度を加減していきます。



  • 最終ルックでは、使用できる AOV を幾つか活用し、OptiX Denoiser と Volume Combine のパスを使って、レンダーをできるだけクリーンに保ちつつ、程よい有機的な質感を作っていきましょう。

  • ルックデブはデノイザの使用を避けるのがベストです。これは、最初の幾つかのサンプルで雪のディテールが大量に失われてしまうためです。

  • Volume Limit 値を上げることを忘れないでください。



 Wikipedia.com - List of Materials Density (ウェブサイト:" https://en.wikipedia.org/wiki/Density#Various_materials “ アクセス日: 2024年6月17日 )

 eoas.ubc.ca - List of Fresh Fallen Snow Density (ウェブサイト: “ https://www.eoas.ubc.ca/courses/atsc113/snow/met_concepts/07-met_concepts/07b-newly-fallen-snow-density/ “ アクセス日: 2024年6月17日 )

 Wikipedia.com - Poisson's Ratio (ウェブサイト:" https://en.wikipedia.org/wiki/Poisson's_ratio#Poisson's_ratio_values_for_different_materials “ アクセス日: 2024年6月18日)

コメント

  • ostaek 1 ヶ月, 3 週間 前  | 

    Thank you very much for the in depth tutorial and explanation! So much valuable insights and lesson. I was wondering if we can get the COP workflow in the hip file too

Please log in to leave a comment.