충돌과 접촉 핵심 정리

충돌과 접촉은 두 물체가 서로 겹치거나 가까워졌을 때 물리적으로 어떤 반응을 만들어낼 것인가를 다루는 영역이다.

게임 물리에서는 단순히 “부딪혔다”를 판단하는 것으로 끝나지 않는다.

충돌 검출 -> 충돌점/접촉점 계산 -> 충돌 법선 계산 -> 상대 속도 계산 -> 충격량 계산 -> 속도/회전 수정 -> 겹침 해결

이 전체 과정이 충돌 처리다.


충돌 역학

두 물체가 충돌하면 짧은 시간 동안 매우 큰 힘이 작용한다.

충돌을 힘의 관점에서 보면

충돌 -> 큰 힘 -> 짧은 시간 -> 운동량 변화

이고, 충격량 관점에서는

충격량 = 운동량 변화

가 된다.

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

충격량 -> 속도 변화

충돌점이 질량 중심에서 떨어짐 -> 회전 변화

마찰 -> 접선 방향 상대 운동을 감소

충돌 해결 -> 속도/각속도/위치 수정

위치 보정 -> 침투 해결

전체 구조는 다음과 같이 잡으면 된다.

충돌 검출 -> 충돌점/법선/침투량 -> 상대 속도 -> 반발 -> 충격량 -> 선속도/각속도 수정 -> 위치 보정

마찰까지 포함하면

충돌 검출 -> 법선/접선 분리 -> 법선 충격량 -> 반발 -> 접선 마찰 충격량 -> 속도/회전 수정 -> 침투 보정

게임 물리에서 핵심은 충돌을 검출하는 것과 충돌을 해결하는 것은 완전히 다른 문제라는 점이다. 검출 단계에서는 기하학을 다루고, 해결 단계에서는 상대 운동량과 제약 조건을 다룬다.