애니 논문: Learned Motion Matching: 모션 매칭을 신경망으로 압축하다
게임 캐릭터를 자연스럽게 움직이려면 방대한 양의 모션 데이터가 필요하다. 걷고, 뛰고, 방향을 틀고, 멈추는 온갖 동작을 모션 캡처로 찍어 두면 수십 분에서 수 시간 분량의 애니메이션이 쌓인다. 모션 매칭(Motion Matching)은 이 원본 데이터를 잘게 자르지 않고 통째로 들고 다니면서, 매 프레임 "지금 상황에 가장 잘 맞는 프레임"을 데이터베이스에서 찾아 이어 붙이는 방식이다. 결과물이 매우 부드럽고 반응성이 좋아 실무에서 널리 쓰이지만, 대가가 있다. 모션 데이터베이스 전체를 메모리에 올려 두어야 하고, 매 프레임 그 안을 뒤져야 한다.
Holden 외(Ubisoft, SIGGRAPH 2020)의 Learned Motion Matching은 이 검색 기반 시스템을 세 개의 작은 신경망으로 대체한다. 데이터베이스를 통째로 메모리에 올리는 대신 신경망의 가중치만 들고 다니면 되므로, 품질을 유지하면서 메모리 사용량을 수십 배 줄인다. 여기서는 그 세 신경망 — Decompressor, Stepper, Projector — 이 각각 원래 모션 매칭의 어떤 부분을 흉내 내는지 하나씩 풀어 본다.
먼저, 모션 매칭이 매 프레임 하는 일
모션 매칭에는 두 종류의 벡터가 등장한다. 하나는 특징 벡터(feature vector) 로, 검색에 쓰는 값들이다. 여기에는 캐릭터가 앞으로 밟을 궤적(미래의 발 위치·진행 방향), 현재 두 발의 위치와 속도, 엉덩이(hip) 속도 같은 "매칭에 중요한" 소수의 값이 들어간다. 다른 하나는 포즈 벡터(pose vector) 로, 실제로 캐릭터를 그리는 데 필요한 모든 관절의 위치·회전·속도가 담긴 훨씬 큰 값이다.
데이터베이스는 프레임마다 짝지어진 의 집합이다. 매 프레임 시스템은 사용자 입력(방향 스틱 등)과 현재 상태로부터 "원하는 특징" 를 만든 뒤, 데이터베이스에서 이것과 가장 가까운 항목을 찾는다.
여기서 는 선택된 프레임의 인덱스이고, 는 특징 공간에서의 제곱 거리다. 실제로는 각 특징의 단위와 중요도가 다르므로 가중치 를 곱한 거리 를 쓴다. 선택된 프레임 를 재생하다가, 잠시 뒤 다시 검색해 다음 프레임으로 넘어간다. 정리하면 모션 매칭은 세 가지 일을 반복한다.
- 검색: 원하는 특징 에 가장 가까운 데이터베이스 항목 찾기.
- 재생·전진: 선택된 지점부터 애니메이션을 한 프레임씩 앞으로 밀기.
- 복원: 특징에 대응하는 완전한 포즈 를 꺼내 캐릭터에 적용하기.
Learned Motion Matching의 핵심 통찰은, 이 세 가지 일이 각각 하나의 함수로 볼 수 있고, 함수라면 신경망으로 근사할 수 있다는 것이다.
Decompressor: 특징에서 포즈를 복원하는 망
가장 먼저 다룰 것은 Decompressor다. 메모리를 잡아먹는 주범은 큰 포즈 벡터 를 프레임마다 통째로 저장하는 것이다. 그래서 저자들은 포즈를 직접 저장하지 않고, 작은 특징 와 잠재 변수(latent variable) 로부터 포즈를 되살리는 함수를 배운다.
가 Decompressor 신경망이다. 그런데 만으로는 포즈를 완전히 결정할 수 없다. 특징에는 궤적과 발 정보처럼 "매칭에 필요한 것"만 들어 있어, 상체 자세처럼 매칭엔 덜 중요하지만 그림에는 필요한 정보가 빠져 있기 때문이다. 그 빠진 정보를 담는 그릇이 다. 는 사람이 손으로 고른 값이 아니라, 학습 과정에서 자동으로 채워진다. 이를 위해 Compressor라는 보조 신경망 를 함께 둔다.
즉 Compressor가 원래 포즈 를 압축해 를 만들고, Decompressor가 로부터 포즈 를 복원한다. 두 망은 오토인코더처럼 함께 학습되며, 손실은 복원된 포즈가 원본과 얼마나 가까운지로 정의된다.
여기에 관절 위치뿐 아니라 속도·발 접지 등에 대한 항을 더해, 단순히 한 프레임이 비슷한 것을 넘어 시간적으로도 매끄럽게 만든다. 학습이 끝나면 Compressor는 버리고, 데이터베이스에는 각 프레임의 작은 만 남긴다. 큰 는 필요할 때 가 즉석에서 만들어 낸다.
Stepper: 다음 프레임으로 스스로 걸어가는 망
다음은 Stepper다. 원래 모션 매칭은 검색으로 프레임을 고른 뒤, 다음 검색까지 데이터베이스 안을 순서대로 재생하며 "전진"한다. 이 전진 역시 하나의 함수 — 현재 가 주어졌을 때 다음 순간 이 무엇인지 — 로 볼 수 있다. Stepper 는 그 시간 변화량을 예측한다.
는 현재 상태를 받아 시간당 변화율(속도)을 내놓고, 여기에 시간 간격 를 곱해 다음 상태를 얻는다. 이렇게 하면 데이터베이스를 뒤지지 않고도 애니메이션을 스스로 이어 나갈 수 있다. 학습 목표는 예측한 다음 상태가 실제 데이터의 다음 상태와 같아지는 것이다.
위첨자 는 ground truth, 즉 실제 데이터가 알려 주는 참값이다. 한 프레임만 맞춰서는 오차가 누적되므로, 저자들은 여러 프레임을 연달아 예측하며 그 궤적 전체가 실제 데이터와 어긋나지 않도록 학습한다. 이 덕분에 검색이 뜸하게 일어나도 그 사이를 Stepper가 안정적으로 메운다.
Projector: 검색을 흉내 내는 망
마지막이 Projector다. 사용자가 갑자기 방향을 바꾸면, 지금 재생 중인 흐름과 원하는 특징 사이가 벌어진다. 원래 시스템은 이때 데이터베이스 전체를 검색해 가장 가까운 항목으로 "점프"했다. Projector 는 이 최근접 이웃 검색을 함수로 근사한다. 원하는 특징(질의) 를 받아, 데이터베이스에서 그것에 가장 가까웠을 완전한 상태 를 곧바로 돌려준다.
학습은 지도학습으로 이뤄진다. 데이터베이스의 각 항목 근처에 무작위 잡음을 뿌려 가짜 질의 를 잔뜩 만든 뒤, 그 질의의 실제 최근접 이웃 를 정답으로 삼는다.
즉 Projector는 "이 근방의 질의가 들어오면 데이터베이스의 어느 지점으로 스냅되어야 하는가"라는 규칙을, 데이터베이스 없이도 재현할 수 있도록 통째로 학습해 버린다. 이 망이 있으면 런타임에는 방대한 특징 테이블도, 최근접 이웃 자료구조도 필요 없다.
세 망이 맞물려 도는 한 프레임
세 신경망은 아래처럼 하나의 순환 고리로 결합된다. 평소에는 Stepper가 상태를 굴리고, 사용자 입력과의 어긋남이 커지면 Projector가 새 상태로 스냅하며, 화면에 그릴 때만 Decompressor가 완전한 포즈를 복원한다.
정리하면, 데이터베이스 검색은 Projector가, 프레임 전진은 Stepper가, 포즈 복원은 Decompressor가 맡는다. 세 함수 모두 입력과 출력이 명확한 사상(mapping)이므로, 완전연결 신경망 정도의 단순한 구조로도 충분히 근사된다. 실제 논문에서는 각 망이 몇 개의 은닉층을 가진 소박한 MLP다.
왜 메모리가 수십 배 줄어드는가
원래 모션 매칭의 저장 비용은 프레임 수 에 큰 포즈 차원 를 곱한 에 비례한다. 관절이 많고 데이터가 길수록 이 값은 걷잡을 수 없이 커진다. 반면 Learned Motion Matching이 들고 다니는 것은 세 신경망의 가중치뿐으로, 그 크기는 데이터베이스 프레임 수 과 무관하다. 데이터를 늘려 품질을 높여도 런타임 메모리는 거의 그대로다. 저자들은 이 방식으로 원본 대비 메모리를 크게 줄이면서도, 눈으로 구분하기 어려울 만큼 원래 모션 매칭에 가까운 품질을 유지했다고 보고한다.
흥미로운 점은, 이 접근이 "신경망으로 애니메이션을 새로 생성"하는 것이 아니라 "이미 잘 작동하는 시스템의 각 단계를 함수로 보고 그 함수만 학습"한다는 데 있다. 덕분에 아티스트가 다루던 데이터와 파이프라인, 반응성 좋은 모션 매칭의 장점은 그대로 두면서, 병목이던 메모리와 검색 비용만 신경망으로 덜어낸다. 검색·전진·복원이라는 세 동사를 각각 하나의 망으로 번역한 것 — 이 논문의 아이디어를 한 문장으로 줄이면 그렇다.
출처
리깅 파이프라인 자동화 도구
반복 작업은 스크립트에게. 현업에서 쓰는 리깅 툴 모음.
리깅 도구 보기