걷는 캐릭터의 발이 바닥을 딛지 않고 얼음판 위를 스케이트 타듯 미끄러지는 장면, 게임을 하다 보면 한 번쯤 마주치게 됩니다. 분명 걷는 애니메이션이 재생되고 있는데도 몸만 앞으로 쑥 나가는 느낌이 들거든. 이 어색함의 원인은 대개 하나, 캐릭터가 실제로 움직이는 속도와 애니메이션이 만들어질 때의 속도가 다르다는 데 있습니다. 그렇다면 두 속도가 얼마나 어긋나야 발이 미끄러지고, 고치면 무엇이 달라질까요?
이 글에서는 걷기와 뛰기 클립을 직접 모델로 만들어 속도를 바꿔 가며 발이 미끄러지는 거리를 재본 결과를 확인하실 수 있습니다. 그리고 속도에 맞춰 재생 속도를 바꾸는 흔한 해결책이 어떤 대가를 치르는지도 따져 봤으니 한 번 확인해보시길 바랍니다.
미끄러짐이 눈에 띄는 기준
먼저 얼마나 미끄러져야 사람이 알아챌까 궁금했는데요. 프라자크(Pražák), 오이에(Hoyet), 오설리번(O’Sullivan)이 2011년 컴퓨터 애니메이션 학회(SCA)에 낸 연구가 이 질문을 다루고 있습니다. 이 연구에서는 참가자들이 대부분의 조건에서 21mm 아래의 아주 작은 미끄러짐도 알아챘다고 합니다. 또 미끄러짐을 고친 애니메이션은 고친 정도와 상관없이 늘 더 좋은 평가를 받았다고 하죠.
다만 이 실험의 조건과 내가 만든 모델이 똑같을 리는 없지요. 그래서 2.1cm는 정답이 아니라 “이쯤부터 눈에 띌 수 있다”는 참고선 정도로만 써봤습니다.
클립 안에 들어 있는 속도
걷기 클립에도 속도가 숨어 있습니다. 한 사이클(두 걸음)에 몸이 몇 m 나아가고, 그게 몇 초 걸리느냐가 정해져 있으니까요.
걷기 클립은 사이클당 1.5m, 1.0초에 두 걸음이라 초속 1.5m이고 발이 땅에 붙어 있는 시간은 사이클의 60%로 가정했습니다. 뛰기 클립은 사이클당 2.8m, 0.7초, 접지 35%라서 초속 4.0m가 되죠. (전부 임의로 고른 값이며 실제 게임의 클립에서 잰 수치는 아님)
발이 땅을 딛는 동안에는 몸 기준으로 발이 뒤로 흘러가야 땅 위에서는 제자리에 있게 됩니다. 그런데 클립이 정해 둔 흘러가는 속도가 1.5라면, 캐릭터가 2.25로 달릴 때는 0.75만큼 발이 땅 위에서 앞으로 끌려가는 셈입니다. 접지 시간이 0.6초니까 한 걸음에 무려 45cm가 미끄러지는 셈인 거죠.
속도가 어긋나면
이 계산을 프레임 단위로 굴려서도 확인해봤습니다. 60프레임에 40초 동안 발 하나가 접지 구간마다 땅 위에서 얼마나 움직였는지 더했고, 시작 위상은 무작위로 줬어요. 결과는 클립 속도 1.5의 0.5배에서 45cm, 0.75배와 1.25배에서 각각 22cm 안팎, 1.5배에서 45cm, 2배에서 88cm였습니다.
수식으로는 2배에서 정확히 90cm가 나와야 하는데 88cm였습니다. 접지 구간을 프레임 단위로 자르다 보니 경계에서 한 프레임(약 17ms)이 들쭉날쭉했던 게 원인이었죠. 개인적인 생각으로 원인을 확인하고 나니 오차 2%는 그대로 둬도 되겠다 싶었습니다.
더 눈여겨볼 건 허용 범위인데요. 참고선 2.1cm에 맞추면 걷기 클립은 속도가 2.3%, 그러니까 초속 0.035m만 어긋나도 선을 넘습니다. 뛰기 클립도 비슷해서 2.1% 정도였어요. 직접 돌려 본 입장에서는 이 2%대 숫자가 가장 의외였다고 봅니다. 클립은 만들어진 속도에서 조금만 벗어나도 안 된다는 얘기니까 말이죠.
재생 속도를 맞추면
가장 쉬운 해결책부터 떠올려 봅시다. 쉽게 드는 생각 하나로, 이동 속도에 맞춰 클립의 재생 속도를 바꾸면 되지 않을까요? 언리얼 엔진의 애니메이션 위치 맞춤(Distance Matching) 문서가 이 방식을 소개하고, 극단적인 재생 속도는 어색해 보이니 범위를 제한하라고 덧붙이더라고요. 같은 엔진의 스트라이드 워핑(Stride Warping) 문서에는 이동 속도를 클립의 이동 속도로 나눈 값만큼 보폭을 늘리거나 줄이는 계산식이 나옵니다. 다음의 사진을 참고해주세요.

재생 속도를 이동 속도에 정확히 맞추면 미끄러짐은 0cm가 되지요. 하지만 사진에서 보이는 그림 가운데 칸처럼 발걸음이 속도에 비례해서 빨라지는 부작용이 생깁니다.
초속 0.75m에서는 1초에 한 걸음, 3.0m에서는 4걸음이 돼요. 참고로 걷기 클립 기준으로 2.25m/s에 맞추면 1초에 3걸음인데, 이건 뛰기 클립의 2.9걸음보다 더 빠른 발놀림이 나온다. 그리고 한 걸음의 길이는 속도와 상관없이 0.75m에 묶여 있고요. 미끄러짐은 사라졌지만 대신 캐릭터가 종종걸음을 치게 됐습니다.
걷기와 뛰기를 섞으면
그렇다면 걷기와 뛰기 클립을 속도에 따라 섞으면 어떨까요? 두 클립의 사이클 길이를 가중 평균으로 맞춰 박자를 동기화하고, 접지 비율도 같은 비율로 섞어서 계산해보았습니다. 결과를 먼저 말씀드리자면, 속도가 1.5와 4.0일 때는 클립 그대로라 미끄러짐이 0으로 떨어집니다.
그러나 그 사이에서는 얘기가 달라져요. 가장 크게 미끄러지는 지점은 초속 2.6m 근처로, 한 걸음에 9.1cm였습니다. 참고선 2.1cm를 넘는 구간은 1.63~3.79m/s로 사실상 섞는 구간 대부분에 해당하죠. 제 모델에서는 섞는 비율이 속도에 비례해 정해지는데 섞인 자세의 발 속도는 그 비율과 직선으로 맞아떨어지지 않더라고요.
무작위 속도 4만 3천 개
현실에서는 플레이어가 아날로그 스틱을 이리저리 움직이니 속도가 딱 떨어질 리 없거든요. 0.3~5.0m/s 사이에서 무작위 속도 4만 3천 개를 뽑아 네 가지 방식으로 비교해 봤습니다.
걷기 클립 하나만 쓰면 걸음의 98.5%가 참고선을 넘었고 중앙값이 70cm였어요. 속도 2.75를 기준으로 걷기와 뛰기를 갈아 끼우는 방식은 94.8%에 중앙값 20cm. 섞는 방식은 90.1%에 8.4cm였습니다. 여기에 재생 속도를 0.8~1.25배 안에서 맞추면 18.8%까지 떨어졌고 중앙값은 0cm였어요.(10cm를 넘는 걸음만 세면 92.8%, 75.3%, 34.7%, 16.6%로 줄어듬)
남은 18.8%는 거의 다 걷기 속도보다 느린 구간에 몰려 있었습니다. 재생 속도를 0.8배까지만 내리도록 제한했는데, 초속 1.2m보다 느리면 그 제한에 걸려 버려요.
다만 이 모델에는 빠진 것이 좀 많아요. 발이 뒤꿈치부터 닿고 발끝으로 떠나는 움직임이나 골반의 상하 움직임은 넣지 않았고, 발 IK(발 위치를 땅에 고정하는 보정)도 쓰지 않았어요. 클립 값은 모두 제가 정한 가정이며, 실제 엔진이 이 값들을 어떻게 섞는지도 확인하지 못했다는 분명한 한계가 있습니다.
문제는 옮겨 갈 뿐이다
처음 질문으로 돌아가면, 미끄러짐은 이동 속도와 클립 속도 두 숫자의 차이에 접지 시간을 곱한 값이었는데요. 이 차이를 줄이는 길은 결국 재생 속도나 보폭, 걸음 수 중 하나를 움직이는 것뿐인데, 하나를 움직이면 다른 하나가 어색해지게 됩니다. 이게 가장 큰 문제점이죠.
미끄러짐이 사라진 자리에 종종걸음이 들어서는 이유가 바로 거기에 있었습니다. 따라서 다른 해결책을 모색해야 하는데, 그것이 게임 개발을 얼마 해보지 않은 일반인에게는 매우 어렵다는 것이 이번 글의 마무리가 되겠습니다.