すあまの備忘録

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

Whale Jump Vol.2 -FLIP

vol.1の続き

FLIPのベースはShelfから作って改造したほうが良いです。

FLIPの範囲を設定

どんな方法でもいいので指定します。

この後FLIPのメッシュ化やWhite Waterにもこの範囲を継承して使います。

Mesh_BBOXがあるのはメッシュ化する際に諸事上で分岐したからです。

f:id:godofsuama:20211230132327p:plain

Ocean Tankを作成

f:id:godofsuama:20211230135631p:plain

Shelfから作成した場合のGuide Oceanは毎フレームOcean Spectrumで動かしたPointとFieldがいるっぽい感じになっているが、めちゃめちゃ重くなるのと効果を感じられなかったのでPointは1fのみ生成

FieldはPointの4倍のParticle Separationで毎フレーム生成でFieldのみキャッシュ

f:id:godofsuama:20211230140054p:plain

FLIP Sim

FLIP Object

ShelfのGuide Oceanのセットアップをベースに改造

f:id:godofsuama:20211230140143p:plain

一応Narrow Bandにも変更済み

f:id:godofsuama:20211230140230p:plain

FLIP Solver

FLIPにあまり時間をかけたくなかったのでSubstepは1-1に変更

f:id:godofsuama:20211230140311p:plain

IdとVorticityを追加し、

f:id:godofsuama:20211230140346p:plain

f:id:godofsuama:20211230140359p:plain

DropletをKill on Detectionに変更。

離れた小さいFLIPを検出次第削除している。メッシュ化するときパカつきがちなので。

これによって1fで消えたように見えてもWhite Waterをのせてコンプして気にならなかったらOK 

f:id:godofsuama:20211230140450p:plain

Feed Back Scaleを0以上にしないとRBD/Bulletと相互作用しないので注意

f:id:godofsuama:20211230141159p:plain

Drag

POP Wrangleで早すぎる部分にDragをかける

f:id:godofsuama:20211230140644p:plain

Collision(Boat)

FLIPと相互作用させるためにRBD Objectでコリジョン

Bulletでもコリジョンできるが、浮かせる場合にいい感じに浮きづらかった。押し流したりぶつかって動く場合であればBulletのが軽そうでいいと思う。

f:id:godofsuama:20211230140946p:plain

特に浮き具合や相互作用の具合は、FLIPのParticle SeparationとFeed Back Scale、後はコリジョン側のDensityの影響をかなり受ける。

  • 設定合っているはずなのに沈んでしまう場合は、Particle Separationが足りない。
  • すごい勢いで吹っ飛んでしまう場合は、Feed Back ScaleとDensityのバランスが取れていない。

本番のシムをする前に、FLIP Simの範囲を狭めたもので値のバランスは探っておくのが良い。

f:id:godofsuama:20211230141516p:plain

特に設定はなく、CollisionはSDFでしている。

f:id:godofsuama:20211230141043p:plain

Collision(Whale)

こちらは相互作用ではなく普通のStaticでのコリジョン

SDFでコリジョンしていること以外は特になし。

f:id:godofsuama:20211230141750p:plain

Collision(GroundPlane)

これはBoatがもし沈んで貫通してしまった場合にこの位置で止めるためのもの。

特に沈んでいないので役には立っていない。

下手に設定するとFLIPとぶつかってしまうのでY軸は下げること。

f:id:godofsuama:20211230141911p:plain

値の確認

特にvの値は何回か確認したくなる箇所なのでPreviewできるようにしておく

f:id:godofsuama:20211230164501p:plain

del_ptでPreview用にポイントを削減

f:id:godofsuama:20211230164617p:plain

splitの方でVolumeのvelだけ取り出してnameノードでvelをvに変更

Attribute from VolumeでvをPointに継承

f:id:godofsuama:20211230164806p:plain

最後にvのlengthを測ればDrag等で使用する目安になる。

f:id:godofsuama:20211230164858p:plain

実際PointにもvはあるのでVolumeから移す必要ないと思うかもしれないが、White WaterはVolumeのvel基準になるのでどっちのPreviewも一括で済ませられるのでこっちのが正解に近いと思う。

FLIP Caching

要素ごとの分割キャッシュで取っている。

f:id:godofsuama:20211230142702p:plain

元ネタはFLIPの神みたいなIgor ZanicさんのVimeoから

Houdini Cache Workflow - part2 on Vimeo

  • 左がRBDのBoatのキャッシュ
  • 中央がFLIPのParticle
  • 右がFLIPのVolume(Surface, vel)

それぞれAttribute CastやVolume Compressをかけて圧縮して別々のキャッシュとして保存する。

これにTOPを絡めた場合の手法は後述。

デフォルトだとすべてを1つでキャッシュしてしまうため、後処理でも巨大なファイルにアクセスしてしまうことになる。

これをすることでPreviewやWhiteWaterの処理でのアクセスするファイルサイズが減らせる。

FLIP Particleはメッシュ化以外でほぼ出番はないが全フレームで120GB近くある。

FLIP Volumeはメッシュ化以外にWhiteWaterのエミッターにも使用するが33GBくらい。

個別にキャッシュすることでWhite Water時に33GBのVolumeにのみアクセスすれば良くなる。

FLIP Meshing

個別にキャッシュしたParticleとVolumeをMergeしてParticle Fluid Surfaceにつなぐ。

ついでにWhaleのコリジョンもつなぐ。

f:id:godofsuama:20211230143744p:plain

f:id:godofsuama:20211230144014p:plain

Particle SeparationはFLIPと合わせる。

Voxel ScaleとInfluence ScaleあたりはShelfから作るとリンクしてたりするが、無視して設定したほうが結果が良くなりがち。

Shlefの状態だときれいなメッシュを貼れるようになっているがSmooth等で野暮ったいメッシュになりがち。

White Waterとかで隠れてしまえば多少パカついてても大丈夫なので別途設定する。

Convert Toはこの後処理をしない場合はSurface Polygon Soupにするのが良い。

f:id:godofsuama:20211230144452p:plain

Bounding BoxはFLIPの計算範囲と同じ。

Closet Boundryはいれてもいれなくても良いが、FLIP MeshをExtrude Volumeしたものが作りやすい流れにしたほうが良い。

Flatteningは一定の高さのものを平らに処理する部分。

追加でPad Boundsをいれることで外周を拡張することができる。

コンポジット時に遠景の海面とのマージンに使用している。

追加処理

BBOXをちょっと小さくしたもの以外を削除

f:id:godofsuama:20211230145034p:plain

念の為FacetでRemove DegenerateとFill Holeを行う。

ここから表面と押出用で分岐する。

Extrude Volume

f:id:godofsuama:20211230145149p:plain

そのまま押し出ししてキャッシュ

Surface

この部分はコンプのマスク作成。正直AOVとして計算しても良かったかなっと思う。

Speed Mask

Speedを計算してBlurかける f:id:godofsuama:20211230145347p:plain

f:id:godofsuama:20211230145412p:plain

Edge Mask

f:id:godofsuama:20211230145523p:plain

これはFLIP VolumeのSurfaceをVDB AnalysisでCurvatureにしたもの

f:id:godofsuama:20211230145615p:plain

Speed Maskは全く使えなかったが、Edge Maskは結構使えた。

Boat

シム中のメッシュは軽量化したものなので、

シム後のBoatのキャッシュと、シム前のキャッシュでExtract Transformを行い、ボートの移動回転値を取り出す。

f:id:godofsuama:20211230143508p:plain

この後Copy等でレンダリング用のメッシュを動かす。

Trail等でvを計算して終了。