衝突応答シミュレーション(2D)

投稿者: | 2012年5月22日

1.はじめに

今回は1つの動いている物体が、静止している物体にぶつかった時、どのように跳ね返す処理を行えばよいのか、ということについて解説します。

2.座標軸に平行であるものに衝突した場合

例えば、ボールが壁にぶつかります。そして、跳ね返ることを「反射」といいます。

ボールは、一定の運動量を持っています。それを「ベクトル」に変換します。例えば、1フレーム内にx方向に2、y方向に5進むとした場合には、(x, y)=(2, 5)となります。

それを縦の壁と反射した場合は、次のようになります。

この場合の処理は簡単です。x方向への移動ベクトルを*-1して反転するだけです。

そして、横の壁と反射した場合は、

3.座標軸に平行でないものに衝突した場合

平行でないものに衝突した場合は、ちょっと厄介です。手順としては、以下のようになります。

  1. 壁の直交(法線)ベクトルNを求める
  2. 法線ベクトルNを正規化(N’)
  3. ボールの移動ベクトルをVaとすると、(-Va・N’)*N’で法線ベクトルへの-Vaの投影ベクトルPを求められる
  4. Va+2Pで「衝突後のAの移動ベクトル」が求められる

1.まず、壁の法線ベクトルNを求めます。

法線ベクトルとは、あるベクトルに直角に交わるベクトルのことを言います。

壁の法線ベクトルNを求めるには、壁の傾きの逆数を求めます。例えば、傾きが「-3/4」であった場合には「4/3」が逆数になります。(逆数は「元の数×逆数=-1」という式を利用します)

そして、逆数の傾きとなるようなベクトルを求めます。(x, y)=(4, 3)だと逆方向なので、(x, y)=(-4, -3)になります。

2.次に法線ベクトルNを正規化します。

「正規化」というのは、ベクトルのスカラを「1」にすることです。「スカラ」というのは、各要素を二乗して足し、ルートで割った値のことです。

例えば、(x, y)=(2, 5)は、√(22+52)=√29となり、「√29」がスカラとなります。

では、法線ベクトルNを正規化してみます。

法線ベクトルが(x, y)=(-4, -3)である場合、

  • x方向は-4/√(-4)2+(-3)2=-4/5
  • y方向は-3/√(-4)2+(-3)2=-3/5

になります。

3.続いて、投影ベクトルPを求めます。

「投影」というのは、あるベクトルのスカラを、別のベクトルに映し出すことです。この別のベクトルを「投影されるベクトル」と言います。「投影されるベクトル」のスカラは「1」でなければなりません。

例えば、この場合、投影を行うと、-VaとN’を内積します。(Vaとは逆の向きになりますので、-Vaとなります)

具体的な計算としては、

  • -(5×-4/5)+(1×-3/5)=17/5

となります。

さらに、ここでは投影ベクトルを求めたいので、その結果をN’に掛けることにより、Pが求められます。

  • (17/5×-4/5, 17/5×-3/5)=(-68/25, -51/25)

4.これで、ボールの衝突後の移動ベクトルが求められます。

図の通りに、Va+Pで、Vが求まり、V+Pでボールの衝突後の移動ベクトルが求められるからです。