Javascriptで物理シミュレーション(単振動・空気抵抗)

つみきのアプリエンジニア、鈴木慎吾です。
前回の「等速運動・等加速運動」に引き続き、今回は単振動と空気抵抗をJavascriptで再現しています。

単振動

バネに繋がれた物体を引っ張った際の運動や、振り子の運動などが単振動にあたります。今回は、物体の初期位置からの変化量に応じて働く復元力を元に物体の動きを計算します。

下図のように、バネの一方の端が壁に繋がれ、もう一方に物体が繋がれている状態で、物体を壁と反対方向に引っ張ってみます。

springImage.gif

引っ張った距離を x としたとき、復元力(バネが元に戻ろうとする力) F

F = -kx(フックの法則)

と表されます。
この法則を「フックの法則」と言います。
さらに「運動方程式」により、質量 m の物体が、力 F を受けた際に物体に生じる加速度 a は、

F = ma (運動方程式)

の式で表されるため

a = -kx / m

の式が成り立ちます。

サンプルコードでは、 onTimer 関数が呼ばれるたびに、 ball の初期座標 sx と、ballの現在の座標 ball.x を元に加速度 a を計算して、 ball の座標を更新しています。
ここでは ball の質量を無視しているため、単純に a = -kx で加速度を算出しています。(56行目)

単振動と空気抵抗

単振動のサンプルに空気抵抗を加えてみます。
移動する物体に加わる空気抵抗は、移動している方向と逆の方向に速度に比例した力が加わるため、

F = -cd * v

と表せます。 cd を抗力係数と呼びます。
単振動のサンプルに、速度に比例する抗力を加速度から減算する式を追加しています。(63行目)
ball の振動は徐々に減衰し、やがて停止します。

ちょっと応用

上のサンプルでは ball のx座標が移動していましたが、これを応用して、 ball の大きさに変更してみます。
ball に変数 scale を持たせて、 onTimer 関数内で scale を振動させ、CSSの transform:scale() を使用して ball の大きさを変化させます。

次回は落下運動を再現してみたいと思います。

スマホアプリ制作、Web制作、UIコンサルなどのご依頼はこちら

お問い合わせ