長方形が衝突する側面を決定する単純な2D長方形衝突アルゴリズム?


16

最初は長方形の交差点を実装してみましたが、うまく機能します。ただし、速度、加速度、方向ベクトルなどの物理システムを適用する必要がある場合、四角形のどちら側が衝突するかを判断する方法を見つける必要があります。さて、私のシステムでは、回転した長方形はないので、これは問題を単純化しました。しかし、どの長方形の側面が衝突したかを判断する簡単な方法を見つけることができませんでした。私は以前この問題に対処したことがありますが、惨めに失敗しました。

過去に私がやったことは、平行な長方形の各辺間の距離を決定し、距離が0に近い(最初に定義された距離範囲を使用)か0かを確認することです。しかし、浮動小数点演算では、未知の時間が経過した。定義された範囲に達する前に、長方形が実際に交差する場合があります。

一方、私は複数の長方形を生成することを考えていました。各長方形は各辺に対応しています。ただし、考え直してみると、距離範囲をチェックする平行な側面があるのと同じことです。ただ、その距離範囲は各ミニ長方形の幅です。

したがって、この問題に対する提案はありますか?


離散的または連続的な位置更新を使用していますか?(フレームごとに1回加速度で速度を更新してから位置を計算するか、位置を推定する関数を使用して)
ケーシークーボール

回答:


24

「どちらの側がヒットしましたか?」に対する私の回答から適合 :

新しい長方形であるBとAのミンコフスキー和を計算し、長方形Aの中心がその新しい長方形(衝突が発生しているかどうかを知るため)とその対角線(衝突の場所を知るために)起こっている):

float w = 0.5 * (A.width() + B.width());
float h = 0.5 * (A.height() + B.height());
float dx = A.centerX() - B.centerX();
float dy = A.centerY() - B.centerY();

if (abs(dx) <= w && abs(dy) <= h)
{
    /* collision! */
    float wy = w * dy;
    float hx = h * dx;

    if (wy > hx)
        if (wy > -hx)
            /* collision at the top */
        else
            /* on the left */
    else
        if (wy > -hx)
            /* on the right */
        else
            /* at the bottom */
}

1
「上」と「下」は座標系に相対的であることを付け加えます。たとえば、私のゲームでは、(0,0)は左上にあるため、例とは逆になっています。心に留めておいてください。
ネイコス

素晴らしいソリューションで、私のニーズに非常によく合っていました。
-Opiatefuchs

1
dxが0になる、dyが0になる、またはその両方の不具合がありますか?それを推論させてください... dx = 0 && dy == 0の場合、両方の長方形が同じ原点にあることを意味し、デフォルトでアルゴリズムはbottomを返しますか?どちらかが0の場合、正しい結果が期待されます。だから、このアルゴリズムはdx == 0 && dy == 0の場合を除いて正しいと思う。だから、用心してありがとう。
プラサンス

1
今、私はdx == dy、w == hのときに何が起こるのか疑問に思っていました...そして、コードは結果が実際には不確定であるときに一方の側であると決定します.1つの正方形の中心が交差するように交差する2つの正方形を想像別の正方形の角と他の正方形の中心は、最初の正方形の角にあります。ここでは、側面は不定である必要があります-それは右または下ではありません。両方ですか?!
プラサンス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.