vol.1の続き
FLIPのベースはShelfから作って改造したほうが良いです。
FLIPの範囲を設定
どんな方法でもいいので指定します。
この後FLIPのメッシュ化やWhite Waterにもこの範囲を継承して使います。
Mesh_BBOXがあるのはメッシュ化する際に諸事上で分岐したからです。
Ocean Tankを作成
Shelfから作成した場合のGuide Oceanは毎フレームOcean Spectrumで動かしたPointとFieldがいるっぽい感じになっているが、めちゃめちゃ重くなるのと効果を感じられなかったのでPointは1fのみ生成
FieldはPointの4倍のParticle Separationで毎フレーム生成でFieldのみキャッシュ
FLIP Sim
FLIP Object
ShelfのGuide Oceanのセットアップをベースに改造
一応Narrow Bandにも変更済み
FLIP Solver
FLIPにあまり時間をかけたくなかったのでSubstepは1-1に変更
IdとVorticityを追加し、
DropletをKill on Detectionに変更。
離れた小さいFLIPを検出次第削除している。メッシュ化するときパカつきがちなので。
これによって1fで消えたように見えてもWhite Waterをのせてコンプして気にならなかったらOK
Feed Back Scaleを0以上にしないとRBD/Bulletと相互作用しないので注意
Drag
POP Wrangleで早すぎる部分にDragをかける
Collision(Boat)
FLIPと相互作用させるためにRBD Objectでコリジョン。
Bulletでもコリジョンできるが、浮かせる場合にいい感じに浮きづらかった。押し流したりぶつかって動く場合であればBulletのが軽そうでいいと思う。
特に浮き具合や相互作用の具合は、FLIPのParticle SeparationとFeed Back Scale、後はコリジョン側のDensityの影響をかなり受ける。
- 設定合っているはずなのに沈んでしまう場合は、Particle Separationが足りない。
- すごい勢いで吹っ飛んでしまう場合は、Feed Back ScaleとDensityのバランスが取れていない。
本番のシムをする前に、FLIP Simの範囲を狭めたもので値のバランスは探っておくのが良い。
特に設定はなく、CollisionはSDFでしている。
Collision(Whale)
こちらは相互作用ではなく普通のStaticでのコリジョン
SDFでコリジョンしていること以外は特になし。
Collision(GroundPlane)
これはBoatがもし沈んで貫通してしまった場合にこの位置で止めるためのもの。
特に沈んでいないので役には立っていない。
下手に設定するとFLIPとぶつかってしまうのでY軸は下げること。
値の確認
特にvの値は何回か確認したくなる箇所なのでPreviewできるようにしておく
del_ptでPreview用にポイントを削減
splitの方でVolumeのvelだけ取り出してnameノードでvelをvに変更
Attribute from VolumeでvをPointに継承
最後にvのlengthを測ればDrag等で使用する目安になる。
実際PointにもvはあるのでVolumeから移す必要ないと思うかもしれないが、White WaterはVolumeのvel基準になるのでどっちのPreviewも一括で済ませられるのでこっちのが正解に近いと思う。
FLIP Caching
要素ごとの分割キャッシュで取っている。
元ネタはFLIPの神みたいなIgor ZanicさんのVimeoから
Houdini Cache Workflow - part2 on Vimeo
それぞれ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のコリジョンもつなぐ。
Particle SeparationはFLIPと合わせる。
Voxel ScaleとInfluence ScaleあたりはShelfから作るとリンクしてたりするが、無視して設定したほうが結果が良くなりがち。
Shlefの状態だときれいなメッシュを貼れるようになっているがSmooth等で野暮ったいメッシュになりがち。
White Waterとかで隠れてしまえば多少パカついてても大丈夫なので別途設定する。
Convert Toはこの後処理をしない場合はSurface Polygon Soupにするのが良い。
Bounding BoxはFLIPの計算範囲と同じ。
Closet Boundryはいれてもいれなくても良いが、FLIP MeshをExtrude Volumeしたものが作りやすい流れにしたほうが良い。
Flatteningは一定の高さのものを平らに処理する部分。
追加でPad Boundsをいれることで外周を拡張することができる。
コンポジット時に遠景の海面とのマージンに使用している。
追加処理
BBOXをちょっと小さくしたもの以外を削除
念の為FacetでRemove DegenerateとFill Holeを行う。
ここから表面と押出用で分岐する。
Extrude Volume
そのまま押し出ししてキャッシュ
Surface
この部分はコンプのマスク作成。正直AOVとして計算しても良かったかなっと思う。
Speed Mask
Speedを計算してBlurかける
Edge Mask
これはFLIP VolumeのSurfaceをVDB AnalysisでCurvatureにしたもの
Speed Maskは全く使えなかったが、Edge Maskは結構使えた。
Boat
シム中のメッシュは軽量化したものなので、
シム後のBoatのキャッシュと、シム前のキャッシュでExtract Transformを行い、ボートの移動回転値を取り出す。
この後Copy等でレンダリング用のメッシュを動かす。
Trail等でvを計算して終了。