충돌 감지는 물리 엔진에서 매우 중요한 부분이다. 각 오브젝트 간의 충돌을 정밀하게 감지하고 처리함으로써 현실감 있는 시뮬레이션을 구현할 수 있다. 여러 가지 방법론이 존재하며 각 방법론마다 장단점이 있다.

AABB (Axis-Aligned Bounding Box)

AABB는 오브젝트를 둘러싸는 축에 정렬된 경계 박스를 이용해 충돌을 감지하는 방법이다. AABB는 충돌 감지에 있어 계산이 간단하고 빠르다는 장점이 있다.

\text{충돌 여부} = (A_{\min,x} \leq B_{\max,x} \quad \text{and} \quad A_{\max,x} \geq B_{\min,x}) \quad \text{and} \quad (A_{\min,y} \leq B_{\max,y} \quad \text{and} \quad A_{\max,y} \geq B_{\min,y})

여기서 AB는 각각 두 오브젝트의 AABB 박스이다.

OBB (Oriented Bounding Box)

OBB는 AABB와 유사하지만 축이 물체에 고정되어 회전할 수 있는 경계 박스를 이용한다. OBB는 AABB에 비해 정확하지만, 충돌 감지 계산이 더 복잡한다.

SAT (Separating Axis Theorem)

SAT는 두 오브젝트가 충돌하지 않는 경우, 서로 분리할 수 있는 하나의 축이 존재함을 이용하는 방법이다. 이 접근법은 주로 다각형과 다면체의 충돌 감지에 사용된다.

\max(A_{\text{proj}}) < \min(B_{\text{proj}}) \quad \text{or} \quad \max(B_{\text{proj}}) < \min(A_{\text{proj}})

케이디 트리 (kd-Tree)

케이디 트리는 다차원 공간에서 오브젝트를 분할하는 방법으로, 분할과 정렬을 통해 효율적인 충돌 감지를 가능하게 한다. 각 노드는 공간을 두 개의 하위 공간으로 재귀적으로 분할한다.

쿼드 트리 (QuadTree)와 옥트리 (Octree)

쿼드 트리옥트리는 이차원 및 삼차원 공간을 분할하여 효율적인 충돌 감지를 제공한다.

브로드 페이즈 (Broad Phase)와 내로우 페이즈 (Narrow Phase)

충돌 감지는 일반적으로 '브로드 페이즈'와 '내로우 페이즈'로 나뉜다:

GPU 기반 충돌 감지

최근에는 많은 물리 엔진들이 GPU를 활용하여 충돌 감지 작업을 가속화하고 있다. GPU는 병렬 처리가 강력하므로, 많은 오브젝트 간의 충돌을 동시에 처리할 수 있다.

공간 해시 (Spatial Hash)

공간 해시는 공간을 균등한 격자로 분할하고 각 격자 셀에 포함된 오브젝트들을 해시 테이블에 저장하는 기법이다.

h(x, y, z) = (x \cdot p1 + y \cdot p2 + z \cdot p3) \mod n

여기서 p1, p2, p3는 큰 소수이고 n은 해시 테이블의 크기이다. - 충돌 감지: - 오브젝트가 속한 격자 셀 내의 다른 오브젝트들과 충돌 여부를 검사한다. - 이웃하는 격자 셀들도 포함하여 충돌 감지 범위를 확장한다.

지속 충돌 감지 (Continuous Collision Detection)

일반적인 충돌 감지는 이산적인 시간 단계에서 수행되지만, 지속 충돌 감지는 두 시간 단계 사이에서 오브젝트의 충돌 여부를 감지하는 기법이다.

하이브리드 접근법

많은 물리 엔진들은 위의 여러 방법론을 결합하여 최적의 성능과 정확도를 얻는다.

결론적으로, 물리 엔진의 효율성과 정확성을 높이기 위해 다양한 충돌 감지 방법론이 사용된다. 각 방법론은 그 나름의 장단점을 가지고 있으며, 대부분의 물리 엔진에서는 상황에 맞게 여러 기법을 혼합하여 사용한다.


충돌 감지 기법은 물리 엔진의 성능과 정확도를 크게 좌우하는 중요한 요소이다. 각 기법의 원리와 적용 방법을 이해하고, 상황에 맞게 최적의 방법을 선택하는 것이 중요하다. 물리 엔진의 복잡성과 성능 요구사항에 따라 다양한 기법의 조합을 통해 최상의 결과를 얻을 수 있다.