# AABB (Axis-Aligned Bounding Box)

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}
$$

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

```cpp
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
$$

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

```cpp
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를 업데이트하려면 다음과 같이 한다:

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

**3D AABB 업데이트**

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

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

#### AABB의 장단점

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

**장점**

* **간단함**: AABB 충돌 감지는 구현이 매우 간단하며 이해하기 쉽다.
* **빠른 계산**: 축 정렬된 바운딩 박스는 비교 연산만으로 충돌 여부를 판단할 수 있어 매우 빠르다.
* **적은 메모리 사용**: 필요한 데이터가 최소화되어 메모리 사용량이 적다.

**단점**

* **불정밀**: AABB는 물체를 단순하게 직사각형이나 직육면체로 감싸기 때문에 실제 모양에 비해 많이 남는 부분이 있을 수 있다. 따라서 충돌 감지의 정확도가 떨어질 수 있다.
* **비효율적인 회전 물체**: 물체가 회전할 경우 AABB의 크기가 더 커져서 실제보다 많은 공간을 차지하게 되어 충돌 감지의 효율이 떨어질 수 있다.
