【LiquidFunでサイエンス】固液混相を簡単にシミュレートしてみよう~コード解説編1 固体(物体)を定義する~
液体が、波打ったり、しぶきを上げる様子をシミュレートできるフリーのJSライブラリ、「LiquiFun(リキッドファン)」についての記事です。
「LiquiFun」は本来はゲーム用途であり、2次元、基本粒子の性質(密度や半径)は1種類だけ、という制約はあり、また、現時点ではCDNという形態で配信されていないために、GAS(google Apps Script)に組み込んで使う事も困難です。
それでも「LiquiFun」は粒子法というシミュレート手法を使っている、数少ないフリーウェアであり、かつ、JavaScriptというアマチュアでも比較的平易に扱えるプログラムで操作できる利点もあり、これを日常の用途に役立てられないか?という事を探っていく記事です。
「LiquiFun」の導入については、こちらをご覧下さい。スタンドアロンでの作動方法のご紹介ですが、いつかGASに組み込めればいいなと思っています。
今回の記事は、以下のシミュレーションのコード解説になります。
登場させる固体(物体)の作成
入れ物(動かない)の作成
まず、入れ物となる物体の性質を定義する変数を宣言します。
(ここで、特に宣言しなければ、物体は不動物となる様です)
var bodyDef = new b2BodyDef();
そして、入れ物自身を宣言します。world.CreateBodyという関数を使用します。(名前は ground としてますが、何でも良い)
ここで、入れ物の性質を定義する変数として、前述の bodyDef を当てはめています。
var ground = world.CreateBody(bodyDef);
次に、入れ物の形状を表す折れ線を作成します。(名前は chainShape としています)
var chainShape = new b2ChainShape();
・・・
以下、chainShape という多角形の頂点座標を定義
最後に、物体に形状を結び付けて実体化させます。
物体(ground)の子関数 CreateFixtureFromShape で、引数に形状を適用します。(第2引数は密度ですがゼロにしています)
ground.CreateFixtureFromShape(chainShape, 0);
以上で、入れ物が出来ました。
Box2Dでは、こんな風な段階を経てようやく1つの物体に至ります。
箱の山(動く)の作成
次に、箱の山の性質を定義する変数を宣言します。
var bodyDef = new b2BodyDef();
bodyDef.type = b2_dynamicBody;
・・・
bodyDef.friction=0.1;//◆箱の摩擦
・・・
bodyDef.shape = box;
先ほどと違う点の1つが、以下の一文があることです。これで、物体が動く様になる様です。
bodyDef.type = b2_dynamicBody;
また、摩擦などの性質もここで付与できます。
bodyDef.friction=0.1;
更に、形状もここで適用します。
bodyDef.shape = box;
さきほどの入れ物の定義の仕方と少し違い、何でもかんでも bodyDef という変数に入れ込んでいる様です。
続く手順は同じです。
物体を宣言します。
var body = world.CreateBody(bodyDef);
物体に形状 box を適用して実体化させます。(第2引数の密度は0.5にしています)
body.CreateFixtureFromShape(box, 0.5);
固体(物体)を定義するルーチンをまとめる~基本の4ステップ~
ここで、物体を定義するルーチンをまとめます。
サンプルコードから帰納的に理解した手順ですが・・・以下の4ステップで物体を作ることができます。
1.物性を定義する変数を宣言
例:var 物性 = new b2BodyDef();
2.物性の決定
例:
物性.type = b2_dynamicBody; //可動
物性.friction=0.1; //摩擦
物性.shape = box; //形状
3.上記の物性を持った物体を宣言
例:var 物体 = world.CreateBody(物性);
4.物体に形状と密度を適用して実体化させる
例:物体.CreateFixtureFromShape(形状, 密度);
ここまでは、LiquidFun 固有のコードはありません。LiquidFunの母体となっている、Box2Dのコードです。
最後にいよいよ液体を登場させますが、次の記事でご説明していきます。