AABB(Axis-Aligned Bounding Box)는 컴퓨터 그래픽스와 게임 개발에서 많이 사용하는 충돌 감지 알고리즘 중 하나이다. 주로 간단하면서도 효율적인 방법으로 두 물체가 충돌하는지 여부를 판별하는 데 사용된다. AABB는 축에 정렬된 바운딩 박스라고도 불리며, 물체를 감싸는 가장 작은 직사각형을 의미한다. 이 직사각형은 축에 정렬되어 있어 회전하지 않는 것이 특징이다.
정의
AABB는 2D 또는 3D 공간에서 사용할 수 있다. 2D 공간에서 AABB는 일반적으로 최소와 최대의 x, y 좌표로 정의된다. 3D 공간에서는 z 좌표가 추가된다.
- 2D 공간에서 AABB는 다음과 같이 정의된다:
\mathbf{Min} = (x_{\text{min}}, y_{\text{min}})
\mathbf{Max} = (x_{\text{max}}, y_{\text{max}})
- 3D 공간에서 AABB는 다음과 같이 정의된다:
\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 A와 B의 충돌 감지를 검사하려면 다음 조건이 모두 참인지 확인한다:
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의 min
및 max
값을 재계산한다.
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 충돌 감지의 장점과 단점은 다음과 같다.
장점
- 간단함: AABB 충돌 감지는 구현이 매우 간단하며 이해하기 쉽다.
- 빠른 계산: 축 정렬된 바운딩 박스는 비교 연산만으로 충돌 여부를 판단할 수 있어 매우 빠르다.
- 적은 메모리 사용: 필요한 데이터가 최소화되어 메모리 사용량이 적다.
단점
- 불정밀: AABB는 물체를 단순하게 직사각형이나 직육면체로 감싸기 때문에 실제 모양에 비해 많이 남는 부분이 있을 수 있다. 따라서 충돌 감지의 정확도가 떨어질 수 있다.
- 비효율적인 회전 물체: 물체가 회전할 경우 AABB의 크기가 더 커져서 실제보다 많은 공간을 차지하게 되어 충돌 감지의 효율이 떨어질 수 있다.