見出し画像

【×GAS→JSでサイエンス】流体をシミュレートできるフリーのJSライブラリ「LiquidFun」Vol.2 ~液体と固体、あるいは異なる液体同士は扱えだろうか~

液体が、波打ったり、しぶきを上げる様子をシミュレートできるフリーのJSライブラリ、「LiquiFun(リキッドファン)」についての続報記事です。

日常で、液体が波を立てたりしぶきを上げるのはとても身近な現象ですが、こうした挙動を手軽にシミュレートできる数少ないオープンソースが「LiquiFun」です。

液体の振る舞いをカンや経験だけでなく数理的な側面からシミュレートできる様になると、日用の役に立ちそうな事があるでしょうか?そんな事を確かめたくで記事を書いています。

JavaScriptで動くプログラムなので、CDNで配信されていれば、GASに取り込んで使えるのですが、現時点では配信がなく、スタンドアロンでの使用になります。「LiquiFun」の基本的な使い方は以下の記事を参照ください。

固液混相のシミュレートは可能だろうか? ~LiquidFunがベースにしている、Box2Dで扱っている物体を混ぜ込んでみる~

LiquidFunは、Box2Dという、2次元物理シミュレーションライブラリをベースにしています。

ゲーム用途を想定した2次元の物理シミュレーションライブラリで、固体の物体を扱うものです。

ここで扱える固体の物体をLiquidFunの中に登場させられれば、ぐっと実用性が高まりそうです。
 
以前の記事でご紹介した、流体シミュレーションの「Hello、World!」(基本デモ)ともいうべき、「水中崩壊」シミュレートの中に、Box2Dで扱う固体の物体を混ぜ込んでみる事にしました。

何となく固体の動きがぎこちないですね。ここでは固体の密度を液体より大きくしているので、すぐに沈んでしまうからです。

妥当なシミュレートができているかを知るために、今度は固体の密度を液体より小さくしてみます。

いかがでしょうか?今度は液体の上に、固体が浮いています。どうやら、シミュレートは成立していそうです。

液体に固体が混じった状態を固液混相といいますが、LiquidFunでは、固液混相のシミュレートは可能な様です。

異なる液体の混相や気液混相のシミュレートは可能だろうか? ~2種類の粒子系を混ぜ込んでみる~

次に試したのは、水と油の様な異なる液体の混相や、気泡などの液体が混じった状態(気液混相)をシミュレートできるかどうかです。

ベースとなる液体粒子(LiquidFunでは流体を粒子の集合で扱います)に、別な粒子を混ぜ込む事ができれば、これは可能でしょう。

そこで、2種類の粒子系をプログラム中で混ぜてみました。

ただし、液体同士をまぜると、その正しさが分かりにくいので、片方を固体の属性(粒子団の属性として、液体の他に、ゼリーなどの弾性体や、固体などを指定できます)にして、両者が正しく影響しあっているか分かりやすくしてみました。

今回は、LiquidFunについているサンプルプログラムの内、「RigidParticles」というプログラムをベースにしました。

以下が結果です。

結果をみると、固体指定した粒子系は、液体の粒子系と何の干渉もしあっていない事が分かります。(白い丸は粒子ではなく、Box2Dで扱う固体の物体です。これとはそれぞれの粒子系は相互干渉しています)

つまり、残念ながら、2つの粒子系を扱う事はできないのです。

粒子の密度などは、系ごとに指定されるので、この結果から異なる液体同士や、気液混相はシミュレートは基本的にできない事が分かります。

ただし、上記の例から、同一の系の中で粒子団ごとに色を変えたり、属性(固体、弾性体、液体など)を変える事は可能な事は分かりますので、「同一の密度である場合」に限っては、混相は可能です。

気体の混じった状態で密度の差を無視できるケースは少ないと思いますので気液混相は事実上無理ですが、同じ密度の液体同士、あるいは液体と弾性体などの混相ならシミュレートできそうす。

コードについては後の記事で改めてご紹介予定です。

以上でこのシステムで扱える現象の大枠が分かりました。

液体のみならず、固体の混じった状態、さらには同じ密度の液体や弾性体が混じった状態までを扱える、それがLiquidFunの様です。

制約はあるものの、流体という現象を定量的に再現できるこのシステムで、日常で起きる現象を追い々い扱ってご紹介していこうと思います。


この記事が気に入ったらサポートをしてみませんか?