게임 물리는 현실의 물리 법칙을 그대로 계산하는 것이 아니라 게임에서 필요한 수준으로 근사하여 실시간으로 계산하는 시스템이다.
핵심 구조는
입력/외력 -> 물리 상태 -> 충돌 검출 -> 접촉/제약 생성 -> Solver -> 속도/위치 갱신
이다.
게임 물리에서는 특히 충돌 검출, 접촉, 제약 조건, Solver가 중요하다.
물리 엔진 구조
물리 엔진은 게임 세계의 물리 상태를 시간에 따라 갱신한다.
일반적인 구조는
Game State -> Physics Step -> Collision Detection -> Contact/Constraint -> Solver -> Integration -> Updated State
이다.
조금 더 구체적으로 보면
입력 -> 힘/토크 계산 -> Broad Phase -> Narrow Phase -> Contact 생성 -> Constraint 생성 -> Solver -> 속도/위치 갱신
으로 이어진다.
각 단계의 역할은 명확하게 분리된다.
Broad Phase -> 충돌 후보 탐색
Narrow Phase -> 정확한 충돌 판정
Contact -> 접촉 정보 생성
Constraint -> 물리적으로 지켜야 할 조건 표현
Solver -> 제약 조건을 만족하도록 상태 수정
Integration -> 속도와 위치 갱신
Rigidbody
Rigidbody는 물리 엔진에서 물체의 역학적 상태를 나타내는 구성 요소다.
일반적으로 다음과 같은 정보를 가진다.
질량
위치
회전
선속도
각속도
힘
토크
등이다.
기본적인 운동은
F = ma
에 따라 계산되고 회전 운동은
τ = Iα
에 따라 계산된다.
Rigidbody가 존재한다고 해서 반드시 충돌이 발생하는 것은 아니다.
충돌 형상을 정의하려면 별도의 Collider가 필요하다.
구조는
Rigidbody -> 물리 상태
Collider -> 충돌 형상
이다.
Collider
Collider는 물리 엔진에서 충돌을 검사하기 위한 기하학적 형상이다.
대표적으로
Sphere
Box
Capsule
Cylinder
Convex Mesh
Triangle Mesh
등이 있다.
Collider의 목적은 렌더링용 모델과 다르다.
그래픽 모델은 시각적인 표현을 위한 것이고 Collider는
충돌 판정 -> 접촉 정보 생성
을 위한 것이다.
따라서 복잡한 모델을 그대로 충돌 형상으로 사용하는 것보다 단순한 Collider를 여러 개 조합하는 것이 효율적인 경우가 많다.
Render Mesh != Collision Shape
Broad Phase
Broad Phase는 전체 Collider 중 충돌 가능성이 있는 객체 쌍을 빠르게 찾는 단계다.
모든 Collider를 서로 비교하면
N개의 객체 -> O(N²) 비교
가 필요할 수 있다.
Broad Phase는 공간 정보나 단순한 경계 상자를 이용해 검사 대상을 줄인다.
대표적인 방법은
AABB
Bounding Volume
Sweep and Prune
Spatial Hash
BVH
등이다.
목적은 정확한 충돌 검사가 아니라
충돌 가능성이 없는 객체 제거
다.
구조는
전체 객체 -> Broad Phase -> 충돌 후보 쌍
이다.
Narrow Phase
Narrow Phase는 Broad Phase에서 추려진 후보에 대해 실제 Collider 형상이 충돌하는지를 정밀하게 계산하는 단계다.
예를 들어
Sphere vs Sphere
Box vs Box
Capsule vs Mesh
등의 실제 기하학적 관계를 계산한다.
필요한 경우 다음과 같은 정보도 생성한다.
충돌 여부
충돌점
충돌 법선
침투 깊이
이 결과가 Contact 생성으로 이어진다.
전체 흐름은
Broad Phase -> 후보 쌍 -> Narrow Phase -> 정확한 충돌 정보
다.
Contact
Contact는 두 물체가 서로 접촉하고 있다는 물리적 정보를 나타낸다.
일반적으로 다음과 같은 정보가 필요하다.
Contact Point
Contact Normal
Penetration Depth
상대 속도
등이다.
예를 들어 바닥과 캐릭터가 접촉하면
접촉점 -> 캐릭터와 바닥이 맞닿은 위치
법선 -> 바닥에서 캐릭터를 밀어내는 방향
침투 깊이 -> 두 Collider가 얼마나 겹쳤는가
를 의미한다.
Contact 정보는 Solver가 충돌을 해결하는 데 사용한다.
Constraint
Constraint(제약 조건)는 물리 시스템이 반드시 만족해야 하는 조건이다.
예를 들어 바닥과 물체가 접촉했다면
물체가 바닥을 통과하면 안 된다
라는 제약이 생긴다.
두 물체를 Joint로 연결했다면
두 물체 사이의 특정 거리 유지
같은 제약이 생긴다.
따라서
Contact -> 접촉 제약
Joint -> 연결 제약
으로 생각할 수 있다.
게임 물리에서는 충돌도 결국 제약 조건을 만족시키는 문제로 볼 수 있다.
Solver
Solver는 생성된 Constraint를 만족시키기 위해 물체의 속도나 위치를 수정하는 계산 과정이다.
예를 들어 두 물체가 충돌했다면
충돌 -> 상대 속도 계산 -> 필요한 충격량 계산 -> 속도 수정
을 수행한다.
단순한 충돌에서는
충돌 법선 + 상대 속도 + 질량 + 반발 -> 충격량
을 계산할 수 있다.
그리고
충격량 -> 선속도/각속도 수정
이 발생한다.
접촉이나 Joint처럼 여러 제약 조건이 동시에 존재하면 Solver는 여러 조건을 반복적으로 처리해야 한다.
제약 조건과 Joint
Joint는 두 Rigidbody 사이에 특정한 운동 제약을 설정하는 장치다.
대표적으로
Fixed Joint
Hinge Joint
Spring Joint
Distance Joint
등이 있다.
예를 들어 회전문을 구현한다면
문 + Hinge Joint -> 특정 축을 중심으로 회전
하도록 만들 수 있다.
Joint는 단순히 물체를 연결하는 것이 아니라 허용되는 자유도(Degree of Freedom)를 제한하는 것이다.
3차원 강체의 경우 기본적으로
병진 3축 + 회전 3축 = 6 DOF
를 가진다.
Joint는 이 중 일부를 제한한다.
예를 들어
Hinge -> 특정 회전축만 허용
하는 방식이다.
자유도와 제약
강체의 움직임을 단순화하면
X 이동
Y 이동
Z 이동
X 회전
Y 회전
Z 회전
의 6개 자유도를 가진다.
제약 조건을 추가하면 자유도가 감소한다.
예를 들어
RigidBody -> 6 DOF
Hinge Joint -> 일부 병진/회전 자유도 제한
Fixed Joint -> 상대적인 운동 대부분 제한
이라는 구조가 된다.
따라서 Joint의 본질은
자유도 -> 제한 -> 원하는 운동만 허용
이다.
물리 기반 캐릭터
물리 기반 캐릭터는 캐릭터의 움직임을 단순히 Transform을 직접 변경하는 방식이 아니라 힘, 속도, 충돌, 제약 조건 등을 통해 만들어내는 방식이다.
기본적인 구조는
입력 -> 목표 이동 -> 힘/충격량 -> Rigidbody -> 충돌/접촉 -> Solver -> 캐릭터 이동
이다.
예를 들어 캐릭터가 오른쪽으로 움직이려 한다면
입력 -> 목표 속도 계산 -> 현재 속도와 비교 -> 필요한 힘 계산 -> Rigidbody에 적용
하는 방식으로 만들 수 있다.
이 방식은
경사면
충돌
밀기
점프
외부 힘
등과 자연스럽게 상호작용하기 쉽다.
반면 일반적인 캐릭터 컨트롤러는
입력 -> 위치/속도 직접 제어
하는 방식으로 더 강한 게임플레이 제어력을 얻을 수 있다.
따라서 물리 기반 캐릭터가 항상 더 좋은 것은 아니다.
캐릭터 물리에서 중요한 문제
물리 기반 캐릭터는 현실적인 물리만 적용하면 조작감이 나빠질 수 있다.
예를 들어
힘만 적용 -> 가속 -> 관성 -> 미끄러짐
이 발생한다.
게임에서는 원하는 조작감을 얻기 위해
목표 속도
가속도 제한
최대 속도
공중 제어
지면 마찰
점프 충격량
등을 별도로 설계해야 한다.
즉
물리 시뮬레이션 + 게임플레이 제어
의 균형이 필요하다.
차량 물리
차량 물리는 일반적인 Rigidbody 하나만으로 구현하기 어렵다.
차량은
차체
바퀴
서스펜션
타이어
구동력
브레이크
조향
등의 상호작용으로 움직인다.
기본 구조는
입력 -> 조향/가속/브레이크 -> 타이어 힘 -> 차체 Rigidbody -> 차량 운동
이다.
차량의 서스펜션
차량의 바퀴는 차체와 직접 고정된 것이 아니라 서스펜션을 통해 움직인다.
단순화하면
스프링 + 댐퍼
구조로 볼 수 있다.
변위 -> Spring Force
상대 속도 -> Damping Force
따라서
F_suspension = -kx - cv
형태의 모델을 사용할 수 있다.
서스펜션이 압축되면
압축 -> 스프링 반발력 증가
하고,
빠르게 압축되거나 늘어나면
속도 -> 감쇠력
이 발생한다.
차량의 타이어 힘
차량의 실제 움직임에서 중요한 것은 타이어와 지면 사이의 힘이다.
타이어에서는 크게
종방향 힘 -> 가속/제동
횡방향 힘 -> 조향/선회
을 생각할 수 있다.
차량의 속도와 바퀴의 회전 상태가 일치하지 않으면 타이어와 지면 사이에 미끄러짐이 발생한다.
대표적인 개념이
Slip
이다.
따라서 차량 물리는 단순히
엔진 힘 -> 차체 이동
이 아니라
엔진/브레이크 -> 바퀴 회전 -> 타이어 접촉 -> 마찰력 -> 차체 운동
으로 연결된다.
퐁의 법칙
퐁의 법칙(Pong’s Law)은 실제 물리 법칙이 아니다.
게임 개발에서 흔히 사용되는 농담성 표현으로, 탁구 게임 Pong의 공이 튕기는 방식처럼 단순한 반사/충돌 규칙을 설명하는 맥락에서 사용될 수 있다.
물리학에서 일반적으로 사용하는 공식이나 법칙인 것처럼 취급하면 안 된다.
충돌 반사 자체를 물리적으로 표현하면 표면 법선 n과 입사 속도 v를 이용하여 반사 속도를 계산할 수 있다.
완전 탄성 반사를 단순화하면
v' = v - 2(v · n)n
이다.
예를 들어 벽의 법선이 위쪽을 향하고 공이 아래쪽으로 들어왔다면 법선 방향 속도 성분이 반전된다.
입사 속도 -> 법선/접선 분해 -> 법선 성분 반전 -> 반사 속도
실제 게임에서는 여기에
반발 계수
마찰
충돌 질량
등을 추가하여 더 현실적인 충돌을 구현할 수 있다.
물리 엔진의 전체 흐름
게임 물리의 전체 구조를 하나로 연결하면 다음과 같다.
입력/외력 -> Rigidbody 상태 -> Broad Phase -> Narrow Phase -> Contact -> Constraint -> Solver -> Integration -> 새로운 Rigidbody 상태
충돌을 좀 더 자세하게 보면
Collider -> Broad Phase -> 충돌 후보 -> Narrow Phase -> 충돌점/법선/침투량 -> Contact -> 충격량 -> Solver -> 속도/회전 수정
Joint까지 포함하면
Rigidbody -> Joint -> Constraint -> Solver -> 제약 조건 만족
이다.
핵심 정리
물리 엔진 -> 물리 법칙을 실시간으로 근사하여 계산
Rigidbody -> 물체의 질량/위치/속도/회전 등의 물리 상태
Collider -> 충돌 검출용 형상
Render Mesh != Collider
Broad Phase -> 충돌 후보를 빠르게 선별
Narrow Phase -> 실제 충돌을 정밀하게 계산
Contact -> 접촉점/법선/침투량 등의 접촉 정보
Constraint -> 물리적으로 지켜야 하는 조건
Solver -> Constraint를 만족하도록 물리 상태 수정
Joint -> Rigidbody 사이의 운동을 제한하는 Constraint
3D 강체 -> 6 DOF
Joint -> 자유도 제한
물리 기반 캐릭터 -> 입력 -> 힘/충격량 -> Rigidbody -> Solver -> 움직임
차량 물리 -> 차체 + 서스펜션 + 타이어 + 구동/제동 + 조향
서스펜션 -> Spring-Damper
타이어 -> 종방향 힘 + 횡방향 힘 + 마찰
퐁의 법칙 -> 실제 물리 법칙이 아닌 게임적 표현
반사 속도 -> v' = v - 2(v · n)n
가장 중요한 전체 구조는 다음과 같다.
Rigidbody + Collider -> Broad Phase -> Narrow Phase -> Contact -> Constraint -> Solver -> Integration -> Physics State
그리고 게임 물리의 본질은 물체를 단순히 움직이는 것이 아니라, 물체가 만족해야 하는 물리적 제약을 정의하고 Solver를 통해 그 제약을 만족시키는 것이다.
충돌은 그중 하나의 제약이고, Joint 역시 또 다른 제약이다.
충돌 -> 접촉 제약
바닥 -> 침투 금지 제약
Joint -> 상대 운동 제한 제약
마찰 -> 접선 방향 운동 제한
이 관점으로 보면 게임 물리 엔진의 구조가 하나로 연결된다.