新年あけましておめでとうございます🎍
今年は奥さん作 いにしえのキャラでご挨拶🎍
へなちょこ家族ですが2023年もよろしくお願いいたします🙇🏻♀️🙇🏻♂️
Blenderの流体シミュレーションの問題が解決した話
誰も困ってなさそうな問題に悩んでいたら、有り難いことに『Blender 質感・マテリアル設定実践テクニック』の著者・灰ならしさんがアドバイスをくださいました!
ky01da(@KY0)さんが面白い検証をしていたので、原因と解決策を返信しました。 https://t.co/ILxt0iO8pH
— 灰ならし (@hainarashi) December 3, 2022
これぞSNSの醍醐味ですね〜とても嬉しかったです!
以下、記録として解説していただいた原因と解決策を貼っておきます。
流体シミュレーションは、ドメイン内部の空間を立体格子状(ボクセル)に区切って流体の動きを計算します。
障害物(コリジョン)と流体の当たり判定もボクセル単位で計算するので、コリジョンのメッシュ形状と実際の流体の動きの間には、ほぼ必ず隙間ができます。 pic.twitter.com/pNK7FN0kIn— 灰ならし (@hainarashi) December 3, 2022
コリジョンに厚みがない場合も、エフェクタープロパティの「平面(Is Planar)」にチェックを入れると、当たり判定分の厚みが追加されるようです。
そのため、メッシュ表面と流体の間には「当たり判定分+ボクセルサイズ分」の隙間ができます。— 灰ならし (@hainarashi) December 3, 2022
この隙間は、ドメインの「分割の解像度(Resolution Divisions)」を上げると小さくなりますが、完全にゼロにはなりません。
実用的な解決策としては、モディファイアー「ブーリアン」の「差分」を使う方法があります。
— 灰ならし (@hainarashi) December 3, 2022
1.コリジョンメッシュに厚みをつける
2.ブーリアン用のオブジェクトをスプーンの下に用意する
3.流体の動きに合わせて、2.のオブジェクトを上方向に移動(アニメーション)させる
注:モディファイアーの並び順は、上から[ブーリアン→流体シミュレーション]となるようにします。— 灰ならし (@hainarashi) December 3, 2022
灰ならしさんの的確に要所を押さえた記述のおかげで、自分のミスに気付くことができました。
それが「1.コリジョンメッシュに厚みをつける」という部分です。
これを最初に書いてくださるところがさすがです!
実はこの方法は真っ先に試したんです
期待した効果が得られず、コリジョン用のエフェクターにはブーリアンが効かないのかと諦めていたのですが、お陰様で原因が解りました!😳
コリジョンメッシュを平面にしていたからでした!それじゃブーリアンかかりませんよね…😅
ありがとうございます!🙏🙇🏻♂️— ky01da (@KY0) December 3, 2022
どもです。
補足すると、スプーンは同じ位置に複製して、レンダリング用とコリジョン用に分けると扱いやすいです。
コリジョン用はレンダリング非表示にしておきます。— 灰ならし (@hainarashi) December 3, 2022
はい!スプーンの厚みと表面の厚み(Surface Thickness)をなくすことばかり考えていたために自ら落とし穴に落ちました😅
最後ドジってますがイケそうです!🤣
本当にありがとうございます!😻https://t.co/daFTMVe9Ja— ky01da (@KY0) December 3, 2022
今回、正直誰も興味ないだろうとは思いつつも、投稿したおかげでアドバイスいただけて、結果的に重要な気付きを得ることができました。
有難いことに灰ならし(@hainarashi)さんにアドバイスいただいた、障害物(スプーン)を水面の動きに合わせてブーリアンで下から消していく方法のシミュレーション
スプーンを完全に消すときにやけに水が溢れるけど、うまくいく予感!
と思ったら最後!何かやらかしました🤣https://t.co/pt1L0mfuE6 pic.twitter.com/rfE1iyPz4g— ky01da (@KY0) December 3, 2022
最後なぜか水が漏れてしまったのはご愛嬌ということで見逃してください😅
できた〜!水飴スプーン問題解決😂
ブーリアンに始まりブーリアンに終わる流体シミュレーション実験でした🐷
水が溢れ過ぎるのでスプーンが消える前にエフェクターもOFFにしました(手段は選ばないw)#Blender #b3d #fluidsimulation #blender3d pic.twitter.com/WHcNM81Wr1— ky01da (@KY0) December 3, 2022
ブーリアン演算「差分」でスプーンを消す役割をしている立方体が水面を追い越す辺りで、飛沫が過剰に飛び散るのが少々不自然だったので、その少し前に障害物としてのスプーンのエフェクターをOFFにしました。
もう少し早くOFFにすれば最後の飛沫の量を抑えられそうですが、あまり早くOFFにすると空間に流体が流れ込んで水面が下がってしまうので、ケース・バイ・ケースですね。
灰ならしさんの著書、『Blender 質感・マテリアル設定実践テクニック』は12月22日発売です!
予約購入し、読めるのが非常に楽しみです!
灰ならしさん、改めましてありがとうございました!
Blenderの流体シミュレーションの障害物で地味に困った話
誰も困ってない問題に勝手に悩んで無理やり何とかする需要なき続編です😅
コップにスプーンを入れてみただけなのに…
前回の続きで、落ちてくる水がスプーンに当たってちょっと跳ねる、みたいな感じにしたかったんです。
いかにもありそうですよね?
そしたら思いがけず、困ったことになりました。
(おわかりいただけたでしょうか…)
スプーンの周囲にエフェクター(コリジョン)による「水の入り込めない空間」があるために、スプーンに水飴がまとわりついているような感じになってしまったのでした。
しかしエフェクター(コリジョン)を設定しないと水がスプーンを無視してつき抜けてしまいます。
さてどうしたものか🤔
思いついた解決策は、
「スプーンを障害物にするのを途中でエフェクターをOFFにしてみる」
ことでした。
そうすることで水がスプーンを突き抜けて、結果的にスプーン表面と水の間の隙間がなくなります。
スプーンに水が当たる部分が水没するタイミングで、
「エフェクターを使用」のチェックを外すようにフレームアニメーションを設定してみます。[やり方は後述]
これでよし!
(…レンダリング中…)
がっ!
OFFにした瞬間、ちょっと水位が下がる!😱
カクって下がる、、、orz
いきなりOFFにするとそのスペースに水が一気に入り込むため、その分水位が下がってしまうようです。
よく見ないと気づかないかもですが…
スプーンの周囲のモヤモヤが瞬時に消える不自然さも気になります。
ではOFFにするのではなく「表面の厚さ(Surface Thickness)」の値を0に減らすようなアニメーションするのは?
試してみたところ、0.00000にしてもやはりスプーンの周囲に空間が残って水飴状態に…。
だったらもうしょうがない、力技で無理やり何とかしてみます。
スプーンを分割して、わちゃわちゃしてる間に下の方から消す!
一度に消すのではなく、半分ずつ消すことで隙間だった空間に水が流れ込む量を減らして誤魔化す作戦です。
- スプーンを複製
水がぶつかる障害物としてエフェクター用にスプーンを複製します。
元のスプーンからは流体モディファイアを削除して物理演算の対象にならないようにしておきます。
- 複製したスプーンからソリッド化モディファイヤを削除
このスプーンは平面に「細分化」モディファイアで分割を増やし「ソリッド化」で厚みを付けていますが、今回障害物エフェクターとして使うには厚みは不要ですし平面の方が体積が無くなり都合がいい(はず)なのでモディファイアは削除します。 - スプーンを上下に分割
スプーンを上下に二分割して別々のオブジェクトにします。
- 下のスプーンのエフェクターを40フレーム目で削除
39フレームにスプーンの「物理演算プロパティ」から、「流体」を「エフェクター」に、「表面の厚さ」を0.00000にして「エフェクターを使用」にチェックしてキーフレームを設定します。
そして次の40フレーム目で「エフェクターを使用」にチェックを外してキーフレームを打ちます。
- 下のスプーンのエフェクターを52フレーム目で削除
同様にスプーンに水がぶつかる部分が水没するタイミングで「エフェクターを使用」にチェックを外すキーフレームを設定します。
それでレンダリングした結果がこちらです。
コップにスプーンを入れてみただけなのに…#Blender の流体シミュレーションで障害物を加えたら、エフェクターの影響でスプーンの周りが変テコになる問題発生【解決策募集中】
なので誤魔化す方法を考えました😅
伝えるの難しい…のでブログにてhttps://t.co/yEGMzLZEWE#b3d #fluidsimulation pic.twitter.com/8jENI8ygQq— ky01da (@KY0) November 27, 2022
正直、かなり苦し紛れの方法ですがっ。😅
もっと簡単ないい方法があるよ!という方、是非ご教唆ください!
追記:
何と本当に灰ならしさんにご教唆いただけました!
Blenderの流体シミュレーションで水をリアルにするには?
コップに水を注ぐ流体シミュレーション
いつもBlenderの勉強をさせていただいている灰ならしさんのこちらの記事を参考に、初めて流体シミュレーションというものをやってみました。
初めはパーティクルのベイクが出来たり出来なかったりでよくわからなかったのですが、灰ならしさんの記事の丁寧な解説のおかげでどうにか出来るようになりました。
※どこでつまづいたかというと、パーティクル計算のやり直し方がわかりませんでした。
「物理演算プロパティ」の「キャッシュ」でタイプが「リプレイ」なら他の設定に変えて戻す、
同じくタイプが「モジュール」なら「流体」で「データを解放」
タイプが「全て」なら「全て開放」するだけでした。
後編の記事でコップから水が漏れる現象の対処法やよりリアルに見える方法を解説してくださっています。
ところがいかんせん未熟者ゆえ、やってみたところサラサラした水っぽい感じではなく、やや粘り気というかトロみのある液体に見えてしまいます。
これは何故なのか、どうしたら改善できるか考えてみました。
先ず思いついた仮説は「ブーリアンでコップと水の接する面を平らにカットしてみる」ことでした。
コップに水を注ぐ流体シミュレーションが自然に見えない理由と対策
- 水面がデコボコ
流体シミュレーションはパーティクルの集まりなので、水面が完全に平らになりません。
どうしても表面が凸凹になり、その結果ゼリーのような、粘性のある液体に見えてしまうようです。理屈ではパーティクルを非常に小さくすれば平らに近づくのでしょうが、データ量と計算時間等を考慮すると限界がありそうです。
そこで、パーティクルのドメインとコップの内側を引き伸ばした円柱状の形状とでブーリアン演算の「交差」にすることで、コップと水が接する側面のデコボコした部分をカットします。
追記:
そもそもパーティクルにブーリアンかけられるの?っていう話ですが、かけられました。
ただしメッシュをベイクした状態でないとブーリアンが反映されません。
また、不自然なレンダリング結果にならないように、ブーリアン形状にスムーズシェードはかけないで、なめらかにしたい場合はポリゴンを増やして対応しています。 - 水面がなかなか止まらない
そして流体シミュレーションはなかなか止まりません。
フレーム数を増やして実験しても、水面を真っ平らな状態で完全に静止させることが出来ませんでした。なので水面も側面同様ブーリアンをかけることで平らにしてみます。
- 水の落ちるスピードが遅い
もうひとつのポイントは水の落ちるスピードです。
実際に蛇口からコップに水を注いで観察してみたところ、水の落ちる速度が現実ではかなり速いことに気づきました。CGで再現する際、ゆっくりの方がシミュレーションとしては面白いのですが、そうするとやはり粘性のある液体のように見えてしまいます。
これは速度を速めることで解決できそうです。
それでレンダリングしたアニメーションがこちらです。
https://twitter.com/ky0/status/1594213587710795776?s=46&t=UXVJorLDJLu7wxD_wEGnJQ
スピードを倍にすることでだいぶ水らしいサラっとした感じになりました。
最後の水面を静止させるためのブーリアンは、よく見ると水面が下がるのが見えてしまうため、結局After Effectsで最終フレームをゆっくりブレンドすることにしました(邪道!)
水面用のブーリアン(差分)オブジェクトをゆっくりと下げるわけですが、そのタイミングを調整するたびにレンダリングし直すのはツラいので、After Effectsを使う方が簡単なんですよね(言い訳!)
しかし、このあとスプーンをコップに入れたところ、思いがけない問題が表面化するのでした…(つづく)
コード進行フェチのメモ帳
インディーズ系多め。有名曲は「感動のコード進行・連想ゲーム編」プレイリストにて
普段BGMとしてプレイリストを再生する場合、SpotifyであれYouTubeであれ、有料プランに加入しない限り宣伝が挟まりますよね。
ですが上のようにYouTubeのプレイリストをブログやSNSに埋め込んだ場合は、有料プランに入っていなくても宣伝が入らずに連続再生できることに気づきました。
続きを読む