게임을 만들다 보면 황당한 일이 벌어지기도 합니다. 분명히 벽을 향해 총을 쐈는데 총알이 벽을 그대로 통과해 버리는 일이죠. 충돌 처리를 구현할 때 프로그래머가 가장 자주 겪는 난관 중 하나입니다.

처음에는 코드를 잘못 짰나 싶어 당황스러울 수 있습니다. 하지만 이는 코드 오류라기보다 컴퓨터가 충돌을 감지하는 방식 때문에 생기는 문제입니다. 우리가 화면에서 보는 부드러운 움직임은 사실 끊어진 사진들의 연속이니까요.

빠른 물체가 벽을 뚫는 이유 터널링

일반적인 충돌 판정은 멈춰 있는 장면을 기준으로 합니다. 이전 프레임의 위치와 현재 프레임의 위치만 보고 겹쳤는지를 판단하죠. 그래서 아주 빠르게 움직이는 물체는 문제가 생깁니다.

총알이 한 프레임 사이에 벽 앞쪽에서 벽 뒤쪽으로 이동했다고 가정해 보죠. 컴퓨터는 두 위치 모두 벽과 겹치지 않았으니 충돌이 없다고 판단합니다. 마치 물체가 벽을 뚫고 텔레포트한 것처럼 보이죠.

총알이 벽을 뚫고 지나간다면 터널링과 CCD를 확인하세요

이러한 현상을 터널링(Tunneling)이라고 부릅니다. 물체의 이동 속도가 물체의 크기보다 클 때 주로 발생합니다. 작고 빠른 발사체를 다룰 때 이 현상은 프로그래머를 골치 아프게 만듭니다.

이동 경로를 채우는 스웹트 셰이프

이 문제를 해결하기 위해 스웹트 셰이프(Swept Shape)라는 개념을 사용합니다. 물체가 지나온 자리를 빈 공간으로 두지 않는 방법입니다. 이전 위치에서 현재 위치까지를 쭉 이어서 하나의 덩어리로 만드는 것이죠.

공 모양의 물체라면 이동 경로를 따라 긴 캡슐 모양을 만든다고 생각하면 쉽습니다. 이렇게 만들어진 부피가 벽과 닿았는지 검사하면 중간에 건너뛴 충돌도 잡아낼 수 있습니다. 꽤 합리적인 접근 방식입니다.

하지만 이 방법도 완벽하지는 않습니다. 물체가 직선으로만 움직인다고 가정하기 때문입니다. 회전하거나 곡선으로 움직이는 경우에는 여전히 정확도가 떨어질 수 있습니다.

시간을 되감아 충돌을 찾는 CCD

더 정밀한 충돌 처리가 필요하다면 연속 충돌 감지(CCD, Continuous Collision Detection)를 도입해야 합니다. CCD는 지금 겹쳤는지를 묻지 않습니다. 대신 언제 처음 닿았는지를 계산합니다.

여기서 중요한 개념이 충돌 시점(TOI, Time of Impact)입니다. 물체가 이동을 시작해서 끝날 때까지의 시간을 연속적으로 살피는 것입니다. 그 시간 사이 어딘가에서 접촉이 일어난 정확한 타이밍을 찾아냅니다.

이렇게 하면 물체가 아무리 빨라도 충돌을 놓치지 않습니다. 벽을 뚫고 지나가기 전에 정확한 위치에서 멈추거나 튕겨 나가게 만들 수 있습니다.

CCD를 구현하는 두 가지 접근

CCD를 구현하는 방법은 다양하지만 목표는 같습니다. 보수적 전진(Conservative Advancement) 같은 기법은 물체를 조금씩 앞으로 보내며 안전을 확인합니다. 충돌 직전까지 조심스럽게 접근하는 방식이죠.

수학적인 계산을 통해 충돌 시간을 구하는 방법도 있습니다. 이동 자체를 하나의 광선 문제로 바꿔서 언제 닿는지 계산하는 것이죠. 공간의 문제가 아닌 시간의 문제로 접근한다는 점이 중요합니다.

성능과 정확도 사이의 균형

그렇다고 모든 물체에 CCD를 적용하는 것은 좋지 않습니다. 계산 비용이 많이 들기 때문입니다. 수많은 파편이나 느린 캐릭터에게까지 이 기술을 쓰면 게임이 느려질 수 있습니다.

그래서 보통은 총알이나 미사일처럼 작고 빠른 중요 물체에만 선별적으로 사용합니다. 프로그래머는 언제나 성능과 리얼리티 사이에서 조율해야 합니다.

이 기술들을 적절히 섞어 쓰면 플레이어는 게임 속 물리 법칙을 신뢰하게 됩니다. 벽을 뚫는 총알이 사라질 때 비로소 게임 세계는 진짜처럼 느껴지니까요.

제목 영역
이미지