すあまの備忘録

誰得内容の自分のための非営利目的備忘録ブログ(筆者がわかっても内緒にしてください)

Car Crash & Explosion

Karma XPUとPyro Minimal Solverでなんか作ってみようと思ったのがきっかけ。

テキストの説明は割と雑。

youtu.be

計算時間

RBD:2分くらい

Pyro Explosion:10分くらい

Pyro Fire:8分くらい

XPU Rendering:150min(120f、解像度2304x1296、Pixel Sample24、OptiX Denoiser使用)

良くなかった

  • 特になし

良かった

  • Pyro minimal Solverは結構実践で使えそう
  • Karma XPUは制限があるけど速い

Scene File

carFire_v007_gd.hiplc - Google ドライブ

アセット

車のアセットはBlenderのアドオンのTraffiqから。

Car - Traffiq Library - Rigged Cars - Blender Market

  • UVが使いづらい
  • カスタムマテリアルなのでそのまま別ツールに持っていけない

という欠点があるので注意。

テクスチャ

UV展開をHoudiniでやり直してSubstance Painterで通常 / 炭化のテクスチャを作成。

Karma XPUはテクスチャが最大2048*2048の制限(環境変数で変更可)と、UDIMが10x10の制限がある。

GPUメモリの節約もしないといけないため、不要な部分は解像度を256*256まで落としている。

車破壊

車体をDeform処理するかどうか?Voronoi等で割るかどうか?等で分ける。

ボディ部分
分割処理

目立つのに厚みがない場合が多いのでちょっとだけややこしい処理をしている。

元のメッシュは一切分割せず、ConnectivityごとにDeformすることでそれっぽい感じを手軽に出している。

一度VDBに変換してからVDB ReshapeSDFで厚みを調整している。

元メッシュ

VDBに変換

VDB ReshapeSDFで調整後

↑をPolygonに変換し、Voronoiで割る。

見やすいようにExploded Viewした結果

これに、もともとのConnecitivityごとの名前を再度転送しておく。これを使ってDeform処理を行う。

コンストレイン処理

RBD Constraint from Rulesで全部に対してざっくりコンストレインを作成し、

元々のConnectivityごとの識別用のparentを使用し、異なる場合は別のグループに入れる処理をする。

このグループを元に後処理で今ストレインの状態を調整する。

タイヤ部分

Vehicle Destruction & Dynamic Rigging with RBDs | Keith Kamholz | Houdini HIVE Worldwide - YouTube

Houdini Fractureシミュレーショントレーニング Part3:コンストレイントの種類(Glue / Hard / Cone Twist Constraint) - YouTube

上記を参考にタイヤはCone Twist Constraintも使用。

ダミーのコンストレイン先を作成

コンストレイン処理

全体

事前に作成したグループごとにコンストレインのタイプや強さをそれぞれ作成。

基本的にConnectivityごとにはGlueでのみ接続し、Softコンストレインがちぎれる処理はしていない。

Cone Twist Constraint

Cone Twist Constraintの各種値も基本的に全てSOP上で設定。

Cone Twist ConstraintはConstrained / GoalのTwistとupが大事なのでSOPで設定しておくのが確実。

今回はPの位置が固定だったので@Pを使用して直接作成している。

うまく行くとDOP上では以下のような表示になる。

青いコーンがConeTwistConstraint

RBD

SOP上でシム寸前のConstraintの元々のstrengthをdummy_strengthで一回キープしている。

Constraint

Glue,Soft,ConeTwistの主要な値はすべてSOP上で設定しているのでDOPでは基本1

Constraint NetworkのAttach Internal Constraints to ObjectでDOP内のObjectとして操作できるように変更。

追加処理

Data BindをConstraintGeometryに変更したGeometry Wrangleで以下の処理をし、指定したフレームまで絶対に外れないGlueを作成する。

SOP Solverでダミーの爆発タイミングのVDBを使用してGlueの削除もする。

POP Advect by Volumeでダミーの爆発からのvelをRBDに与える。

後処理

Deformするかしないか等で分岐してRBD DeformとTransform Piecesを使い分ける。

爆発のシム後のflameの値を転送して通常 / 炭化テクスチャの切り替えマスクも作成する。

Pyro Minimal Solver

minimal Solver使用時の注意

ヘルプPyroのワークフロー

  • コンテナサイズが変更できないため、事前にコンテナサイズのめどを立てる。

  • コリジョンはcollisionとvしか読めないため、事前に変換しておく。

  • Fields,ShapeタブのGuideは使用しない。(無駄な計算を省く)

  • Micro Solverを追加する場合はOpenCLのチェックを忘れずに行う。

  • Sourcing / CollisionのLimit Source Rangeを必ず設定する。

ここで設定したフレームの範囲内でのみエミッターとコリジョンを取り込む処理をする。事前計算のようなのでギリギリまで攻めておく。

  • GPUの使用メモリを確認する。

WindowsであればタスクマネージャーからGPUの使用メモリが確認できる。

Linuxの場合はNVIDIA System Monitor等で確認する。(公式ではないので注意)

  • GPUOpenCLで処理することで速く処理されるため、Preferenceの設定を確認しておく。
Pyroの設定

Pyro Burst Sourceなどを使えば誰でも手軽に今回レベルは到達できるので特にはなし。

ただしMinimal Solver(OpenCL)対応ノードで構成しないと速度が遅くなるのでその点は注意してだいぶ簡素な仕組み。

シェーダー

XPUの制限

VolumeのレンダリングはHoudini19.0だとXPU Pyro Previewで行うしかない。

Explosion Shader

まず、SOP上で忘れずにPyro Bake Volumeを使用しておく。

Smokeタブ

煙の色と濃さを決める。

Absorption Colorを設定することで煙の薄い部分に色を乗せることができ、単色ではないリアルな煙に近づけることができる。

Scattering Phaseはマイナスにすると光向きから逆方向に散乱し、プラスだと等方向に散乱…といってわけわからなくなりがちだが、マイナスだと硬めの煙に見えてディテールが出やすくなり、プラスだとふわふわした感じになりディテールが減る。

Scatter

爆発の明るい部分を決める。

Pyro Advanced Shaderほど機能はないので、明るさマスクしか変えられない。なんとXPUでは色すら変えられない。

Enable Maskで爆発のかさぶた部分の具合を決める。

Fire

ExplosionではFireは使用しない。

Fire Shader

XPUなのでできることは限られる。

Smokeタブ

Explosionを参考に調整。

Scatter

照り返し具合が少しほしいので強さを調整。

Fire

まずBindingから変更する。

Binding:temperature

Binding:flame

炎をレンダリングする場合はここをまずflameに変更。

Pyro Advanced Shaderの場合はこれだけで結構いい感じになるが、XPU Pyro Previewにはランプコントロールがないためあまりいい感じになりづらい。

Enable Maskをオンにしていい感じの炎っぽさが出るように調整する。