#author("2019-05-21T23:28:03+09:00","default:qua","qua") #navi(Processing/3.ライブラリの利用) * 3-3 物理シミュレーション Fisica [#x560612b] Fisicaは2次元の物理現象をシミュレートするライブラリの一つである。 #author("2019-05-21T23:36:29+09:00","default:qua","qua") 次のスケッチは落下するボールをシミュレートする。 Fisica.init(this)は決まり文句。 world=new FWorld()で、シミュレーションをする平面を用意する。 ball=new FCircle( 20 )で直径20ピクセルの「球」を用意し、 ball.setPosition( 50, 30 )でその中心を点(50,30)に置く。 world.add( ball )でこの球を平面に配置する。 draw()では、background(0)で画面を消去し、world.step()で時間を1/60秒だけ進めて、world.draw()で描画する。 import fisica.*; FWorld world; FCircle ball; void setup(){ size( 400, 400 ); Fisica.init( this ); world = new FWorld(); ball=new FCircle( 20 ); ball.setPosition( 50, 30 ); world.add( ball ); } void draw(){ background( 0 ); world.step(); world.draw(); } このスケッチを実行すると、球はまっすぐ落ちて、画面の下端からはみ出して見えなくなるだろう。 ball.setPosition( 50, 30 ); のあたりに、 ball.setVelocity( 50, 0 ); のように、初速度を設定することもできる。今度は放物運動を見ることができる。 特に指定しなければ、重力加速度は下向きに200(ピクセル毎秒毎秒)となっている。world.setGravity()で重力の向きと大きさが指定できる。重力をゼロにしてみる。 import fisica.*; FWorld world; FCircle ball; void setup(){ size( 400, 400 ); Fisica.init( this ); world = new FWorld(); world.setGravity( 0, 0 ); ball=new FCircle( 20 ); ball.setPosition( 50, 30 ); ball.setVelocity( 100, 0 ); world.add( ball ); } void draw(){ background( 0 ); world.step(); world.draw(); } これで球は右向きにまっすぐ進むが、少しずつ遅くなって、途中で止まってしまうだろう。これは、空気抵抗のような速度に比例する抵抗力が働くようになっているからである。抵抗力は、setDamping(b)で設定する(正確には、1/60秒に速度がb/60だけ減少するので、抵抗力の比例定数は、-60ln(1-b/60)である)。bは抵抗力の大きさを表す係数で、速度の-b倍の抵抗力を受けるものとする。setDamping(0)で抵抗力をゼロに設定できる。何も設定しなければ、bの値は0.5となっている。 画面の周りに壁を設けることができる。world.setEdges()で画面の周囲に厚さ5ピクセルの壁ができる。 import fisica.*; FWorld world; FCircle ball; void setup(){ size( 400, 400 ); Fisica.init( this ); world = new FWorld(); world.setGravity( 0, 0 ); world.setEdges(); ball=new FCircle( 20 ); ball.setPosition( 50, 30 ); ball.setVelocity( 100, 30 ); ball.setDamping( 0 ); world.add( ball ); } void draw(){ background( 0 ); world.step(); world.draw(); } このスケッチを試してみると、壁にたどり着いた球はほとんど跳ね返らない。 もっと跳ね返るようにするには、setRestitution( e )で跳ね返り係数を設定する。eは0から1の値で、0では全く跳ね返らず、1では弾性衝突する(壁に垂直に衝突した場合、速さは変わらず方向だけ逆になる)。何も設定しないとe=0.1となっている。Fisicaでは、2つの物体が衝突したときの跳ね返り係数は2つの物体のrestitutionの値のうち大きい方になる。