사각형이 충돌하는면을 결정하는 간단한 2D 사각형 충돌 알고리즘?


16

처음에는 사각형 교차를 구현하려고 시도했지만 제대로 작동했습니다. 그러나 속도, 가속도 및 방향 벡터와 같은 물리 시스템을 적용해야 할 때 직사각형의 어느 쪽이 충돌하는지 결정하는 방법을 찾아야했습니다. 이제 내 시스템에는 회전 된 사각형이 없으므로 문제가 단순화되었습니다. 그러나 충돌 한 사각형면을 결정하는 쉬운 방법을 찾지 못했습니다. 한 번도이 문제를 다루었지만 비참하게 실패했습니다.

과거에 한 것은 각 평행 직사각형 측면 사이의 거리를 결정하고 거리가 0에 가깝거나 (초기 정의 된 거리 범위를 사용) 0인지 확인하는 것입니다. 그러나 부동 소수점 산술의 경우 불안정하기 때문에 알 수없는 시간 경과. 때로는 사각형이 정의 된 범위를 충족하기 전에 실제로 서로 교차합니다.

다른 한편으로, 나는 여러 직사각형, 각면마다 직사각형을 생성하는 것에 대해 생각하고있었습니다. 그러나 다시 생각한 후에는 거리 범위를 확인하는 평행면을 갖는 것과 동일한 것이 될 것입니다. 거리 범위는 각 미니 직사각형의 너비입니다.

따라서이 문제에 대한 제안?


개별 또는 연속 위치 업데이트를 사용하고 있습니까? (매 프레임마다 한 번씩 가속으로 속도를 업데이트 한 다음 위치를 계산하거나 함수를 사용하여 위치를 추정하고
있습니까?

답변:


24

에 내 대답에서 적응 "어느 쪽이 맞았다?" :

나는 새로운 사각형 인 B와 A 의 Minkowski 합계 를 계산하고 사각형 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)은 왼쪽 상단에 있으므로 예제에서 반전됩니다. 명심해야 할 것.
Neikos

훌륭한 솔루션, 내 요구에 매우 잘 작동했습니다.
Opiatefuchs

1
dx가 0이되거나 dy가 0이되거나 둘 다가되는 결함이 있습니까? dx = 0 && dy == 0이면 두 사각형이 같은 원점에 있음을 의미하며 알고리즘은 기본적으로 아래쪽을 반환합니까? 둘 중 하나가 0이면 올바른 결과가 예상됩니다. 따라서이 알고리즘은 dx == 0 && dy == 0 인 경우를 제외하고는 정확하다고 생각합니다. 따라서 조심하고 감사합니다.
Prasanth

1
이제 dx == dy, w == h ... 일 때 어떤 일이 발생하는지 궁금해했습니다. 코드는 결과가 실제로 불확실 할 때 결과가 한쪽이라고 결정합니다 .2 개의 사각형이 교차하여 하나의 사각형의 중심이 다른 사각형의 모서리와 다른 사각형의 중심은 첫 번째 사각형의 모서리에 있습니다. 여기서 측면은 불확실해야합니다. 둘 다?!
Prasanth
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.