今時は、色々なプログラムで物理シミュレーターのライブラリーが使えるようになって、物が衝突したり、転がったり、重なったり、とリアルな動きをするゲームがたくさん出て来たなと思います。

ですので、物理シミュレーターがなければ、そういった動きを作るのは無理、と思ってしまう人も多くいるのではないかなと思います。

ところが実は、バネの法則だけを知っていれば、結構リアルなシミュレーションができてしまうのです。

バネの法則とは、

力 = バネ定数 × バネの伸び

という、伸びれば伸びるほど力は強くなる、という結構当たり前っぽい法則です。

この法則を使って、Scratchでボールの衝突を再現したのがこの動画です。一番単純なx軸方向での衝突です。

スクラッチのプログラムはこちら

やっていることは以下の通りです。

1. ボールが何にも触れていない場合には、速度dxは変化しない。毎ステップごと、ボールのx座標にdxを足す。

2. ボールが障害物に触れると、障害物との距離に比例した力fがかかり、その分だけ速度dxが変化する。x座標は、dx分変化する。

簡単にするために、ボールの重さと時間ステップは1にしていると思ってください。

さて、Scratchでの実装です。直径が100くらいの円のスプライトを作り、ボール0とボール1とします。

まず、ボール0のプログラムです。下の変数を作ります。全体から見える変数にし、拡張を考えてボール番号0を変数名に着けています。画面に出したい変数にチェックを入れています。

メインのプログラムは、以下のような流れになります。
1. ball0_initで変数とボールの位置を初期化
2. ball0_updateで速度と座標を更新
3. ball0_forceでボール0にかかる力を計算
4. 2と3を繰り返す

ボール1は動かさないのでこれだけです。

これだけで動くはずです。作ってみて上手くいかないようでしたら、以下からプログラムが見れますので動かしてみて下さい。

スクラッチのプログラムはこちら

さあ、これさえ押さえておけば、いろんなことができますよ。