20/11/2022

Blenderの流体シミュレーションで水をリアルにするには?

コップに水を注ぐ流体シミュレーション

いつもBlenderの勉強をさせていただいている灰ならしさんのこちらの記事を参考に、初めて流体シミュレーションというものをやってみました。

初めはパーティクルのベイクが出来たり出来なかったりでよくわからなかったのですが、灰ならしさんの記事の丁寧な解説のおかげでどうにか出来るようになりました。

※どこでつまづいたかというと、パーティクル計算のやり直し方がわかりませんでした。
「物理演算プロパティ」の「キャッシュ」でタイプが「リプレイ」なら他の設定に変えて戻す、
同じくタイプが「モジュール」なら「流体」で「データを解放」
タイプが「全て」なら「全て開放」するだけでした。

後編の記事でコップから水が漏れる現象の対処法やよりリアルに見える方法を解説してくださっています。

ところがいかんせん未熟者ゆえ、やってみたところサラサラした水っぽい感じではなく、やや粘り気というかトロみのある液体に見えてしまいます。

これは何故なのか、どうしたら改善できるか考えてみました。

先ず思いついた仮説は「ブーリアンでコップと水の接する面を平らにカットしてみる」ことでした。

ブーリアン演算の有無

コップに水を注ぐ流体シミュレーションが自然に見えない理由と対策

  1. 水面がデコボコ
    流体シミュレーションはパーティクルの集まりなので、水面が完全に平らになりません。
    どうしても表面が凸凹になり、その結果ゼリーのような、粘性のある液体に見えてしまうようです。

    理屈ではパーティクルを非常に小さくすれば平らに近づくのでしょうが、データ量と計算時間等を考慮すると限界がありそうです。

    そこで、パーティクルのドメインとコップの内側を引き伸ばした円柱状の形状とでブーリアン演算の「交差」にすることで、コップと水が接する側面のデコボコした部分をカットします。

    パーティクルドメインにブーリアンをかける
    Boolean operations to remove unnatural parts of water particles
    青く見える部分がカットされる

    追記
    そもそもパーティクルにブーリアンかけられるの?っていう話ですが、かけられました。
    ただしメッシュをベイクした状態でないとブーリアンが反映されません。
    また、不自然なレンダリング結果にならないように、ブーリアン形状にスムーズシェードはかけないで、なめらかにしたい場合はポリゴンを増やして対応しています。

  2. 水面がなかなか止まらない
    そして流体シミュレーションはなかなか止まりません。
    フレーム数を増やして実験しても、水面を真っ平らな状態で完全に静止させることが出来ませんでした。

    なので水面も側面同様ブーリアンをかけることで平らにしてみます。

  3. 水の落ちるスピードが遅い
    もうひとつのポイントは水の落ちるスピードです。
    実際に蛇口からコップに水を注いで観察してみたところ、水の落ちる速度が現実ではかなり速いことに気づきました。

    CGで再現する際、ゆっくりの方がシミュレーションとしては面白いのですが、そうするとやはり粘性のある液体のように見えてしまいます。

    これは速度を速めることで解決できそうです。

それでレンダリングしたアニメーションがこちらです。

https://twitter.com/ky0/status/1594213587710795776?s=46&t=UXVJorLDJLu7wxD_wEGnJQ

スピードを倍にすることでだいぶ水らしいサラっとした感じになりました。

最後の水面を静止させるためのブーリアンは、よく見ると水面が下がるのが見えてしまうため、結局After Effectsで最終フレームをゆっくりブレンドすることにしました(邪道!)
水面用のブーリアン(差分)オブジェクトをゆっくりと下げるわけですが、そのタイミングを調整するたびにレンダリングし直すのはツラいので、After Effectsを使う方が簡単なんですよね(言い訳!)

しかし、このあとスプーンをコップに入れたところ、思いがけない問題が表面化するのでした…(つづく

Blenderの流体シミュレーションの障害物で地味に困った話