본문 바로가기
게임개발뜯어보기

물속으로 도망가면 왜 총알이 안 닿을까 - 항력과 히트스캔

by 조생 2026. 9. 17.

총격전 중에 물속으로 뛰어들면 총알이 안 닿는 게임이 많습니다. 2023년 12월 한 배틀로얄 게임에서 스트리머가 물속 상대에게 총알을 퍼부어도 안 죽는다고 항의하자, 그 게임의 빌드 엔지니어는 의도한 동작이라고 답했습니다. 반대로 물속에서 총이 아예 안 나가게 잘라 둔 게임도 있습니다.

이건 게임이 지어낸 규칙이 아닙니다. 현실에서도 물속에선 총알이 금방 힘을 잃습니다.

영상판 — 영상의 수조와 총알은 언리얼 엔진에 직접 짠 촬영 리그이고, 총알은 엔진 물리 없이 이 글의 식으로 프레임마다 적분했습니다. 그래프와 수치는 전부 우리 랩의 값입니다

왜 이런 게 생겼나

총알을 밀어내는 힘은 공기 저항과 같은 이차 항력입니다. 감속은 감속 계수 k 곱하기 속력 제곱이고, k 는 매질의 밀도·항력 계수·단면적에 비례하고 총알 질량에 반비례합니다. 공기의 밀도는 1.2 kg/m³, 물은 1000 kg/m³이니 물속에서는 같은 총알이 833배 큰 저항을 받습니다.

9 mm 권총탄급 총알(8 g, 지름 9 mm, 400 m/s, 코가 앞을 보는 상태의 항력 계수 0.35)이 50 m/s 로 떨어지기까지 가는 거리는 공기에서 1,245 m, 물에서 1.49 m 입니다. 물에 꽂히는 순간의 감속은 중력가속도의 22,700배 입니다.

50 m/s 는 피부를 못 뚫는 속력 근처로 우리가 정한 문턱이지, 총알이 거기서 멈춘다는 뜻은 아닙니다. 빠른 총알은 물속에서 뒤로 공기 주머니를 끌고 가는데, 우리 모형에서는 이 문턱 밑에서 주머니가 꺼지고 총알이 뒤집혀 조금 더 기어가다 가라앉습니다. 게임이 물속 총알을 다루는 방식은 이 곡선을 어떻게 흉내 내느냐, 아예 무시하느냐로 갈립니다.

같은 식에 밀도만 833배 — 왼쪽 공기 곡선은 50 m/s 까지 1,245 m, 오른쪽 물 곡선은 1.49 m 입니다. 모양은 같고 가로축 눈금만 다릅니다

물속 1 m 에서 속력의 3/4 이 사라진다

이 식을 그대로 풀어 낸 답을 닫힌 해라고 합니다. 속력은 거리에 대해 지수로, 시간에 대해서는 1/(1 + k v0 t) 꼴로 줄어듭니다(v0 는 처음 속력). 우리 총알은 물속 1 m 만에 400 m/s 에서 99 m/s 로, 속력의 3/4 을 잃습니다.

항력 계수를 얼마로 잡든 곡선 모양은 같고 눈금만 바뀝니다. 완전히 뒤집힌 총알(계수 1.0)은 50 m/s 까지 0.52 m, 소총탄급(4 g, 5.7 mm, 900 m/s, 계수 0.5)은 1.81 m 입니다. 실제 소총탄은 물속에서 뒤집히며 부서지니 이 값은 차수 확인용입니다.

한 실험 방송이 2005년에 잰 바로는 초음속 소총탄은 물 0.9 m 안에서 부서지고, 권총탄은 비살상 속력까지 최대 2.4 m 가 들었습니다(위키피디아 시즌 요약으로만 확인한 2차 자료). 우리 권총탄은 뒤집힌 뒤 기어가는 0.33 m 까지 더해 1.83 m 로, 실험 방송의 권총탄 최대치 2.4 m 안쪽입니다.

항력 계수와 탄종을 바꿔 본 막대 넷 — 50 m/s 까지 가는 물속 거리입니다. 파랑(계수 0.5)은 뒤집히기 시작한 총알, 맨 아래는 소총탄급이고, 세로선 둘은 실험 방송의 소총탄 0.9 m 와 권총탄 2.4 m 입니다

게임은 프레임마다 한 번 계산한다

게임은 이 식을 연속으로 풀지 않고 프레임마다 한 번, 60 fps 면 1/60 초마다 속도를 갱신합니다. 가장 단순한 갱신은 속도에서 k 곱하기 속도 제곱 곱하기 dt(프레임 시간)를 빼는 것입니다.

이 방식은 k 곱하기 속도 곱하기 dt 가 1 보다 작을 때만 안정합니다. 1 을 넘으면 한 프레임에 빼는 양이 지금 속도보다 커져 부호가 뒤집힙니다. 공기에서는 이 값이 0.011 이라 문제가 없지만, 물에서는 9.3 입니다. 첫 프레임에 속도가 400 m/s 에서 −3,311 m/s 로 뒤집혀, 총알이 물에 닿는 순간 뒤로 튀어 화면 밖으로 사라지는 버그가 됩니다.

고치는 법은 두 가지입니다. 한 프레임을 여러 토막으로 쪼개 적분하거나, 닫힌 해를 그대로 쓰는 것입니다. 닫힌 해는 속도를 1 + k v dt 로 나누는 것이라 dt 가 얼마든 부호가 안 바뀌고, 첫 프레임 끝 속력은 38.9 m/s 입니다. 토막 적분은 토막이 적으면 똑같이 터지고, 늘릴수록 이 값에 다가갑니다.

왼쪽 빨간 선(그냥 곱함)은 첫 프레임에 음수로 곤두박질치고 초록 선(닫힌 해)은 양수에 남습니다. 오른쪽 막대는 한 프레임을 쪼갠 토막 수마다 첫 프레임 끝 속력입니다

수면을 지나는 프레임은 그 점에서 쪼갠다

두 번째 문제는 매질이 바뀌는 순간입니다. 400 m/s 총알은 한 프레임(1/60 초)에 공기로 6.67 m 를 갑니다. 수면이 그 사이 어딘가에 있으면 게임은 그 프레임을 공기로 칠지 물로 칠지 정해야 합니다.

프레임 끝의 매질로 통째로 치면 둘 다 틀립니다. 물로 치면 총알은 아직 공중에 있는데 이미 38.9 m/s 로 느려져 물 밖에서 멈춥니다. 공기로 치면 6.67 m 를 물속으로 그대로 가서 수면 아래 대상을 관통합니다.

바른 방법은 수면과 만나는 점을 찾아 그 프레임을 두 토막으로 쪼개는 것입니다. 프레임 절반에서 입수한다면 앞 절반은 공기 식, 뒤 절반은 물 식으로 계산해 물속을 1.24 m 가고, 프레임 끝 속력은 70.9 m/s 가 됩니다.

수면을 지나는 한 프레임 — 왼쪽은 교점(노란 점)에서 공기와 물을 나눠 계산하고, 오른쪽은 한 매질로 통째로 쳐서 공중에서 멈추거나 물속을 그대로 뚫습니다

게임이 고르는 세 가지 방식

이 계산을 게임이 다 하는 건 아닙니다. 총알을 여러 프레임에 걸쳐 실제로 날리는 투사체와, 쏘는 프레임에 선을 한 번 그어 맞았는지 정하는 히트스캔에 따라 세 갈래로 나눌 수 있습니다.

  • 투사체를 적분한다. 위의 식을 프레임마다 돌리는 방식입니다. 우리 리그가 이렇게 하며, 특정 게임의 코드를 보고 적은 것은 아닙니다.
  • 히트스캔을 수면에서 끊는다. 판정 선을 수면에서 잘라 물속 대상은 맞지 않게 하는 방식입니다. 아래 셋째 항목의 SDK 에도 물속 대상을 빼는 플래그가 있지만 기본은 꺼져 있고, 특정 게임이 이 방식을 쓴다고 확인한 것은 아닙니다. 물을 아예 예외로 둔 게임은 있습니다. 한 밀리터리 게임의 야전 교범은 보통 총은 물속에서 쏠 수 없고, 전용 탄을 넣은 수중 소총만 40 m 까지 쓸 수 있다고 적어 두었습니다. 물속 대상을 못 맞히게 한 게 아니라 물속에서 쏘는 것 자체를 막은 경우입니다.
  • 판정은 그대로 두고 그림만 느리게 보인다. 코드가 공개된 한 엔진 SDK 의 총알 코드는 히트스캔 선을 수면에서 끊지 않습니다. 물속 대상도 기본으로 피해를 받고, 안 맞게 하려면 플래그를 따로 켜야 합니다. 플레이어가 잠수 중이면 장식용 물속 총알을 초속 1500 유닛(약 38.1 m/s)으로 띄울 뿐이라, 판정과 그림이 서로 다른 말을 합니다.

세 방식이 물속에서 총알이 가는 것으로 치는 거리 — 첫째는 1.49 m 에서 주머니가 꺼지고, 둘째는 물속 판정이 없고, 셋째는 판정에 거리 제한이 없습니다. 맨 아래 장식 줄기는 판정과 따로 그린 그림이고, 세로선은 우리 수조에서 마네킹이 앉은 자리입니다

우리 수조는 이렇게 계산한다

영상의 촬영 리그는 엔진 물리 없이 위의 닫힌 해를 한 프레임에 토막 16개로 적분하고, 수면을 지나는 프레임은 교점에서 쪼갭니다. 공기 주머니가 꺼진 뒤에는 뒤집힌 총알이 옆면으로 물을 받는 항력(원래의 11배)으로 계속 적분해, 0.33 m 를 더 기어가다 0.75 m/s 로 가라앉게 했습니다. 영상의 총알은 보이게 4배로 키웠고, 수면의 파도와 파문은 보기 위해 넣은 그림이라 계산에는 들어가지 않습니다.

우리 수조 — 왼쪽은 총알 뒤의 공기 주머니가 꺼지는 순간, 오른쪽은 세 번째 방식의 관통 컷입니다. 흰 판정 선은 수면에서 안 끊기고 마네킹에 닿으며, 노란 짧은 줄기가 장식 총알입니다

정리

물속에서 총알이 힘을 잃는 건 게임의 규칙이 아니라 밀도 833배가 만드는 이차 항력입니다. 게임이 이걸 프레임마다 계산한다면 저항을 그냥 곱하지 말고 닫힌 해나 토막 적분을 써야 하고, 수면을 지나는 프레임은 교점에서 쪼개야 합니다. 서두의 배틀로얄 게임은 물이 총알을 막는 쪽이고, 반대로 물속에서도 판정이 그대로인 게임에서는 물속이 안전하지 않습니다.

참고 자료

이 글의 항력 계산, 프레임 적분 비교, 수면 쪼개기, 촬영 리그와 모든 도판은 직접 짠 것이고(파이썬 랩과 언리얼 C++ 리그), 영상의 수조도 같은 식입니다. 세 가지 방식은 위 원문 코드와 문서에서 확인한 범위만 적었고, 특정 게임의 내부 코드를 본 것이 아닙니다.