물리 엔진 궁금증 4 - 충돌 검출
Categories:tech
물리 엔진 궁금증 4 - 충돌 검출
발생
이번에는 충돌에 대해 알아보았다.
충돌을 처리하기 위한 과정 3가지
충돌을 처리하기 위해선 3가지 과정이 필요하다 그 과정은 아래와 같다.
- 충돌 검출 (Collision Detection)
- 접촉 생성 (Contact generation, manifold)
- 충돌 응답 (Collision Response)
각 과정들은 최적화된 알고리즘으로 구현을 하게되고 하나하나 이론적인 배경이 없다면 이해가 힘들것이다. 내가 그랬기 때문이다.
충돌 검출 (Collision Detection)
충돌 검출도 과정이 나눠진다. 두 가지로 나눠지며 각 단계는 아래와 같다.
- Broad Phase -> 충돌 후보 추림
- Narrow Phase -> 실제 충돌 판정
두 단계로 나눠진 이유에 대해 찾아보니 초창기에는 충돌 처리를 할 요소의 양 자체가 적어서 모든 요소 전체에 대해 브루트 포스로 충돌 연산을 진행했었다. 그러나 이후 한 프로그램에서 처리해야 할 요소들의 절대적인 양이 많아졌고 요소 전체를 검사하는 브루트 포스로는 시간 복잡도가 $O(n^2)$ 인 상태가 되어버린다.
실시간 시뮬레이션을 위해서는 최소한의 연산으로 충돌 검출을 할 수 있어야 했고 이를 해결하기 위한 방법으로 충돌이 일어날 확률이 있는 요소들만 추려 그 요소들만 실제 충돌 연산을 진행하는 아이디어가 나오게 되었다.
앞선 과정들을 통해 충돌 검출은 Broad Phase와 Narrow Phase 두 단계로 처리하는 방법이 보편화 되었고 두 단계로 충돌 검출을 연산하여 시간 복잡도를 $O(n \log n)$ 상태까지 만들 수 있게 되었다.
Broad Phase
충돌 후보를 추리는 단계이다.
이 Broad Phase 에 대해 알기 위해선 우선 AABB에 대해 알아야 한다. 링크를 클릭해서 알아보고 오는걸 추천한다. AABB 란?
이 단계에서 사용되는 주요 알고리즘들은 아래와 같다.
- Uniform Grid (Spatial Hashing)
- 공간을 격자(grid)로 나누고 각 물체의 AABB가 걸치는 셀에 등록
- 같은 셀 또는 인접 셀에 속한 물체들만 충돌 후보로 지정
- 장점: 구현이 간단하고 빠르다.
- 동적 씬에 적합하다.
- 단점: 셀 크기 설정이 중요한다.
- 너무 작으면 비효율 너무 크면 충돌 후보가 많아지게 된다.
- Sweep and Prune (Sort and Sweep)
- x, y, z 중 한 축에 대해 AABB의 시작, 끝점을 정렬
- 겹치는 구간이 있는 물체 쌍만 후보로 지정
- 장점: 동적 물체에 효율적이고 구현이 쉽다.
- 매 프레임마다 정렬을 약간만 수정하면 되므로 갱신 비용이 낮다.
- 단점: 한 축 정렬만으로는 복잡한 3D 장면에서는 오검출이 증가한다.
- Bounding Volume Hierarchy (BVH)
- 물체 또는 삼각형들을 계층적 볼륨(Bounding Volume) 트리로 감싼다.
- (e.g., AABB Tree, OBB Tree, Sphere Tree)
- 루트에서 리프까지 내려가며 충돌 가능성 검사한다.
- 장점: 정적 장면에 매우 효율적이고 정확도가 높다.
- 단점: 트리 업데이트가 필요하며 동적 물체에는 추가 비용이 발생한다.
- 물체 또는 삼각형들을 계층적 볼륨(Bounding Volume) 트리로 감싼다.
- QuadTree, Octree
- 2D -> QuadTree, 3D -> Octree.
- 공간을 재귀적으로 분할하여 각 노드가 포함하는 물체를 관리한다.
- 장점: 공간 밀도 가 비균일한 분포에 강하다.
- 단점: 구현이 복잡하고 동적 업데이트 시에는 비용이 발생한다.
Narrow Phase
걸러진 후보들에 대해 실제로 충돌했는지 정확히 판정하고 접촉점(Contact Point), 법선(Normal), 침투 깊이(Penetration Depth) 등을 계산하는 단계이다.
사용되는 주요 알고리즘들은 아래와 같다.
- Separating Axis Theorem (SAT)
- 정확하고 간단하다. 볼록 다각형, 다면체에 효율적.
- GJK (Gilbert–Johnson–Keerthi) 알고리즘
- 실제 엔진에서 가장 많이 사용됨(Box2D, Bullet 등)
- EPA (Expanding Polytope Algorithm)
- GJK와 궁합이 좋아 세트로 자주 사용된다고 한다.
- SDF (Signed Distance Field)
- GPU 기반 시뮬레이션이나 deformable body에 활용된다고 한다.
Narrow Phase 단계의 알고리즘들은 좀 더 정확한 결과를 알아내기 위해선지 모두 복잡하고 하나하나마다 깊은 이해가 필요한 것 같다.
결론
오늘은 충돌에서도 충돌 검출 단계에 대해서만 조금 알아보았다.
충돌에 대해서만 알려고 해도 이렇게나 많은 정보들이 존재한다.
물리 엔진에 대해 알아갈수록 점점 다양한 지식들이 나와서 재미가 느껴진다.
계속 알아가보자.
Day-44