前回はUnityをつかって反発係数が異なるボールを地面に落としてその運動について調べました。Unityでは反発係数を1.0にするとだんだんボールの跳ね返りが強くなるという不思議な現象がおきました。

今回はいつもつかっているWindowsFormsアプリケーションをつかって検証をしてみることにします。

まず物体の自由落下の公式ですが、

落下速度 = 重力加速度 × 時間
落下する距離 = 重力加速度 × 時間の二乗 × 0.5 です。

物体が地面に当たったときは上方向の力がかかります。速度は下向きから上向きにかわります。そのときの上向きの速度ですが、これは反発係数によります。反発係数が0であれば速度は0、地面に落ちた物体はまったく動かないし、反発係数が1.0であるなら地面に衝突する直前の速度が逆向きになるだけで速さはかわりません。反発係数が1.0であるなら物体を落とした高さまで跳ね上がり、永久に跳ね続けることになります。

地面と衝突して上向きに移動方向を変えた場合、これは地面からの投げ上げと同じです。このときの物体の高さは公式より、

時間 t 経過後の物体の高さ = 初速度 × 時間 - 重力加速度 × 時間の二乗 × 0.5

上向きを+として考えるため、下向きにかかる重力加速度はマイナスになります。

ではこれをつかってプログラミングしてみましょう。

最初はこんなコードを書いてみました。

ここでは反発係数は1.0であるとしています。そして実際に実行してみるとUnityで実験したときと同じようにボールが跳ね上がる高さがだんだん高くなっていきます。

なぜだ???

ボールのY座標が(高さ – ボールの直径)より大きくなったら地面に接触したことになるので、ここでボールの初速度を設定しているのですが、実際にはボールはそれよりも低い位置まですすんでいるかもしれません。そのときの速度を新たなボールの初速度にするとボールは実際に地面に当たったときよりも速い速度で跳ね返ることになります。おそらくこれが原因であると思われます。

ではどうすればいいかというとボールが地面にあたる直前の速度を使えばよいということになります。Form1_Paintをちょっとだけ変更します。

これだと反発係数を1.0にすると同じ高さで跳ね続けます。

では反発係数を0.0~1.0にして複数のボールをつかって検証してみましょう。各ボールの初速度、経過時間、各ボールのYの初期座標、各ボールが地面に衝突する直前の速度は配列にしました。

最後のGetValueメソッドで反発係数を0.0から1.0まで0.1刻みで設定していますが、ここを変えると0.8から1.0まで0.02刻みなど他の条件で動作を検証することができます。

0.0から1.0まで0.1刻みで設定

0.8から1.0まで0.02刻み