2D AABBxAABBのどちら側が衝突したかを調べる

私はブレークアウト/レンガブレーカー/アルカノイドクローン(opengl-es /アンドロイド)を作っています。私はかなり長い間、私の衝突検出コードに固執しています。タイトルが示唆しているように:どのようにレンガの側面がボールに当たったのか分かりますか?

ある方向(xまたはy)で速度を逆転させる必要があるだけなので、レンガが当たったとき、私は考えることができます:

 if(speedY < 0) : left, upper or right
 else : left, bottom or right
 if(speedX < 0) : bottom, right or upper
 else : bottom, left or upper  

しかし、これは私が垂直または水平に衝突したかどうかを決定することには至りません。

私はインターネット上のいくつかのコード例を見てきましたが、それらはしばしば非常にあいまいで、複雑で、私にとっては話題にはなりません。

2

2 答え

あなたがレンガの位置とボールの位置を知っていれば、各オブジェクトのテストを行い、レンガの側面を判断することができます。

左上の標準Java起源を仮定します:

   +----+
( )|    |
   +----+

If the ball's Max-X is < the Min-X of the brick, you know that it has to be on the left side, and vice versa with the right and left. You would also test the Y values for top and bottom collisions.

もちろん、これは衝突検出が最初に機能していることを前提としています。


編集


これはCollisionエンジンの抜粋ですが、これはほんの少しの例ですが、オブジェクトが衝突しているオブジェクトの左側にあるかどうかをテストする方法です。

else if ((oCenter.getX() < sCenter.getX()) 
        && ((oCenter.getY() < (sCenter.getY() + sourceHalfHeight)) 
        && (oCenter.getY() > (sCenter.getY() - sourceHalfHeight))))
    return LEFT;

ここの例では、 oCenter Point2D で、ボールの中心です。 sCenter Point2D で、長方形の中心です。 sourceHalfHeight は、長方形の高さの半分です(中心点 sCenter のオブジェクト)。

擬似コードアルゴリズム:

if (the center X of the ball < the center X of the rectangle
        AND the center Y of the ball is BETWEEN the max Y and min Y of the rectangle)
    then the ball is to the LEFT of the rectangle
end if
2
追加された
@ user717572はい、あなたは正しいですが、私はボールが衝突したオブジェクトのどの面を決定するかについての簡単な例を与えていました。比較はもう少し複雑ですが、アイデアが出てきました。
追加された 著者 Brandon Buck,
@ user717572私は私の編集で小さなサンプルコードを与えました。
追加された 著者 Brandon Buck,
あなたのメソッドで、ball.maxX
追加された 著者 user717572,

事は、ボールが2つの異なる時間に2つの異なる側を叩くことができるので、速度だけでそれを知ることができない、同じ方向に同じ速度で両方の時間。

例: 最初のラインはトップに当たって、2番目のラインはサイドに当たっていますが、どちらも同じスピードと方向を持っています

      /
    /  /
 _____  /
|_____| 

ボールの位置を使用して、それをレンガの両側と比較する必要があります

0
追加された