Sphere-Collision 알고리즘은 간단하면서도 중요하게 사용되는 충돌 감지 알고리즘의 한 종류로, 구와 구 사이의 충돌을 감지하는 데 사용된다. 이 알고리즘은 물리 엔진, 게임 개발, 시뮬레이션 등에서 많이 사용된다.
구는 중심점과 반지름으로 정의된다. 이를 수학적으로 표현하면 다음과 같다.
중심점: $\mathbf{c} = (c_x, c_y, c_z)$
구 $A$와 $B$가 있다고 가정하면, 각각의 중심점과 반지름은 다음과 같이 표현된다.
구 $A$: 중심점 $\mathbf{c}A = (c{Ax}, c_{Ay}, c_{Az})$, 반지름 $r_A$
구 $B$: 중심점 $\mathbf{c}B = (c{Bx}, c_{By}, c_{Bz})$, 반지름 $r_B$
두 구 $A$와 $B$가 충돌하려면 두 구의 중심점 사이의 거리가 두 구의 반지름의 합보다 작거나 같아야 한다. 이를 수식으로 표현하면 다음과 같다.
∥cA−cB∥≤rA+rB 여기서 $|\mathbf{c}_A - \mathbf{c}_B|$는 두 구의 중심점 사이의 거리이다. 구의 중심점 사이의 거리는 유클리디언 거리로 계산할 수 있다.
두 벡터 간의 유클리디언 거리는 다음과 같이 구할 수 있다.
∥cA−cB∥=(cAx−cBx)2+(cAy−cBy)2+(cAz−cBz)2 이를 충돌 조건과 함께 사용하면 다음과 같다.
(cAx−cBx)2+(cAy−cBy)2+(cAz−cBz)2≤rA+rB 3.3. 벡터를 이용한 충돌 감지
벡터를 이용해 위의 충돌 조건을 간단히 표현할 수 있다.
d=cA−cB 벡터 $\mathbf{d}$의 크기를 구한다:
∥d∥=d⋅d
∥d∥≤rA+rB 이 과정을 통해 두 구의 충돌을 간단하게 감지할 수 있다.
C++ 예제 코드는 다음과 같다:
여기서 Vector3는 3차원 벡터를 나타내는 구조체 또는 클래스이다.
충돌 감지 알고리즘을 최적화하려면 여러 건의 구체적인 최적화 기법을 사용할 수 있다.
공간 분할 기법은 충돌 감지 연산의 수를 줄이는 데 효과적이다. 대표적인 공간 분할 방법들은 다음과 같다:
쿼드트리/옥트리 (Quadtree/Octree): 2차원에서는 쿼드트리, 3차원에서는 옥트리를 사용해 구체들을 공간에 효율적으로 배치하고 검색할 수 있다.
그리드 분할: 공간을 균등한 그리드 셀로 나누고, 각 셀에 속한 구들만 충돌 검사를 수행한다.
3.5.2. 축소 반지름 검토 (Bounding Volume Hierarchies)
구 대신 더 간단한 형태의 경계체 (예: Axis-Aligned Bounding Box, AABB)를 사용해 초기 충돌 검사를 수행한 후, 실제 구 간의 충돌을 검사할 수 있다.
충돌 검사 전에 구들의 중심 좌표를 기준으로 정렬한 리스트를 사용하면, 가까운 구들만 검사하면 되므로 효율성을 높일 수 있다.
충돌이 발생한 경우에는 부딪힌 구들을 처리하는 방법도 중요하다. 이를 위해 물리적 반응을 계산하는 알고리즘이 필요하다. 대표적인 방법은 다음과 같다:
3.6.1. 반사 벡터 계산
충돌 시 두 구의 속도를 반사시켜 충돌 후의 속도를 계산할 수 있다.
3.6.2. 침투 깊이 보정
구들이 겹치는 경우, 충돌 해소를 위해 침투 깊이를 계산하고 이를 바탕으로 위치를 보정한다.
구 충돌 감지 알고리즘은 게임 및 시뮬레이션에서 매우 중요하다. 효율적으로 충돌을 감지하고 처리하기 위해서는 다양한 최적화 기법과 충돌 후 처리 방법을 이해하고 사용할 필요가 있다.