AABB(Axis-Aligned Bounding Box)는 컴퓨터 그래픽스와 게임 개발에서 많이 사용하는 충돌 감지 알고리즘 중 하나이다. 주로 간단하면서도 효율적인 방법으로 두 물체가 충돌하는지 여부를 판별하는 데 사용된다. AABB는 축에 정렬된 바운딩 박스라고도 불리며, 물체를 감싸는 가장 작은 직사각형을 의미한다. 이 직사각형은 축에 정렬되어 있어 회전하지 않는 것이 특징이다.

정의

AABB는 2D 또는 3D 공간에서 사용할 수 있다. 2D 공간에서 AABB는 일반적으로 최소와 최대의 x, y 좌표로 정의된다. 3D 공간에서는 z 좌표가 추가된다.

\mathbf{Min} = (x_{\text{min}}, y_{\text{min}})
\mathbf{Max} = (x_{\text{max}}, y_{\text{max}})
\mathbf{Min} = (x_{\text{min}}, y_{\text{min}}, z_{\text{min}})
\mathbf{Max} = (x_{\text{max}}, y_{\text{max}}, z_{\text{max}})

충돌 감지

AABB 충돌 감지는 두 개의 AABB가 겹치는지를 검사하는 방식으로 이루어진다. 두 AABB가 겹치기 위해서는 각 축(x, y, z)에 대해 범위가 겹쳐야 한다.

2D AABB 충돌 감지

두 AABB AB의 충돌 감지를 검사하려면 다음 조건이 모두 참인지 확인한다:

A_{\text{min}, x} \leq B_{\text{max}, x} \quad \text{그리고} \quad A_{\text{max}, x} \geq B_{\text{min}, x}
A_{\text{min}, y} \leq B_{\text{max}, y} \quad \text{그리고} \quad A_{\text{max}, y} \geq B_{\text{min}, y}

위 수식은 다음과 같이 구현할 수 있다:

bool isColliding(const AABB& a, const AABB& b) {
    return (a.max.x >= b.min.x && a.min.x <= b.max.x) &&
           (a.max.y >= b.min.y && a.min.y <= b.max.y);
}
3D AABB 충돌 감지

3D 공간에서 AABB 충돌 감지는 2D 공간과 유사하나, z 축 검사를 추가해야 한다:

A_{\text{min}}, x \leq B_{\text{max}}, x \quad \text{그리고} \quad A_{\text{max}}, x \geq B_{\text{min}}, x
A_{\text{min}}, y \leq B_{\text{max}}, y \quad \text{그리고} \quad A_{\text{max}}, y \geq B_{\text{min}}, y
A_{\text{min}}, z \leq B_{\text{max}}, z \quad \text{그리고} \quad A_{\text{max}}, z \geq B_{\text{min}}, z

위 수식은 다음과 같이 구현할 수 있다:

bool isColliding(const AABB& a, const AABB& b) {
    return (a.max.x >= b.min.x && a.min.x <= b.max.x) &&
           (a.max.y >= b.min.y && a.min.y <= b.max.y) &&
           (a.max.z >= b.min.z && a.min.z <= b.max.z);
}

AABB 업데이트

물체가 이동하거나 크기가 변경되면 AABB 또한 업데이트해야 한다. 물체의 새로운 위치와 크기에 맞춰서 AABB의 minmax 값을 재계산한다.

2D AABB 업데이트

새로운 위치와 크기로 AABB를 업데이트하려면 다음과 같이 한다:

void updateAABB(AABB& box, const Vector2& newPosition, const Vector2& size) {
    box.min = newPosition;
    box.max = newPosition + size;
}
3D AABB 업데이트

새로운 위치와 크기로 3D AABB를 업데이트하려면 다음과 같이 한다:

void updateAABB(AABB& box, const Vector3& newPosition, const Vector3& size) {
    box.min = newPosition;
    box.max = newPosition + size;
}

AABB의 장단점

AABB 충돌 감지의 장점과 단점은 다음과 같다.

장점

단점