충돌 감지: 게임 속 물건들이 부딪혔는지 어떻게 알까?
충돌 감지: 게임 속 물건들이 부딪혔는지 어떻게 알까?
친구랑 술래잡기를 해 본 적 있나요? 술래가 내 몸을 손으로 탁 치면 "잡혔다!"가 되죠. 우리는 몸으로 그걸 바로 느낍니다. 하지만 컴퓨터 게임 속 캐릭터는 몸이 없어요. 그냥 화면 위의 그림일 뿐이죠.
그렇다면 게임은 어떻게 "지금 부딪혔다!"를 알까요? 컴퓨터가 계산해서 알아냅니다. 이 계산을 충돌 감지(Collision Detection)라고 불러요.
충돌 감지는 세 가지를 묻는 일
충돌 감지는 세 가지 질문에 답하는 일이에요.
- 부딪혔나? — 두 물건이 겹쳤는지 아닌지
- 언제 부딪혔나? — 정확히 어느 순간에 닿았는지
- 어디서 부딪혔나? — 몸의 어느 부분이 닿았는지
이 세 가지를 알아야 게임이 다음 행동을 정할 수 있어요. 공이 튕길지, 캐릭터가 아파할지, 벽에서 멈출지 말이죠.
당구공으로 이해해 보기
당구 게임을 생각해 봅시다. 하얀 공을 쳐서 빨간 공을 맞히는 게임이죠.

현실에서는 공이 닿으면 그냥 튕깁니다. 물리 법칙이 알아서 해 주니까요. 하지만 컴퓨터 속 당구공은 그냥 숫자예요. "공의 위치는 가로 10, 세로 20" 같은 숫자들이죠.
그래서 컴퓨터는 매 순간 이렇게 계산합니다.
"하얀 공 가운데와 빨간 공 가운데 사이 거리를 재 보자. 그 거리가 두 공의 반지름을 더한 값보다 짧으면? 겹쳤다는 뜻이야. 부딪힌 거지!"
참 간단하죠? 공은 동그라미라서 계산이 쉬워요. 하지만 세상 물건이 다 동그랗지는 않죠.
모양이 복잡하면 어떡하지?
사람 캐릭터를 떠올려 보세요. 팔, 다리, 머리, 손가락까지 울퉁불퉁합니다. 이 복잡한 모양을 그대로 계산하면 컴퓨터가 너무 힘들어해요.
그래서 개발자들은 꾀를 냅니다. 단순한 상자로 감싸기예요.
선물 상자를 떠올려 보세요. 안에 인형이 들었든 로봇이 들었든, 상자 두 개가 서로 멀리 떨어져 있으면 안에 있는 물건도 절대 닿을 수 없죠. 당연한 이야기예요.
컴퓨터도 똑같이 생각합니다. 먼저 상자끼리만 비교해요. 상자가 안 겹치면? 끝! 더 이상 계산 안 합니다. 상자가 겹칠 때만 자세히 들여다봐요.
이렇게 물건을 감싸는 상자를 바운딩 박스라고 불러요. "경계를 두른 상자"라는 뜻이에요.
히트박스: 게임 속 진짜 몸
격투 게임을 해 본 적 있나요? 주먹을 뻗어서 상대를 때리는 게임이죠. 여기서 히트박스가 등장합니다.

보통 게임에서는 상자를 두 종류로 나눠요.
- 몸 상자(초록색): "여기가 내 몸이야. 여길 맞으면 나 아파."
- 공격 상자(빨간색): "여기가 내 주먹이야. 여기에 닿으면 상대가 아파."
내 빨간 상자가 상대의 초록 상자에 닿는 순간! 게임은 "때렸다!"라고 판단하고 체력을 깎습니다.
재미있는 건, 이 상자들이 화면에는 안 보인다는 점이에요. 우리 눈에는 멋진 캐릭터 그림만 보이죠. 하지만 그 뒤에서는 보이지 않는 상자들이 열심히 일하고 있어요.

가끔 게임을 하다가 "어? 분명히 맞았는데 안 맞았대!" 하고 억울했던 적 없나요? 그건 화면 속 그림과 보이지 않는 상자가 살짝 어긋났기 때문일 수 있어요.
2차원과 3차원
충돌 감지는 크게 두 가지 세상에서 쓰여요.
2차원(2D)은 종이 위 세상이에요. 가로와 세로만 있어요. 옛날 마리오 게임처럼 옆에서 보는 게임이죠. 여기서는 네모끼리 겹치는지만 보면 됩니다.
3차원(3D)은 우리가 사는 진짜 세상 같아요. 가로, 세로에 깊이까지 있어요. 앞뒤로도 움직일 수 있죠. 계산할 게 하나 더 늘어나니 훨씬 복잡해집니다.
가장 어려운 문제: 총알이 벽을 뚫고 지나간다?
여기 진짜 골치 아픈 문제가 있어요. 이건 꼭 알아 두면 좋아요.
컴퓨터는 화면을 뚝뚝 끊어서 그립니다. 1초에 60번 정도요. 그러니까 물건의 위치도 뚝뚝 끊어서 계산해요.
아주 빠른 총알을 상상해 보세요. 첫 번째 순간에는 벽 앞에 있었어요. 두 번째 순간에는 벌써 벽 뒤로 넘어갔고요. 벽 안에 있던 순간이 한 번도 없어요!
그러면 컴퓨터는 "겹친 적 없네?" 하고 넘어갑니다. 총알이 벽을 뚫고 지나가 버리는 거예요. 이걸 터널링이라고 불러요. 마치 터널을 통과하듯 쑥 지나가서요.
어떻게 고칠까요? 총알의 위치만 보지 말고, 지나간 길을 봅니다. 첫 번째 위치와 두 번째 위치를 선으로 쭉 이어요. 그 선이 벽을 가로지르면? "아, 지나가면서 부딪혔구나!" 하고 알아채는 거죠.
이렇게 "언제 부딪혔는지"를 미리 계산하는 방식을 연속 충돌 감지라고 해요. 사진 몇 장이 아니라 영상처럼 이어서 본다는 뜻이에요.
물건이 아주 많으면?
게임에 물건이 100개 있다고 해 봐요. 모든 짝을 다 비교하면 몇 번이나 계산해야 할까요? 무려 4,950번이에요. 1,000개면? 50만 번에 가까워집니다. 컴퓨터가 지쳐 버려요.
그래서 공간을 방으로 나누는 꾀를 씁니다.
학교 운동장을 바둑판처럼 칸으로 나눈다고 생각해 보세요. 1번 칸에 있는 아이가 9번 칸에 있는 아이와 부딪힐 수 있을까요? 없죠. 너무 멀어요.
컴퓨터도 똑같이 합니다. 세상을 칸으로 나누고, 같은 칸이나 옆 칸에 있는 물건끼리만 비교해요. 그러면 계산이 확 줄어들어요.
충돌 감지는 두 단계로 일한다
정리하면 이래요. 충돌 감지는 두 단계로 일합니다.
1단계는 대충 거르기예요. 상자와 칸을 이용해서 "얘네는 절대 안 부딪혀" 하는 짝들을 빠르게 빼 버립니다. 계산이 아주 빨라요.
2단계는 꼼꼼히 보기예요. 1단계를 통과한 몇 안 되는 짝만 진짜 모양으로 정확하게 계산합니다. 느리지만 정확해요.
왜 이렇게 나눌까요? 도서관에서 책을 찾는 것과 같아요. 먼저 "과학 책장"으로 가고(대충 거르기), 그다음 그 책장에서 제목을 하나씩 봅니다(꼼꼼히 보기). 처음부터 도서관 전체 책을 한 권씩 뒤지지는 않죠.
어디에 쓰일까?
충돌 감지는 게임에만 쓰이는 게 아니에요.
- 게임: 총알이 적을 맞혔는지, 캐릭터가 벽에 막혔는지
- 로봇: 로봇 팔이 사람이나 기계를 치지 않도록
- 애니메이션: 옷이 몸을 뚫고 나가지 않도록
- 자동차 안전 시험: 진짜 차를 부수기 전에 컴퓨터로 미리 충돌 실험
수학과 컴퓨터가 만나서 만든 아주 실용적인 기술이에요.
마무리
다음에 게임을 할 때 한번 생각해 보세요. 내 캐릭터가 벽에 부딪혀 멈출 때, 컴퓨터는 1초에 60번씩 "겹쳤나? 안 겹쳤나?"를 묻고 있어요.
기억할 세 가지만 짚어 볼게요.
- 충돌 감지는 부딪혔나 · 언제 · 어디서를 알아내는 계산이다.
- 복잡한 모양은 단순한 상자로 감싸서 빠르게 거른다.
- 빠른 물체는 지나간 길까지 봐야 벽을 뚫지 않는다.
보이지 않는 상자들이 오늘도 게임 속에서 열심히 일하고 있습니다.
출처
리깅 파이프라인 자동화 도구
반복 작업은 스크립트에게. 현업에서 쓰는 리깅 툴 모음.
리깅 도구 보기