전투 기하학: 히트박스, 허트박스, 푸시박스
비디오 게임의 전투 시스템에서 플레이어가 화면을 통해 목격하는 그래픽 연출은 물리 엔진이 내부적으로 연산하는 충돌 데이터와 직접적으로 일치하지 않습니다. 수만 개의 폴리곤 면으로 구성되고 흩날리는 옷자락과 복잡한 손가락 관절을 지닌 정교한 3D 캐릭터 모델을 매 프레임마다 있는 그대로 물리 충돌 연산에 투입하는 것은 컴퓨팅 자원 측면에서 불가능에 가깝습니다. 현대 게임 엔진은 시각적 렌더링과 기하학적 충돌 감지를 철저히 분리(Decoupling)하여, 보이지 않는 단순화된 경계 볼륨을 구축함으로써 공격의 명중, 대미지 판정, 캐릭터의 공간 점유를 판정합니다.
전투 메커니즘을 안정적이고 직관적으로 제어하기 위해, 게임 엔진은 캐릭터의 충돌 영역을 세 가지 기능적 볼륨으로 구분합니다.
+-------------------------------------------------------------------------+
| 전투 충돌 판정 3요소 |
+-------------------------------------------------------------------------+
| 1. HITBOX (히트박스 / 공격 유효 볼륨) |
| - 검을 휘두르거나 주먹을 내지르는 유효 공격 프레임 동안에만 활성화 |
| - 3차원 공간을 탐색하여 교차하는 피격 가능 대상을 감지 |
| - 대미지 적용, 히트스탑(역경직), 넉백 물리 충격량을 발생시킴 |
+-------------------------------------------------------------------------+
| 2. HURTBOX (허트박스 / 피격 취약 볼륨) |
| - 캐릭터의 스켈레톤 본(머리, 몸통, 사지)에 부착 |
| - 캐릭터 모션에 맞춰 회전 및 변환 매트릭스를 실시간으로 갱신 |
| - 수동적 수용체: 외부 히트박스가 침투하거나 겹칠 때 피격 판정 수신 |
+-------------------------------------------------------------------------+
| 3. PUSHBOX / 환경 콜라이더 (고체 물리 차단 볼륨) |
| - 주로 수직 캡슐(Capsule), 원기둥 또는 단순 박스 형태 |
| - 지형(바닥, 벽면, 경사로, 장애물)과의 접촉 및 이동 차단 처리 |
| - 캐릭터 간의 겹침 현상이나 지형을 뚫고 떨어지는 낙하 방지 |
+-------------------------------------------------------------------------+
공간적 분리의 구조적 필연성
만약 게임이 단 하나의 통합 충돌체로 모든 상호작용을 처리하려 한다면 전투 밸런스는 완전히 붕괴됩니다.
- 환경 충돌용 캡슐이 대미지까지 담당할 경우, 팔을 넓게 벌리거나 도약할 때 빈 공간을 스치는 공격에도 피격 판정이 발생하여 납득하기 어려운 결과를 초래합니다.
- 무기가 캐릭터와 물리 차단 속성을 공유한다면, 대검을 휘둘렀을 때 적의 외곽 물리 경계에 부딪히는 순간 칼날이 튕겨 나가 적의 몸을 베어 넘기는 호쾌한 공격 모션이 성립하지 않습니다.
- 히트박스(공격체), 허트박스(피격체), 푸시박스(물리 차단체)를 명확히 분리함으로써, 엔진은 충돌 응답 채널(Collision Response Channels)을 독립적으로 구성하여 특정 채널에는 겹침 이벤트(Overlap)를 발생시키고 지형에는 차단(Block)을 유지할 수 있습니다.
2단계 충돌 파이프라인: 브로드 페이즈 vs 내로우 페이즈
수많은 적과 마법 투사체, 물리 소품이 동시에 뒤섞이는 대규모 액션 게임에서 매 프레임마다 모든 충돌체끼리 전수 교차 검사를 수행한다면 연산량은 $O(N^2)$로 폭증합니다. 씬 내에 100개의 물리 오브젝트가 존재할 경우, 단순 무차별 대입 방식은 틱당 다음과 같은 검사를 요구합니다.
$$\frac{100 \times 99}{2} = 4,950 \text{ 회의 쌍별 교차 검사}$$
60Hz 혹은 144Hz에 달하는 고주사율 물리 루프를 유지하기 위해, 물리 엔진(PhysX, Chaos, Havok 등)은 공간 충돌 질의를 순차적인 두 단계로 나누어 처리합니다.
[ 씬 내부의 모든 동적 및 정적 엔티티 ]
|
v
+-----------------------------------------------------------+
| 브로드 페이즈 (Broad Phase): 광역 공간 분할 단계 |
| - 축 정렬 바운딩 박스(AABB) 활용 |
| - 바운딩 볼륨 계층 구조(BVH), 옥트리, Sweep & Prune 탐색 |
| - 충돌 가능성이 전혀 없는 쌍의 95% ~ 99%를 즉각 배제 |
+-----------------------------------------------------------+
|
| (잠재적 겹침 가능성이 있는 후보 쌍만 전달)
v
+-----------------------------------------------------------+
| 내로우 페이즈 (Narrow Phase): 정밀 기하 교차 연산 단계 |
| - 선별된 후보에 대해 실제 기본도형(구, 캡슐, OBB) 테스트 |
| - 분리축 정리(SAT) 또는 GJK 거리 알고리즘 연산 수행 |
| - 정밀 접촉점 좌표, 법선 벡터, 침투 깊이 계산 |
+-----------------------------------------------------------+
|
v
[ 게임 로직 이벤트 발송: 피격 대미지, 넉백 임펄스 적용 ]
1. 브로드 페이즈의 공간 분할 가속
브로드 페이즈에서는 복잡한 캐릭터 형태를 완전히 배제합니다. 대신 모든 오브젝트를 월드 좌표축 $(X, Y, Z)$과 완벽히 평행한 **축 정렬 바운딩 박스(Axis-Aligned Bounding Box, AABB)**로 감쌉니다. 두 AABB의 겹침 여부는 최소값과 최대값의 단순 대소 비교만으로 판정됩니다.
$$\text{Overlap} \iff (A_{\min}^x \le B_{\max}^x \land A_{\max}^x \ge B_{\min}^x) \land (A_{\min}^y \le B_{\max}^y \land A_{\max}^y \ge B_{\min}^y) \land (A_{\min}^z \le B_{\max}^z \land A_{\max}^z \ge B_{\min}^z)$$
바운딩 볼륨 계층 구조(BVH), 옥트리(Octree), Sweep and Prune과 같은 트리 자료구조를 통해 엔진은 공간상 가까운 오브젝트들을 계층 노드로 묶어 관리합니다. 플레이어가 휘두른 검의 바운딩 박스가 원거리에 위치한 적 그룹의 부모 노드와 교차하지 않는다면, 엔진은 단 한 번의 연산으로 하위 수십 개 오브젝트와의 검사를 건너뛰어 복잡도를 $O(N^2)$에서 $O(N \log N)$ 혹은 거의 선형인 $O(N)$ 수준으로 낮춥니다.
2. 내로우 페이즈의 정밀 기하 해법
브로드 페이즈를 통과한 후보 쌍들만이 내로우 페이즈로 전달되어 엄밀한 기하학적 교차 검사를 받습니다.
- 구(Sphere) vs 구(Sphere): 3차원에서 가장 연산 속도가 빠른 검사입니다. 두 중심점 사이의 거리 제곱이 두 반지름 합의 제곱 이하인지 확인하는 것만으로 충분합니다 $(|C_1 - C_2|^2 \le (R_1 + R_2)^2)$.
- 캡슐(Capsule) vs 캡슐(Capsule): 내부의 두 뼈대 선분 사이의 최단 유클리드 거리를 산출한 뒤 반지름 합과 비교합니다. 인간의 팔다리 형태와 가장 자연스럽게 일치하므로 캐릭터 허트박스의 표준 기하 구조로 사용됩니다.
- 방향성 바운딩 박스(OBB) 및 볼록 다면체(Convex Hull): 분리축 정리(SAT) 또는 GJK 알고리즘을 활용합니다. 투영 시 겹치지 않는 분리 평면을 단 하나라도 발견할 수 있다면 두 물체는 접촉하지 않은 것으로 판정됩니다.
실시간 전투에서 수만 개의 폴리곤 삼각형을 직접 교차 검사하는 방식(Per-Polygon Mesh)은 엄격히 배제됩니다. 애니메이션으로 변형되는 고밀도 메시 간의 교차 검사는 CPU 물리 스레드를 순식간에 고갈시켜 극심한 스터터링을 유발하기 때문입니다.
이산 충돌 감지와 연속 충돌 감지(CCD): 터널링(Tunneling) 발생 원리
액션 게임에서 가장 흔하게 관찰되는 판정 결함은 물체가 목표물을 뚫고 지나가는 터널링(Tunneling) 현상입니다. 고속으로 이동하는 투사체나 칼날이 두 물리 프레임 사이에서 대상의 판정 영역을 완전히 건너뛰어 충돌이 감지되지 않는 현상을 의미합니다.
터널링의 수학적 메커니즘
대부분의 물리 엔진은 기본적으로 이산 충돌 감지(Discrete Collision Detection) 방식으로 작동합니다. 이산 모드에서는 시간 간격 $\Delta t$ 단위의 정적 시점에서만 물체의 좌표를 평가합니다.
프레임 N (시간 = t): 프레임 N+1 (시간 = t + dt):
[ 탄환 / 칼날 ] --- 속도 v ---> [ 탄환 / 칼날 ]
o o
(x=10 위치) (x=60 위치)
| 대상 방패 / 적 몸체 |
| [x=30..35] |
속도 $v$로 움직이는 물체의 단일 물리 스텝 이동 거리는 다음과 같습니다.
$$\Delta x = v \cdot \Delta t$$
만약 대상 장애물의 두께 $W_{\text{target}}$와 이동 물체의 직경 $D_{\text{proj}}$의 합이 이 단일 프레임 이동 거리보다 작다면:
$$W_{\text{target}} + D_{\text{proj}} < v \cdot \Delta t$$
프레임 $N$ 시점에서 물체는 장애물 앞쪽에 위치하고, 다음 프레임 $N+1$에서는 이미 장애물 뒤쪽으로 통과해 있습니다. 이산 엔진은 표본 추출 순간의 기하학적 겹침만을 검사하므로, 두 검사 시점 모두에서 충돌체 간의 겹침이 존재하지 않습니다. 탄환이나 칼날은 마치 대상이 투명한 것처럼 목표를 뚫고 지나가 버립니다.
연속 충돌 감지(CCD)의 구현 방식
고속 탄환, 투척 무기, 빠르게 휘둘러지는 무기 끝부분의 터널링을 방지하기 위해 엔진은 **연속 충돌 감지(Continuous Collision Detection, CCD)**를 적용합니다.
+----------------------------------------------------------------------------+
| CCD 구현 방식 |
+----------------------------------------------------------------------------+
| 1. 스위프 기반 CCD (Sweep-based CCD / 체적 압출 방식) |
| - 이동 속도 벡터를 따라 기하 도형을 연속 궤적으로 늘려 스위프 체적 형성 |
| - 시간 구간 [0, dt] 내에서 장애물과의 연속적 기하 교차 방정식을 해결 |
| - 정확한 충돌 시점(Time of Impact, TOI ∈ [0, 1]) 및 법선 벡터 산출 |
| - 한계: CPU 연산 부하가 매우 커 대규모 오브젝트 동시 적용 시 성능 저하 |
+----------------------------------------------------------------------------+
| 2. 예측형 CCD (Speculative CCD / 예측 팽창 방식) |
| - 예상 속도에 기반하여 브로드 페이즈에서 AABB 박스를 전방으로 팽창 확장 |
| - 물리적 겹침이 발생하기 전에 사전 접촉 구속을 생성하여 진입 속도 제한 |
| - 장점: 스위프 방식에 비해 연산량이 훨씬 적어 CPU 부하가 낮음 |
| - 한계: 궤적이 급변할 때 허공에 튕겨 나가는 고스트 충돌 오류 발생 가능 |
+----------------------------------------------------------------------------+
속도감이 중요한 FPS 게임에서는 탄환에 물리 강체를 부여하지 않고 **라인 트레이스 / 레이캐스트(Line Trace / Raycast)**를 활용한 즉발 히트스캔(Hitscan)을 주로 사용합니다. 발사 순간 총구에서 목표 벡터 방향으로 무한소의 수학적 선분을 투사하여 관통된 허트박스를 즉시 검출함으로써 연산 부하를 최소화하면서도 완벽하게 터널링을 차단합니다.
시각적 모델과 물리적 판정 간 괴리의 근본 원인
"분명히 베었는데 맞지 않았다"거나 "반 미터 밖 허공을 베었는데 대미지를 입었다"는 불만은 시각적 그래픽 연출과 물리 기하학 간의 본질적인 기술적 격차에서 발생합니다.
1. 캡슐 근사와 복잡한 인체 윤곽 간의 불일치
시각 모델은 섬세한 근육 윤곽, 갑옷 장식, 휘날리는 망토를 지니고 있지만, 대미지를 받는 허트박스는 뼈대에 연결된 소수의 단순한 캡슐 콜라이더들의 조합으로 구성됩니다.
개발팀은 다음의 상충 관계에서 하나를 선택해야 합니다.
- 타이트한 허트박스(모델보다 작음): 불합리한 외곽 피격을 방지하지만, 망토나 어깨 갑옷 가장자리를 스쳤을 때 분명히 맞았는데 빗나가는 시각적 위화감을 줍니다.
- 넉넉한 허트박스(모델보다 큼): 몸을 스치는 아슬아슬한 공격을 확실하게 명중 처리하지만, 회피 도중 눈에 띄는 '공기칼'에 피격당하는 불쾌감을 줍니다.
2. 애니메이션 블렌딩과 루트 모션(Root Motion)의 비동기화
현대 캐릭터 동작은 복잡한 블렌드 트리(Blend Tree)를 기반으로 작동합니다. 강공격 충전 도중 긴급 회피로 캔슬할 때, GPU 버텍스 셰이더는 수백 밀리초에 걸쳐 여러 동작의 메시 형태를 부드럽게 보간합니다.
그러나 허트박스 좌표는 본 소켓 매트릭스에 종속되어 갱신됩니다. 만약 애니메이션 전환 속도와 물리 이동 속도 간에 미세한 불일치가 발생하거나 루트 모션 처리가 지연될 경우, 화면에 보이는 시각적 캐릭터와 내부의 충돌 캡슐이 일시적으로 분리되는 현상이 발생합니다.
3. 디스조인트 히트박스(Disjoint Hitbox)와 잔류 판정 프레임(Linger Frames)
격투 게임과 액션 게임에서 개발자들은 의도적으로 칼날의 시각적 범위보다 훨씬 바깥쪽까지 공격 판정을 연장하는 디스조인트 히트박스를 배치하거나, 무기를 휘두른 후 거두는 동작에서도 몇 프레임 동안 대미지 판정을 남겨두는 잔류 프레임을 설정합니다.
이는 인간의 신경 반응 지연을 보정하고, 공중 공격이 웅크린 적에게 안정적으로 도달하도록 보장하기 위한 의도적인 게임 디자인 장치입니다. 정지된 스크린샷에서는 비현실적으로 보이지만, 동적인 조작 환경에서는 훨씬 만족스러운 타격감을 선사합니다.
4. 시각 효과(VFX)는 물리적 실체를 갖지 않음
무기를 휘두를 때 발생하는 거대한 불꽃 궤적, 마법 파티클, 총구 화염은 오직 GPU 렌더링 파이프라인에서만 처리되는 장식용 그래픽 효과입니다. 프로그래머가 이펙트의 궤적에 맞춰 별도의 히트박스를 직접 바인딩하지 않는 한, 화려한 이펙트의 끝자락을 스치더라도 물리 엔진은 아무런 대미지를 발생시키지 않습니다.
핵심 충돌 감지 모드 비교 매트릭스
주요 충돌 감지 아키텍처의 연산 비용과 터널링 방지 특성을 비교하면 다음과 같습니다.
| 충돌 감지 모드 | 연산 비용 | 정적 지형 터널링 방지 | 동적 캐릭터 터널링 방지 | 일반적 적용 사례 | 주요 한계 및 결함 요인 |
|---|---|---|---|---|---|
| 이산 감지 (Discrete) | 매우 낮음 (프레임당 단순 교차) | 고속 이동 시 취약 | 고속 이동 시 취약 | 기본 캐릭터 보행, 대형 배경 건축물, 느린 몬스터 | FPS 저하 시 관통 악화; 얇은 벽면을 쉽게 뚫고 통과함 |
| 스위프 기반 CCD (Sweep) | 매우 높음 (시공간 연속 궤적 연산) | 완벽히 차단 | 양측 모두 활성화 시 차단 | 고속 냉병기 칼끝, 투척 창, 고속 차량 충돌 | 다수 충돌체 상호작용 시 CPU 과부하로 인한 프레임 드랍 유발 |
| 예측형 CCD (Speculative) | 중간 (AABB 전방 팽창) | 대폭 억제 | 대폭 억제 | 래그돌 물리, 부서지는 환경 잔해물 | 이동 궤적이 급변할 때 공중에서 튕겨 나가는 고스트 충돌 위험 |
| 레이캐스트 (Line Trace) | 낮음 ($O(1)$ 선분 교차) | 투사 경로상 완벽 차단 | 투사 경로상 완벽 차단 | 히트스캔 총기 사격, 지면 흡착 감지, 시야선 체크 | 부피가 없는 무한소 선분이므로 인접 캡슐 간의 미세한 틈새를 통과할 수 있음 |
엔진 내장 진단 도구 및 실기 분석 방법
공격 판정의 이상 현상을 분석할 때 육안에만 의존하는 것은 부정확한 결론으로 이어지기 쉽습니다. 개발자 콘솔이 제공되는 타이틀에서는 엔진 내장 시각화 도구를 통해 실제 물리 볼륨을 직접 확인할 수 있습니다.
1. 엔진 콘솔을 통한 기하 볼륨 시각화
언리얼 엔진 (Unreal Engine 4 / 5)
콘솔창(~ 키 등)을 열고 다음 명령어를 입력하여 충돌 볼륨을 화면에 렌더링합니다.
show collision # 활성화된 모든 정적 및 동적 충돌 와이어프레임 표시
show CollisionPawn # 캐릭터 허트박스 캡슐만 필터링하여 표시
pxvis collision # PhysX / Chaos 저수준 물리 와이어프레임 강제 표시
- 청록색 / 녹색 와이어프레임: 일반적인 패시브 충돌체(캡슐, 구체, 박스).
- 빨간색 / 보라색 와이어프레임: 현재 프레임에서 활성화된 공격 판정 형상(Hitbox).
소스 / 소스 2 엔진 (Source Engine)
밸브의 소스 엔진 기반 멀티플레이어 환경에서는 서버 측 역보정 박스를 확인할 수 있습니다.
sv_showlagcompensation 1 # 서버가 명중 판정을 계산할 때 시간 역보정한 실제 판정 박스 표시
r_drawclipbrushes 1 # 맵 내의 투명 공기벽(클립 브러시) 표시
2. 판정 결함 3단계 원인 규명 절차
공격이 부자연스럽게 빗나갔을 경우 다음 순서로 원인을 규명합니다.
- 1단계: 순간 프레임 레이트 및 물리 주파수 저하 확인
- 교전 순간 프레임이 급락(예: 60FPS에서 20FPS로 저하)했는지 확인합니다. 이산 물리 검사의 시간 간격 $\Delta t$가 급증하여 칼날이 적의 두께를 한 프레임에 뛰어넘는 터널링이 발생하기 쉽습니다.
- 2단계: 본과 콜라이더 간의 동기화 상태 점검
- 디버그 화면을 통해 공격 프레임 당시 허트박스 캡슐이 캐릭터의 시각적 포즈를 정확히 추종하고 있는지 확인합니다. 추종이 지연된다면 물리 엔진 오류가 아니라 애니메이션 루트 모션의 세팅 결함입니다.
- 3단계: 네트워크 지연 보상 메커니즘 분석 (멀티플레이 환경)
- 온라인 대전에서 관찰되는 대부분의 '판정 버그'는 사실 랙 보상(Lag Compensation)의 결과입니다. 로컬 클라이언트 화면에서는 명중했더라도, 권한을 가진 게임 서버가 시간을 되감아 계산했을 때 상대방이 이미 엄폐물 뒤로 들어간 상태였다면 서버가 명중을 기각하므로, 화면에는 피가 튀었지만 대미지는 적용되지 않습니다.
전투 판정의 불일치가 근본적인 충돌 기하학 설계의 문제인지, 네트워크 롤백 보상의 결과인지, 혹은 단순한 시각적 렌더링과의 괴리인지 객관적으로 판별하고자 할 때, 365Finds의 검증된 기술 아키텍처 분석 자료를 참고하면 "엔진 판정이 엉망이다"라는 식의 모호한 오해를 피하고 명확한 원인을 도출할 수 있습니다.