테마 선택

📚 지식 노트

AI·하드웨어·주변기기·게임·컴퓨터 시스템·이론 컴퓨터 과학·수학·개발과 운영·보안·응용 분야에 대해 알아 두면 좋은 내용을 정리한 노트다. 위에서 분야를 고르고 아래에서 노트를 고른다.

애니메이션

미리 만든 동작을 고르는 대신 자세를 계산하고 찾고 배우는 애니메이션 기법이다.

목차 (9)
  1. 절차 애니메이션과 역운동학: 발이 갈 자리부터 정한다
  2. 발 IK: 계단에서 발이 단에 붙는 이유
  3. 두 본 IK: 총을 바꿔도 손이 붙는 이유
  4. 강화학습으로 배운 걸음
  5. 모션 매칭: 다음 동작 대신 다음 자세를 찾는다
  6. 문 열기: 현실처럼 열면 맞출 게 너무 많다
  7. 베지에와 스플라인: 곡선은 직선 보간을 겹쳐 만든다
  8. 이징과 따라가기: 프레임률에 흔들리지 않는 lerp
  9. 블렌드 트리와 루트 모션: 클립을 섞고, 누가 몸을 옮길지 정한다

절차 애니메이션과 역운동학: 발이 갈 자리부터 정한다

보통의 캐릭터 애니메이션은 애니메이터가 관절 각도를 미리 정해 둔 클립(모션 캡처나 키프레임)을 재생한다. 어떤 상황에서 어떤 자세가 나올지 사람이 먼저 알고 있어야 하는 방식이라, 경우의 수가 적을 때 잘 맞는다. 평지 걷기는 입력이 속도 하나뿐이니 클립 몇 개면 된다. 그런데 다리가 여럿인 생물이 계단·요철·벽을 걷는다면 어느 다리가 어느 높이를 밟을지는 지형이 정한다. 미리 만들 수 없는 자세를 그때그때 계산하자는 것이 절차 애니메이션(procedural animation)이다.

관점을 뒤집어, 관절 각도 대신 발이 있어야 할 자리를 먼저 정한다.

절차 걸음: 몸이 앞으로 가도 디딘 발은 땅에 남고, 몸을 따라오는 발 목표가 디딘 발에서 문턱보다 멀어지면 발을 호를 그리며 들어 목표 자리로 옮겨 딛는다① 몸이 간다, 발은 그대로목표와 디딘 발이 문턱 안 → 딛고 있는다흰 점 = 디딘 발 · 파란 고리 = 발 목표② 문턱을 넘으면 옮겨 딛는다발을 들어 목표로 → 이웃 발이 땅에 있을 때만흰 점 = 디딘 발 · 파란 고리 = 발 목표점선 반원 = 옮겨 딛는 문턱 · 목표는 몸을 따라 움직이고, 무릎은 두 마디 IK로 푼다
다리 하나를 옆에서 본 절차 걸음. 디딘 발은 땅에 두고, 몸을 따라오는 발 목표와 멀어지면 호를 그리며 옮겨 딛는다.
  1. 몸 둘레에 다리마다 기본 자리를 두고, 그 자리에서 아래(또는 다리 방향)로 레이를 쏴 지면에 닿은 점을 발 목표로 삼는다.
  2. 디딘 발은 땅에 고정해 둔다. 몸이 움직여 목표와 디딘 자리가 문턱보다 멀어지면 발을 들어 호를 그리며 목표로 옮긴다.
  3. 양옆 이웃 다리가 땅에 있을 때만 옮기게 막으면, 걸음 순서를 따로 설계하지 않아도 다리가 번갈아 딛는 걸음새가 저절로 나온다.
  4. 몸의 높이는 디딘 발들의 평균 높이로, 몸의 위 방향은 발들이 이루는 면의 법선으로 정한다. 벽에 붙는 발이 늘면 면이 세워지고 몸도 따라 서서, 바닥 걷기와 벽 오르기가 같은 코드가 된다.

발 자리를 정했으면 그 자리에 닿도록 관절 각을 구해야 한다. 관절 각에서 발 위치를 구하는 것이 정운동학(FK, forward kinematics), 반대로 발 위치에서 관절 각을 구하는 것이 역운동학(IK, inverse kinematics)이다. 마디가 많으면 반복 계산(CCD, FABRIK 같은 풀이)이 필요하지만, 마디가 둘이면 아래 두 본 IK 절처럼 코사인 법칙 한 번으로 닫힌 해가 나온다.

절차 애니메이션은 지형이 뭐든 걷는 대신 무게감을 주기 어렵다. 예비 동작, 체중 이동, 머뭇거림은 계산에서 저절로 나오지 않는다. 그래서 사용자가 만든 생물을 걷게 해야 했던 Spore나, 적은 키프레임에 절차를 얹은 Overgrowth, 생물 움직임 전체를 절차로 만든 Rain World처럼 “미리 만들 수 없는” 곳에서 빛나고, 사람 캐릭터는 대개 클립을 재생하면서 발만 IK로 지형에 맞추는 방식으로 섞어 쓴다. 사람 다리는 무릎이 앞으로만 접혀야 하고 보는 사람이 정답을 알아 오차가 바로 드러나므로, 관절 방향 제약을 더 엄격히 걸어야 한다.

발 IK: 계단에서 발이 단에 붙는 이유

게임 캐릭터의 이동은 대개 캡슐 하나가 맡는다. 캡슐은 낮은 턱을 한 번에 타고 넘으므로 계단을 미끄러지듯 오른다. 그런데 걷기 애니메이션은 평평한 바닥에서 만든 것이라 두 발이 늘 같은 높이의 평면에 놓인다. 캡슐이 계단 중간에 서 있으면 그 평면이 어느 단과도 맞지 않아, 앞발은 윗단 속에 묻히고 뒷발은 허공에 뜬다. 캡슐 이동과 애니메이션이 서로의 정보를 모르는 채 따로 돌기 때문이다.

발 IK: 계단 중간의 캐릭터가 IK를 끄면 평지용 걷기 자세 때문에 앞발은 윗단 속에 묻히고 뒷발은 아랫단 위에 뜨며, IK를 켜면 발마다 위에서 아래로 레이를 쏴 디딜 높이를 찾고 골반을 내려 두 발이 모두 단을 딛는다IK 끔: 걷기 자세 그대로뒷발이 뜬다앞발이 단 속에IK 켬: 레이로 바닥을 찾는다두 발 모두 단을 딛는다골반 14 내림점선 캡슐 = 이동을 맡는 몸 · 파란 점선 = 발 위에서 아래로 쏜 레이 · 빨간 점 = 디딜 자리 · 값은 예시
왼쪽: 평지용 걷기 자세 그대로면 앞발은 단 속에, 뒷발은 허공에 있다. 오른쪽: 발마다 아래로 레이를 쏴 디딜 높이를 찾고, 닿지 않는 발만큼 골반을 내린다.

발 IK(foot IK, 발 배치)는 캡슐은 그대로 두고 두 발과 골반만 고치는 단계다.

  1. 발마다 아래로 쏘기: 애니메이션이 정한 발 자리 위에서 아래로 레이(또는 발 폭만 한 작은 구)를 쏜다. 시작점은 캡슐이 타 넘는 턱 높이보다 높아야 한다. 발 높이에서 바로 쏘면 이미 윗단 속에 들어간 발의 시작점도 단 속이라 윗면을 놓친다. 닿은 점이 디딜 높이, 닿은 면의 법선이 발판을 돌릴 각도다.
  2. 골반 내리기: 두 발 가운데 더 낮은 발이 닿지 않는 만큼 골반을 내린다. 그러면 뒷발은 바닥에 닿고 앞발은 무릎이 더 굽는다. 내리는 양은 스프링으로 부드럽게 좇아야 단을 넘을 때마다 몸이 툭툭 떨어지지 않는다.
  3. 다리 풀기: 엉덩이·무릎·발목을 두 본 IK로 풀어 발을 목표에 놓고, 법선만큼 발목을 돌려 경사에서 뒤꿈치가 뜨지 않게 한다.

실무에서는 몇 가지가 더 붙는다. 발이 휘두르는 동안(공중에 있는 동안)은 IK를 끄고 디딘 동안만 켜도록 애니메이션 커브로 발마다 가중치를 넣는다. 캐릭터가 점프 중이면 골반 오프셋도 끈다. 골반을 내리는 대신 뒤꿈치를 들어 맞추는 비율을 고르거나, 발끝이 파고들면 발가락 관절을 축으로 굴리기도 한다. 언리얼은 Control Rig과 Foot Placement 노드로, 유니티는 휴머노이드의 IK 콜백(OnAnimatorIK)이나 Animation Rigging 패키지로 같은 일을 한다.

발 IK 대신 계단·경사 전용 애니메이션을 따로 만들어 두는 방법도 있고, 지형에 맞는 자세를 데이터베이스에서 찾아오는 모션 매칭도 있다. 움직이는 발판 위에서는 디딘 발도 발판과 함께 옮겨야 한다(물리 노트의 움직이는 발판 절).

두 본 IK: 총을 바꿔도 손이 붙는 이유

무기마다 손잡이와 총열덮개 위치가 다른데 왼손은 늘 제자리를 쥔다. 총마다 애니메이션을 따로 만들면 동작 수 × 무기 수로 늘어나고, 팔 길이가 다른 캐릭터에 옮기면(리타기팅) 손이 총에서 떨어진다. 그래서 쥐는 애니메이션은 한 벌만 두고, 총이 “왼손이 갈 자리”(소켓)를 들고 다니게 한 뒤, 매 프레임 왼팔을 그 자리로 당긴다. 오른손은 애니메이션대로 손잡이를 쥐고 총은 오른손에 붙는다.

두 본 IK: 왼쪽은 어깨에서 손목 목표까지 거리 d와 위팔 a, 아래팔 b로 이루어진 삼각형에서 코사인 법칙으로 팔꿈치 각을 구하고, 오른쪽은 목표가 a + b보다 멀어 팔을 곧게 펴도 손이 목표에 못 미친다삼각형 하나를 푼다어깨팔꿈치ab닿는 범위 밖어깨팔꿈치abdθ ≈ 127°cos θ = (a² + b² − d²) ÷ 2abd가 줄면 θ가 접히고, 늘면 펴진다d > a + b → 팔을 다 펴도 남는다빨간 선만큼 못 미친다 · 점선 호 = 닿는 끝세 변을 알면 반복 계산 없이 각이 하나로 정해진다. 팔꿈치가 어느 쪽으로 접힐지는 따로 정한다(폴 벡터·힌트) · 값은 예시
왼쪽: 어깨·팔꿈치·손목 목표가 이루는 삼각형의 세 변으로 팔꿈치 각이 정해진다. 오른쪽: 목표가 팔 길이(a + b)보다 멀면 다 펴도 닿지 않는다.

팔은 어깨·팔꿈치·손목 세 점, 뼈 둘(위팔 a, 아래팔 b)이다. 어깨에서 손목 목표까지 거리 d를 재면 삼각형의 세 변을 모두 알게 되고, 팔꿈치 각 θ는 코사인 법칙 cos θ = (a² + b² − d²) ÷ 2ab로 하나 나온다. 어깨에서 위팔이 꺾이는 각도도 같은 식(cos α = (a² + d² − b²) ÷ 2ad)으로 구한다. 반복도 수렴도 없어서 싸고 안정적이다. 이것이 두 본 IK(two-bone IK)이고, 발 IK의 다리도 같은 식이다.

  • 접히는 방향: 세 변만으로는 팔꿈치가 어느 쪽으로 접힐지 정해지지 않는다(삼각형이 선분 양쪽에 하나씩 있다). 팔꿈치가 향할 쪽을 가리키는 점(폴 벡터, 언리얼의 Joint Target, 유니티의 Hint)을 따로 준다. 무릎에 잘못 주면 다리가 뒤로 꺾인다.
  • 닿는 한계: d가 a + b보다 크면 삼각형이 생기지 않는다. 보통은 팔을 목표 쪽으로 곧게 펴고 멈추며, 뼈를 조금 늘려 닿게 하는 옵션(stretch)을 두는 엔진도 있다. 팔보다 긴 무기라면 소켓을 팔이 닿는 범위 안으로 옮겨야 한다.
  • 손 방향: IK는 손목 위치를 맞출 뿐이라, 손바닥 방향은 처음 쥔 자세를 총 기준으로 기억했다가 유지한다. 손가락이 덮개 굵기에 맞게 감기는 것은 별도 계산이다.

재장전처럼 왼손이 총을 떠나야 할 때는 IK 세기(가중치)를 0과 1 사이로 섞어 켜고 끈다. 반동으로 총이 밀리면 소켓도 같이 밀리므로 손은 붙어 있다. 오른손도 소켓으로 바꾸면 총이 두 점을 들고 다니고 애니메이션에는 몸통 자세만 남는다.

강화학습으로 배운 걸음

몸을 물리로 만들면 밀리고 넘어지는 반응은 저절로 생기지만, 관절 여러 개의 힘을 매 순간 정해 그 몸을 서 있게 하는 제어가 어렵다. 강화학습(RL, reinforcement learning)은 그 제어를 사람이 짜는 대신 시행착오로 배우게 한다.

  • 몸: 관절마다 목표 각을 따라가는 모터(PD 제어)를 단 물리 몸이다. 걷는 동작은 어디에도 적혀 있지 않다.
  • 정책(policy): 신경망이 1초에 수십 번 몸의 기울기·속도, 목표 방향, 관절 각과 속도를 읽고 관절마다 목표 각을 낸다.
  • 보상(reward): 목표 쪽으로 다가가는 속도, 몸이 곧은 정도에 점수를 주고, 힘을 많이 쓰거나 출력이 들쭉날쭉하면 깎는다. 넘어지면 그 판을 끝낸다.
  • 학습: PPO 같은 알고리즘으로, 수천 마리를 GPU나 여러 코어에서 한꺼번에 굴려 모은 경험으로 보상이 높았던 행동이 더 나오게 신경망을 조금씩 고친다. 몸으로 수백 시간 겪을 일을 컴퓨터로는 몇 분~몇 시간에 겪는다.

보상만 주면 엉뚱한 걸음이 나오기 쉽다. 목표에 빨리 가기만 하면 되니 앞다리 둘을 같이 짚는 깡충 걸음 같은, 점수는 높지만 보기 이상한 동작을 찾아낸다. 걸음새를 보상 항목으로 하나하나 고치려면 끝이 없어서, 본보기 동작을 흉내 내게 하는 방법이 나왔다. DeepMimic(2018)은 모션 캡처 클립을 따라가는 정도를 보상으로 주고, AMP(Adversarial Motion Priors, 2021)는 작은 판별 신경망을 심판으로 둔다. 심판은 몸 상태의 짧은 변화가 본보기에서 나온 것인지 로봇에게서 나온 것인지 가리고, 로봇은 심판을 속일수록 스타일 점수를 받는다. 그러면 특정 클립을 그대로 따라 하지 않으면서도 본보기 같은 걸음새가 나온다.

넘어진 뒤 일어나는 것은 보통 따로 학습한다. 아무렇게나 뒤집어 떨어뜨리고, 곧게 설수록, 다리를 몸 밑으로 모을수록 점수를 준다. 조건을 느슨하게 주면 공중제비로 서거나 다리를 쫙 벌린 자세로 버티는 식의 꼼수가 나오기 때문에, 성공 조건을 원하는 자세 쪽으로 좁혀 가며 다듬는다. 게임에서는 몸이 크게 기울면 일어나기 정책으로, 다시 서면 걷기 정책으로 갈아 끼운다.

실제 게임에도 들어왔다. 아크 레이더스(ARC Raiders)의 엠바크 스튜디오는 다리 달린 기계 적의 이동을 이런 학습으로 만들었다고 공개했다. 판단(어디로 갈지)은 게임 로직이 하고, 어떻게 걸어서 가는지만 학습한 정책이 맡는 구조다. 대가는 비용과 조율이다. 개체마다 신경망 추론과 물리를 매 틱 돌려야 하고, 원하는 걸음새를 얻기까지 보상을 다듬는 데 시간이 많이 든다. 래그돌과 관절은 물리 노트에, 신경망 일반은 AI 노트에 있다.

모션 매칭: 다음 동작 대신 다음 자세를 찾는다

오래 쓰여 온 로코모션(이동 애니메이션)은 스테이트 머신(state machine)이다. 서기·걷기 시작·걷기·멈추기 같은 동작을 상태로 두고 조건에 따라 다음 상태로 넘어가며, 걷기와 뛰기 사이처럼 루프끼리는 블렌드 스페이스(blend space)로 섞는다. 문제는 전환이다. 출발해 옆으로 가다 제자리에서 돌고 멈추는 식의 조합마다 전환을 사람이 이어야 해서, 큰 게임의 애니메이션 그래프는 노드가 수천~수만 개로 불어난다.

모션 매칭(motion matching)은 다음 동작을 고르지 않는다. 몇 분 분량의 모션 캡처를 통째로 넣어 두고, 매 프레임 그 안에서 지금 상태와 앞으로의 계획에 가장 잘 맞는 자세를 찾아 그리로 건너뛴다. 유비소프트가 2015~2016년에 발표했고(GDC 2016 발표 영상), 포 아너(For Honor)가 일찍 상용 게임에 넣은 대표적인 예다.

모션 매칭: 입력으로 만든 지금의 미래 궤적과, 데이터베이스의 세 자세에 적힌 미래 궤적을 견주면 왼쪽으로 꺾는 자세의 차이가 가장 작아 그 자세로 건너뛴다지금 상태(입력)스틱을 왼쪽 앞으로 → 미래 위치 3개데이터베이스의 자세들뛰기 루프비용 13.5왼쪽으로 꺾기비용 0.2오른쪽 피벗비용 52.4비용 = Σ 가중치 × (자세의 값 − 지금 값)² · 가장 작은 자세(색칠)로 건너뛰어 재생을 이어 간다파란 선 = 그 자세에 적힌 미래 궤적 · 회색 점선 = 지금 원하는 궤적 · 값은 예시
지금 입력으로 만든 미래 궤적(회색 점선)과 자세마다 적어 둔 미래 궤적을 견줘 차이가 가장 작은 자세를 고른다. 실제로는 발 위치·속도, 골반 속도 같은 값도 함께 견준다.
  1. 자세마다 숫자 적기: 모캡을 1초에 수십 장씩 자세로 자르고, 자세마다 특징 값(feature)을 적는다. 두 발의 위치와 속도, 골반 속도, 앞으로 0.3~1초 뒤에 몸이 가 있을 위치와 바라볼 방향(미래 궤적) 같은 것을 캐릭터 기준 좌표로 적는다.
  2. 지금 상태도 같은 숫자로: 발·골반 값은 지금 재생 중인 자세에서, 미래 궤적은 스틱 입력을 스프링으로 따라가게 해 내다본 값으로 채운다.
  3. 비용 재기: 단위가 다른 값들을 표준편차 같은 것으로 나눠 크기를 맞추고, 종류마다 가중치를 곱해 차이를 제곱해 더한다. 비용이 가장 작은 자세가 1등이다.
  4. 건너뛰기: 1등이 지금 재생하는 곳에서 아주 가까우면 그대로 이어 재생하고(지금 자세 비용에 작은 보너스를 줘 편들기도 한다), 아니면 1등 자세로 건너뛰며 짧게 블렌드한다. 이 규칙이 없으면 1등이 바뀔 때마다 건너뛰어 움직임이 잘게 끊긴다.

전부 견주면 자세 수만큼 비용이 들어서, 엔진은 탐색을 줄인다. 언리얼의 Pose Search는 이동 상태에 맞는 데이터베이스를 먼저 고르고, 차원을 줄인 공간의 KD 트리로 가까운 후보만 추려 견준다. 근사라 진짜 1등을 놓칠 수 있다. 건너뛸 때의 전환에는 블렌드 대신 이너셜라이제이션(inertialization)을 쓰기도 한다. 두 동작을 함께 계산하지 않고, 바꾸는 순간 두 자세의 차이와 그 속도를 기억했다가 짧은 시간에 줄여 없애는 방식으로, 기어스 오브 워 4에서 발표됐다(GDC 발표 영상).

한계는 데이터다. 모션 매칭은 찍어 둔 자세 가운데서 고를 뿐 새 자세를 만들지 못하므로, 새 움직임이 필요하면 더 찍어 넣어야 한다. 메모리도 데이터 양과 특징 수에 비례해 늘어, 일부 단계를 신경망으로 바꿔 메모리를 크게 줄인 Learned Motion Matching(2020) 같은 연구가 나왔다. 포 아너 뒤로 라스트 오브 어스 파트 2, 컨트롤, 포트나이트 등이 모션 매칭을 썼다.

문 열기: 현실처럼 열면 맞출 게 너무 많다

현실에서는 문고리를 잡고 돌린 뒤 문을 밀며 같이 걸어 들어간다. 이것을 캐릭터에게 그대로 시키면 맞출 것이 셋이다. 첫째 손잡이에 손이 닿을 위치로 몸을 옮기고, 둘째 IK로 손을 손잡이에 고정한 채 돌리고, 셋째 문이 열리는 동안 몸이 문틀과 부딪히지 않게 걸음을 맞춘다. 셋을 다 맞추면 느리고 조작을 빼앗고, 하나라도 어긋나면 손이 허공을 쥔다. 그래서 게임은 문을 다르게 연다.

방식하는 일장점단점
정해진 자리로 끌어다 세우고 동작 재생캐릭터를 문 앞 기준점으로 짧게 미끄러뜨린 뒤 미리 만든 여는 동작을 튼다. 언리얼의 Motion Warping, 유니티의 Animator.MatchTarget이 이런 맞춤을 돕는다손이 정확히 손잡이에 닿고 연출이 좋다조작을 빼앗는다. 심하면 버튼을 누르고 짧은 컷신을 보는 셈이다. 도중에 빠져나오려면 동작을 잘게 쪼개야 한다
걷는 동작 위에 팔만 겹치기걸음은 그대로 두고 팔에만 손을 뻗는 동작이나 IK를 겹친다(레이어링). 문은 몸이 나아가는 만큼 열린다속도를 거의 잃지 않고 조작도 그대로다손을 일부만 뻗는 정도로 타협해야 어색함이 덜하다
문이 먼저, 반대쪽으로 열린다버튼이나 접근만으로 문이 혼자 여는 사람의 반대쪽으로 열린다가장 빠르고 플레이어를 막지 않는다손이 안 닿으니 공들인 3인칭 게임에서는 몰입이 깨질 수 있다
경첩에 묶인 물리 문문을 경첩 관절에 묶인 강체로 두고 캐릭터의 몸(캡슐)이 밀어 연다달려 들어가면 쾅 열리고 뒤에서 닫히는 자연스러움문이 캐릭터나 적을 밀고 끼이는 경우까지 다뤄야 한다

반대쪽으로 열기는 오래된 기본기다. 소스 엔진의 경첩 문은 양쪽으로 열 수 있으면 여는 사람의 반대쪽으로 열리고, 그쪽이 막혀 있으면 플레이어 쪽으로 연다. 어느 쪽으로 열려도 어색하지 않게 하려면 문 모델과 경첩을 양방향으로 만들어야 한다.

한 게임 안에서 섞는 경우가 많다. 라스트 오브 어스 파트 2는 손을 일부만 뻗는 겹치기, 늘 플레이어 반대쪽으로 열리는 문, 밀 수 있는 물리 문을 함께 쓰고, 열면 짧은 연출이 나오는 문도 따로 두었다고 개발진이 밝혔다. 아예 문을 두지 않는 게임도 많다. 문이 없어도 플레이어가 잘 알아채지 못하고, 한 번 열리면 닫히지 않는 문으로만 진행을 막는 정도로 타협하기도 한다. 손 IK는 위의 두 본 IK 절, 경첩 강체는 물리 노트를 보면 된다.

베지에와 스플라인: 곡선은 직선 보간을 겹쳐 만든다

애니메이션의 가장 작은 부품은 선형 보간(lerp)이다. 두 값 a, b와 0~1 사이의 t가 있으면 a + (b − a) × t가 둘 사이의 t만큼 간 자리다. 카메라 레일, 키프레임 사이의 값, 날아가는 미사일의 휘어진 길은 모두 이 lerp를 겹쳐 만든 곡선이다.

3차 베지에 곡선 위의 점은 조절점 네 개 사이를 t만큼씩 나누는 선형 보간을 세 번 거듭해 얻는다. 곡선은 P0과 P3을 지나고 P1, P2는 지나지 않고 끌어당기기만 한다P0P1P2P3t = 0.4인 곡선 위의 점점선 = 조절점 사이 · 회색 점 = 1차 보간 · 옅은 파란 점 = 2차 보간빨간 점 = 3차 보간(곡선 위의 점) · 굵은 선 = t를 0에서 1로 움직인 자취
3차 베지에 곡선 위의 점 하나를 구하는 법. 이웃한 조절점 사이를 t만큼 나누기를 세 번 거듭하면 점 하나가 남는다. t를 0에서 1로 움직이면 그 점이 곡선을 그린다.
  • 베지에 곡선(Bézier curve): 조절점 네 개(P0~P3)로 3차 곡선을 만든다. 이웃한 점끼리 t만큼 lerp해 점 세 개를 얻고, 그 셋을 다시 lerp해 둘, 다시 하나를 얻으면 곡선 위의 점이다(드 카스텔조 방법). 곡선은 양 끝 P0과 P3을 지나지만 P1, P2는 지나지 않고 그쪽으로 끌어당기기만 한다. 출발 방향은 P0→P1, 도착 방향은 P2→P3이다.
  • 스플라인(spline): 긴 길은 곡선 하나로 그리지 않고 짧은 조각을 이어 붙인다. 이음매가 얼마나 매끄러운지를 연속성(continuity)이라고 한다. 위치만 이어지면 C0, 기울기(속도)까지 같으면 C1, 휘는 정도(가속도)까지 같으면 C2다. 방향만 같고 빠르기가 다른 이음은 G1이라 부르는데, 그림으로는 매끄러워 보여도 그 위를 달리는 카메라는 이음매에서 덜컥 빨라지거나 느려진다.
스플라인지나는 점매끄러움쓰는 곳
베지에 조각 잇기조각의 양 끝만손잡이를 맞추면 C1애니메이션 커브 편집기, 벡터 그림
에르미트(Hermite)모든 점점마다 기울기를 직접 주면 C1키프레임 보간(값과 접선을 함께 저장)
캣멀-롬(Catmull-Rom)모든 점C1, 기울기는 이웃 점에서 자동찍어 둔 점을 지나야 하는 카메라 경로·순찰로
B-스플라인대개 지나지 않음C2가속도까지 매끄러워야 하는 길, 모델링

함정이 하나 있다. t를 일정하게 올려도 곡선 위의 빠르기는 일정하지 않다. 조절점이 몰린 곳에서는 느리고 벌어진 곳에서는 빠르다. 레일 위 카메라나 기차를 일정한 속도로 움직이려면, 곡선을 잘게 잘라 t마다 누적 길이를 표로 만들어 두고 “몇 m 갔나”에서 t를 거꾸로 찾는다(호 길이 매개화). 두 영상 The Beauty of Bézier Curves와 The Continuity of Splines가 이 내용을 움직이는 그림으로 보여 준다.

이징과 따라가기: 프레임률에 흔들리지 않는 lerp

같은 거리를 움직여도 출발과 도착의 모양에 따라 느낌이 다르다. t를 그대로 쓰면 등속이라 기계처럼 보이고, t를 한 번 휘어 쓰면 살아 있는 움직임이 된다. 이 휘는 함수를 이징(easing)이라 한다. t²은 천천히 출발하고(ease-in), 1 − (1 − t)²는 천천히 멈추며(ease-out), 3t² − 2t³(smoothstep)은 양쪽 다 부드럽다. 버튼이 커지는 UI, 문이 열리는 각도, 카메라 전환이 모두 이 곡선 하나를 고르는 일이다.

끝을 모르는 움직임, 예를 들어 움직이는 캐릭터를 따라가는 카메라에는 “매 프레임 남은 거리의 10%씩 다가가기”(x ← lerp(x, 목표, 0.1))를 흔히 쓴다. 쓰기 쉽고 부드럽지만 프레임률에 묶여 있다. 1초에 프레임이 네 배면 다가가는 횟수도 네 배라, 120fps에서는 30fps보다 훨씬 빨리 붙는다. 같은 게임이 기기마다 다른 카메라 감각을 갖게 된다.

매 프레임 남은 거리의 10%씩 따라가면 0.3초 뒤 120fps는 98%, 30fps는 61%까지 와서 빠르기가 다르다. dt로 비율을 정하면 두 프레임률 모두 85%로 같다0%50%100%0초0.2초0.4초0.6초120fps 98%dt 반영 85%30fps 61%10%씩, 120fps10%씩, 30fps1 − e^(−k·dt), 30·120fps 겹침
0에서 1로 따라가기. 매 프레임 10%씩이면 0.3초 뒤 120fps는 98%, 30fps는 61%까지 와 빠르기가 다르다. 비율을 1 − e^(−k·dt)로 바꾸면 30fps(점선)와 120fps(굵은 선)가 같은 곡선 위에 놓인다.
  • dt를 넣은 비율: 고정된 0.1 대신 1 − e−k·dt를 비율로 쓴다. 남은 거리가 1초에 e−k배로 줄어드는 지수 감쇠라서, 프레임을 몇 번으로 나누든 같은 시각에 같은 자리에 있다. k 대신 “남은 거리가 절반이 되는 시간”(반감기 h)으로 정하면 튜닝이 쉽다. k = ln 2 ÷ h다.
  • 끝내 닿지 않는다: 지수 감쇠는 목표에 무한히 다가갈 뿐 닿지 않는다. 남은 거리가 충분히 작으면 목표로 붙여 끝내야 “아직 움직이는 중” 상태가 영원히 남지 않는다.
  • 목표가 움직이면 늘 뒤처진다: 일정한 속도로 달리는 목표를 따라가면 일정한 거리만큼 뒤에서 따라간다. 속도를 함께 들고 다니는 감쇠 스프링(임계 감쇠, critically damped spring)으로 바꾸면 출발도 부드러워지고 방향을 바꿀 때 속도가 끊기지 않는다.

이 한 줄짜리 버그는 카메라, UI, 조준 보정, 체력 바 등 어디에나 숨어 있다. 원리와 고치는 식은 Lerp smoothing is broken 영상이 자세히 풀어 준다. 카메라에 쓰는 예는 조작감 노트의 카메라 절에 있다.

블렌드 트리와 루트 모션: 클립을 섞고, 누가 몸을 옮길지 정한다

클립 하나를 재생하는 것만으로는 걷다가 뛰고, 뛰면서 조준하는 몸을 만들 수 없다. 게임은 클립 여러 개를 동시에 재생하며 관절마다 비율을 섞는다. 섞는 규칙을 나무 모양으로 짠 것이 블렌드 트리(blend tree)다.

  • 속도와 방향으로 섞기: 걷기(1.5 m/s)와 뛰기(4 m/s) 클립 사이에서 지금 속도가 3 m/s면 뛰기 쪽 비중을 크게 섞는다. 방향까지 넣은 2D 블렌드 스페이스는 앞·뒤·옆 걷기 클립을 격자에 두고 둘레 클립들의 비율을 얼마나 가까운지로 정한다.
  • 박자 맞추기: 걷기는 한 걸음이 1초, 뛰기는 0.7초처럼 주기가 다르다. 그냥 섞으면 한쪽은 왼발, 한쪽은 오른발을 딛는 순간이 겹쳐 다리가 꼬인다. 그래서 클립마다 재생 위치를 0~1로 정규화하거나 발이 닿는 순간에 표시(sync marker)를 달아, 섞이는 클립들이 같은 걸음 위치에 있게 한다.
  • 층으로 섞기: 상체만 고르는 뼈 마스크로 하체는 달리기, 상체는 장전을 재생한다. 기준 자세와의 차이만 담은 가산 애니메이션(additive animation)은 어느 동작 위에든 더할 수 있어, 숨쉬기·피격 움찔·조준 방향(aim offset)처럼 다른 동작과 겹쳐 나오는 움직임에 쓴다.

섞은 다음에는 누가 캐릭터를 옮기는가를 정해야 한다.

방식하는 일좋은 점대가
제자리(in-place) 클립클립은 제자리에서 걷고, 이동은 코드가 캡슐을 옮겨서 한다입력에 바로 반응하고, 속도·가속을 마음대로 튜닝할 수 있다캡슐 속도와 걸음 폭이 안 맞으면 발이 미끄러진다. 재생 속도를 맞추거나 보폭을 늘이는 보정이 필요하다
루트 모션(root motion)클립 속 뿌리 뼈가 움직인 만큼을 뽑아 캡슐을 옮긴다발이 땅에 정확히 붙고, 구르기·공격 돌진·기어오르기의 거리가 애니메이터가 만든 그대로다반응이 클립에 묶여 둔해지고, 방향 전환과 멀티플레이 동기화가 까다롭다

그래서 보통 이동은 제자리 클립과 코드로, 정확한 거리가 중요한 동작(공격, 회피, 장애물 넘기)은 루트 모션으로 나눠 쓴다. 발 미끄러짐을 남은 부분까지 지우는 것은 위의 발 IK와 모션 매칭이 맡는다.

클립은 한 골격에 맞춰 만들어진다. 키와 팔다리 비율이 다른 캐릭터에 같은 걷기를 쓰려면 리타게팅(retargeting)으로 움직임을 옮긴다. 뼈 이름이나 개수가 달라도 되도록 양쪽 골격에 팔·다리·척추 같은 사슬(chain)을 같은 이름으로 정해 사슬끼리 맞추고, 골반 이동은 키 비율만큼 늘이거나 줄여 보폭이 맞게 한다. A 자세와 T 자세처럼 기준 자세가 다르면 먼저 기준 자세를 맞춰야 결과가 정확해진다. 언리얼 엔진의 IK Retargeter가 이 방식이고, 손발이 물건이나 땅에 정확히 닿아야 하는 곳은 위의 IK로 마무리한다.