충돌과 접촉은 두 물체가 서로 겹치거나 가까워졌을 때 물리적으로 어떤 반응을 만들어낼 것인가를 다루는 영역이다.
게임 물리에서는 단순히 “부딪혔다”를 판단하는 것으로 끝나지 않는다.
충돌 검출 -> 충돌점/접촉점 계산 -> 충돌 법선 계산 -> 상대 속도 계산 -> 충격량 계산 -> 속도/회전 수정 -> 겹침 해결
이 전체 과정이 충돌 처리다.
충돌 역학
두 물체가 충돌하면 짧은 시간 동안 매우 큰 힘이 작용한다.
충돌을 힘의 관점에서 보면
충돌 -> 큰 힘 -> 짧은 시간 -> 운동량 변화
이고, 충격량 관점에서는
충격량 = 운동량 변화
가 된다.
J = Δp
또한
J = FΔt
이므로
FΔt = Δp
이다.
충돌은 보통 충돌 순간의 힘을 직접 계산하기보다 충격량(Impulse)을 이용해 속도를 즉시 변화시키는 방식으로 처리한다.
충돌 검출
충돌 검출(Collision Detection)은 두 물체가 실제로 충돌했는지를 판단하는 과정이다.
일반적인 구조는
Broad Phase -> 후보 쌍 탐색 -> Narrow Phase -> 정확한 충돌 검사
이다.
Broad Phase
많은 물체 중 실제로 충돌 가능성이 있는 쌍을 빠르게 찾는다.
대표적인 방법:
AABB
Bounding Sphere
Spatial Hash
BVH
Sweep and Prune
등이 있다.
목적은 정확한 충돌 검사를 해야 하는 객체 수를 줄이는 것이다.
모든 객체 비교 -> O(N²)
를 그대로 수행하지 않고
공간 분할/경계 검사 -> 충돌 가능성이 높은 객체만 선별
하는 방식으로 최적화한다.
Narrow Phase
Broad Phase에서 추려낸 물체 쌍에 대해 실제 형상끼리 충돌했는지를 정밀하게 검사한다.
대표적인 방법으로
SAT
GJK
EPA
등이 사용된다.
충돌점
충돌점(Contact Point)은 두 물체가 접촉하는 위치다.
충돌 해결에서는 단순히 “충돌했다”는 정보보다 어디에서 충돌했는가가 중요하다.
충돌점이 있어야 해당 위치에 충격량을 적용하고 회전 효과까지 계산할 수 있다.
특히 회전하는 강체에서는
충돌점 -> 질량 중심과의 거리 -> 토크 -> 각속도 변화
가 발생한다.
따라서 충돌점은 선형 운동뿐만 아니라 회전 운동에도 직접 영향을 준다.
충돌 법선
충돌 법선(Contact Normal)은 접촉면에 수직인 방향 벡터다.
보통 한 물체에서 다른 물체를 밀어내는 방향으로 정의한다.
normal = 충돌 해결 방향
이다.
충돌 해결에서 법선 방향은 매우 중요하다.
물체가 충돌했을 때 속도를
법선 방향 속도
와
접선 방향 속도
로 분리할 수 있기 때문이다.
상대 속도 -> 법선 성분 + 접선 성분
충돌로 인해 주로 수정되는 것은 법선 방향의 속도다.
마찰은 접선 방향의 속도를 수정한다.
상대 속도
충돌에서는 각 물체의 절대 속도보다 서로 얼마나 빠르게 가까워지고 있는지가 중요하다.
두 물체의 속도가 각각 v_A, v_B라면 상대 속도는
v_rel = v_B - v_A
이다.
충돌 법선 n에 투영하면
v_rel_n = v_rel · n
을 얻는다.
이 값으로 두 물체가 서로 접근하는지 판단할 수 있다.
접근 속도가 존재한다면 충돌 처리가 필요하다.
반대로 이미 서로 멀어지고 있다면 추가적인 반발 충격량을 적용하면 안 된다.
핵심은
상대 속도 -> 충돌 법선에 투영 -> 접근/분리 판단
이다.
반발
충돌했을 때 물체가 얼마나 튕겨 나가는지를 나타내는 대표적인 값이 반발 계수(Coefficient of Restitution)다.
e
로 표현한다.
범위는 일반적으로
0 <= e <= 1
이다.
e = 1 -> 완전 탄성 충돌
e = 0 -> 완전 비탄성 충돌
로 생각할 수 있다.
1차원 충돌에서 반발 조건은
상대 분리 속도 = e × 상대 접근 속도
형태로 표현할 수 있다.
따라서 반발 계수가 높을수록 충돌 후 더 강하게 튕긴다.
충격량
충돌을 실제로 해결하는 핵심 수단이 충격량이다.
J = Δp
충격량을 속도에 적용하면
p = mv
이므로
J = mΔv
가 된다.
따라서 충격량은 물체의 속도를 즉시 변화시킬 수 있다.
두 물체가 충돌할 때는 같은 크기의 반대 방향 충격량이 작용한다.
J_A = -J_B
따라서 고립된 계에서는 전체 운동량이 보존된다.
충돌 충격량의 기본 형태
단순한 두 강체 충돌에서 충돌 법선을 n, 상대 속도를 v_rel이라고 하자.
법선 방향 상대 속도는
v_rel · n
이다.
충돌 반발 계수를 e라고 하면 충돌 충격량의 크기는 기본적으로
j = -(1 + e)(v_rel · n) / (1/m_1 + 1/m_2)
형태가 된다.
따라서
충돌 법선 + 상대 속도 + 질량 + 반발 계수 -> 충격량
이 결정된다.
실제 강체 물리에서는 충돌점에서의 회전 속도까지 고려해야 하므로 식이 더 복잡해진다.
마찰
마찰은 접촉면을 따라 발생하는 힘이다.
충돌 법선이
n
이라면 상대 속도에서 법선 성분을 제거하여 접선 방향 속도를 얻을 수 있다.
v_tangent = v_rel - (v_rel · n)n
마찰은 이 접선 방향 상대 운동을 감소시키는 방향으로 작용한다.
대표적인 모델이 쿨롱 마찰(Coulomb Friction)이다.
정지 마찰에서는
|F_f| <= μ_s N
운동 마찰에서는
|F_f| = μ_k N
으로 표현한다.
μ -> 마찰 계수
N -> 수직항력
이다.
게임 물리에서는 마찰 계수를 이용하여
접촉 -> 법선 충격량 -> 접선 마찰 충격량
순서로 처리하는 경우가 많다.
충돌 해결
충돌 해결(Collision Resolution)은 검출된 충돌을 실제 물리 상태에 반영하는 과정이다.
일반적인 흐름은
충돌 검출 -> 접촉 정보 생성 -> 상대 속도 계산 -> 충격량 계산 -> 선속도 수정 -> 각속도 수정 -> 위치 보정
이다.
속도 해결
충격량 J를 적용하면
v'_1 = v_1 + J/m_1
v'_2 = v_2 - J/m_2
형태로 속도가 변경된다.
실제 계산에서는 충돌 법선 n을 포함하여
J = jn
으로 표현한다.
회전이 포함된 충돌
충돌점이 질량 중심에서 떨어져 있으면 충격량은 회전도 발생시킨다.
충돌점에서 질량 중심까지의 벡터를
r
이라고 하면 토크와 같은 효과가 발생한다.
회전 속도 변화는 개념적으로
충격량 -> 각운동량 변화 -> 각속도 변화
로 이어진다.
즉
충돌점이 질량 중심과 일치 -> 주로 선형 운동 변화
충돌점이 질량 중심에서 떨어짐 -> 선형 운동 + 회전 운동 변화
가 된다.
그래서 게임에서 물체가 모서리로 바닥을 때리면 회전하는 현상이 발생한다.
위치 보정
충돌 검출 시 두 물체가 이미 조금 겹쳐 있을 수 있다.
이를 그대로 두면
겹침 -> 다음 프레임에서도 충돌 -> 계속 충격량 적용 -> 떨림/관통
같은 문제가 발생한다.
따라서 충돌 해결에서는 위치 겹침을 별도로 보정한다.
침투 깊이 -> 보정 방향 -> 위치 분리
단순한 방식으로는
A 위치 += correction
B 위치 -= correction
처럼 서로 반대 방향으로 밀어낸다.
이때 위치 보정은 실제 충돌 속도를 계산하는 것과 다른 문제다.
Velocity Resolution -> 속도 문제 해결
Position Correction -> 겹침 문제 해결
둘을 분리해서 생각해야 한다.
충돌과 접촉의 차이
충돌(Collision)은 두 물체가 접촉하거나 충돌하는 사건에 초점을 둔다.
접촉(Contact)은 두 물체가 지속적으로 맞닿아 있는 상태까지 포함한다.
예를 들어 캐릭터가 바닥에 서 있는 경우
캐릭터 -> 바닥과 지속적인 접촉
상태다.
중력이 캐릭터를 계속 아래로 당기지만 바닥이 캐릭터를 위로 밀어내기 때문에
중력 + 수직항력 -> 알짜힘 0
이 되어 정지할 수 있다.
이런 접촉 문제에서는 단순한 한 번의 반발보다 접촉 제약(Contact Constraint)을 지속적으로 만족시키는 것이 중요하다.
충돌 검출과 충돌 해결의 분리
물리 엔진을 설계할 때 가장 중요한 구분 중 하나다.
Collision Detection -> 충돌이 발생했는가?
Collision Resolution -> 발생했다면 어떻게 반응할 것인가?
예를 들어
Collider A + Collider B -> 충돌 검출
이후
Contact Point + Normal + Penetration -> 충돌 정보
를 생성하고,
충돌 정보 + 상대 속도 + 질량 + 반발 + 마찰 -> 충격량
을 계산한다.
마지막으로
충격량 -> 속도/각속도 수정
침투량 -> 위치 보정
으로 물리 상태를 갱신한다.
핵심 정리
충돌 검출 -> 충돌 여부와 접촉 정보 계산
Broad Phase -> 충돌 후보 빠르게 탐색
Narrow Phase -> 정확한 충돌 판정
충돌점 -> 접촉이 발생한 위치
충돌 법선 -> 물체를 분리하는 기준 방향
상대 속도 -> v_rel = v_B - v_A
법선 상대 속도 -> v_rel · n
반발 -> 충돌 후 분리 속도를 결정
충격량 -> J = Δp
충격량 -> 속도 변화
충돌점이 질량 중심에서 떨어짐 -> 회전 변화
마찰 -> 접선 방향 상대 운동을 감소
충돌 해결 -> 속도/각속도/위치 수정
위치 보정 -> 침투 해결
전체 구조는 다음과 같이 잡으면 된다.
충돌 검출 -> 충돌점/법선/침투량 -> 상대 속도 -> 반발 -> 충격량 -> 선속도/각속도 수정 -> 위치 보정
마찰까지 포함하면
충돌 검출 -> 법선/접선 분리 -> 법선 충격량 -> 반발 -> 접선 마찰 충격량 -> 속도/회전 수정 -> 침투 보정
게임 물리에서 핵심은 충돌을 검출하는 것과 충돌을 해결하는 것은 완전히 다른 문제라는 점이다. 검출 단계에서는 기하학을 다루고, 해결 단계에서는 상대 운동량과 제약 조건을 다룬다.