プログラムで作るゲームの定番にブロック崩しがあります。ブロックにボールが当たるとブロックが消滅し、すべてのブロックを消去したらゴールです。
ブロックへの当たり判定がプログラミングの際の1つのポイントです。
もう1つのポイントはブロックにボールが当たった時の反射です。鏡に光が当たった時のように鏡面反射させるのが普通です。ところが、ブロックのカドにボールが当たった時、ボールはどのように反射するのでしょうか?実際に生徒さんから頂いた質問です。良い質問です。
まず、下図のように左下に四角形があるときに、右上から円が移動してきて、四角形のカドに当たる場合を想定しましょう。当たった時の円の中心とカドを結んだ線を中心軸ということにしましょう。一般に、衝突前の円の速度ベクトルの方向と中心軸の方向は一致しません。そこで、衝突前の速度ベクトルを中心軸に平行な向きと、垂直な向きに分けてみましょう。中心軸の方向では、運動量保存則と反発の法則から、衝突後の速度ベクトルは中心軸の方向で向きが反対になります。いわゆる心向き直衝突です。一方、中心軸に垂直な向きの速度ベクトルは衝突後も変化しません。よって、衝突後の、中心軸に平行な速度ベクトルと中心軸に垂直な速度ベクトルを合成すれば、衝突後の速度ベクトルが求まるわけです。
実際にプログラムを作成して、いろいろな速度ベクトルを持つ円を四角形のカドに当ててみました。
下の映像は同じ場所から円を発生していますが、速度ベクトルがそれぞれの円で異なります。
下の映像は3か所の異なる場所で円を発生しています。最初の3つの円は速度ベクトルが中心軸と同じになるようにしているので、来た方向と反対方向に跳ね返っています。そのあとの円は速度ベクトルが中心軸とずれるように設定してあります。
物理現象はシミュレーションしてみることにより、より一層理解が深まります。