스켈레탈 애니메이션

편집 역사 토론
게임 개발 컴퓨터 그래픽스 마지막 수정: 2026-07-17 04:23:08

1. 개요[편집]

스켈레탈 애니메이션
Skeletal Animation
별칭리깅, 스키닝, 본 애니메이션
핵심 자료구조본 계층 + 스킨 가중치
표준 스키닝선형 블렌드 스키닝(LBS)
회전 표현사원수

정점 5만 개를 일일이 움직일 것인가, 뼈 60개를 움직이고 나머지는 GPU에게 맡길 것인가.

스켈레탈 애니메이션(skeletal animation)은 캐릭터 메시를 정점 단위로 직접 움직이는 대신, 내부에 계층 구조를 이루는 가상의 뼈대(skeleton)를 넣고 뼈의 변환에 메시 정점을 종속시켜 변형하는 기법이다. 애니메이터는 뼈 수십 개의 회전만 다루면 되고, 정점 수만 개는 그 결과를 따라 자동으로 끌려간다.

발상 자체는 해부학적이지만 본질은 자유도 축소다. 정점 5만 개짜리 메시의 원래 자유도는 15만인데, 뼈 60개로 표현하면 6백 정도로 줄어든다. 이 구도는 축소차수모델이 수십만 자유도의 유한요소 모델을 모드 몇 개로 압축하는 것과 정확히 같은 종류의 트릭이다. 다만 이쪽 기저는 POD로 뽑는 게 아니라 아티스트가 손으로 심는다.

2. 뼈대와 계층[편집]

스켈레톤은 본(bone, 정확히는 joint)의 트리다. 각 본은 부모에 대한 상대 변환 Tlocal\mathbf{T}_{\text{local}}을 갖고, 루트에서 내려오며 곱해서 월드 변환을 만든다.

Miworld=Mparent(i)worldTilocal\mathbf{M}_{i}^{\text{world}} = \mathbf{M}_{\text{parent}(i)}^{\text{world}} \, \mathbf{T}_{i}^{\text{local}}

트리 순회 한 번이면 전부 계산되므로 비용은 본 개수에 선형이다. 이 사슬 구조 덕에 어깨를 돌리면 손끝까지 딸려오는 것이 공짜로 얻어진다 — 그리고 같은 이유로 어깨 본의 스케일을 잘못 건드리면 손이 우주로 날아간다.

실제로 스키닝에 쓰이는 건 월드 변환이 아니라 스킨 행렬이다. 메시는 바인드 포즈(보통 T-포즈)로 저장되어 있으므로, 정점을 일단 본의 로컬 공간으로 되돌린 뒤 현재 포즈로 다시 보내야 한다.

Si=Miworld(Biworld)1\mathbf{S}_i = \mathbf{M}_{i}^{\text{world}} \left( \mathbf{B}_{i}^{\text{world}} \right)^{-1}

여기서 Bi\mathbf{B}_i는 바인드 포즈에서의 본 월드 변환이고, 그 역행렬을 미리 구워둔 것이 흔히 말하는 인버스 바인드 행렬이다. 런타임에 역행렬 계산 같은 건 하지 않는다.

2.1. 왜 사원수인가[편집]

본의 회전은 거의 항상 사원수로 저장한다. 이유는 셋이다. 오일러각은 짐벌락에 걸리고, 회전 행렬은 9개 값을 저장하면서 직교성이 수치적으로 야금야금 무너지며, 무엇보다 보간이 안 예쁘다. 사원수는 4개 값에 slerp로 최단 호를 따라 등속으로 보간되며, 정규화 한 번이면 드리프트가 정리된다. 이동은 벡터로, 스케일은 따로 — 이 (T, R, S) 삼종 세트가 키프레임의 표준 단위다.

3. 스키닝[편집]

정점을 실제로 변형하는 단계. 표준은 선형 블렌드 스키닝(Linear Blend Skinning, LBS)이고, 스무스 스키닝 또는 SSD라고도 부른다. 정점 v\mathbf{v}에 영향을 주는 본들의 스킨 행렬을 가중 평균한다.

v=iwiSiv,iwi=1,  wi0\mathbf{v}' = \sum_{i} w_i \, \mathbf{S}_i \, \mathbf{v}, \qquad \sum_i w_i = 1, \; w_i \ge 0

정점 셰이더 몇 줄로 끝나는 데다 정점마다 완전히 독립이라 GPU에서 부끄러울 만큼 잘 병렬화된다. 실무에서는 정점당 영향 본을 4개로 자르는 것이 사실상 표준이다 — 인덱스 4개와 가중치 4개가 정확히 각각 벡터 레지스터 하나에 들어맞기 때문.

3.1. 캔디 래퍼[편집]

LBS의 유명한 약점. 행렬을 선형 보간하면 그 결과는 회전 행렬이 아니다. 팔꿈치를 180° 비틀면 두 스킨 행렬의 평균이 특이(singular)에 가까워지면서 메시가 사탕 포장지처럼 쭈그러든다. 이걸 캔디 래퍼(candy wrapper) 아티팩트라 하고, 어깨·손목에서 부피가 꺼지는 볼륨 손실도 같은 뿌리다. 원인이 “회전군 SO(3)SO(3)은 볼록집합이 아니다”라는 순수 수학이라 파라미터 조정으로 없어지지 않는다.

처방은 크게 세 갈래.

방법원리비용
듀얼 쿼터니언 스키닝(DQS)강체 변환을 듀얼 쿼터니언으로 두고 그 위에서 블렌딩LBS 대비 약간 비쌈
헬퍼 본문제 관절에 보조 본을 넣고 회전각의 절반만 따라가게거의 공짜, 리깅 노동 발생
보정 블렌드셰이프관절 각도로 구동되는 교정 모프 타겟데이터 큼, 품질 최상

DQS는 Kavan 등(2007)이 정리해 지금은 주요 엔진에 다 들어 있다. 비틀림에서 부피를 지켜주지만 굽힘에서 근육이 부푼 듯한 벌징(bulging)이 생기는 대신이라, “LBS면 꺼지고 DQS면 부푼다”는 선택지 앞에서 아티스트는 결국 둘을 섞는다.

4. 애니메이션 재생과 블렌딩[편집]

키프레임은 본별 (T, R, S) 트랙으로 저장되고, 재생 시각에 맞춰 앞뒤 키를 보간한다. 위치·스케일은 선형, 회전은 slerp. 곡선을 촘촘한 키 대신 베지어 곡선 같은 곡선 핸들로 저장하는 것도 흔하다.

여러 클립을 섞는 것이 실무의 본체다.

  • 블렌드 트리 / 블렌드 스페이스 — 걷기와 뛰기 클립을 속도에 따라 가중 혼합. 2D 블렌드 스페이스면 (전후 속도, 좌우 속도) 평면 위 삼각분할(들로네 삼각분할이 실제로 쓰인다)로 가장 가까운 클립 셋을 골라 무게중심 좌표로 섞는다.
  • 레이어 마스킹 — 하체는 달리기, 상체는 사격. 본 서브트리별로 다른 클립을 얹는다.
  • 가산 애니메이션(additive) — 기준 포즈와의 차이만 저장해 위에 더한다. 숨쉬기, 피격 반응.
  • 역운동학 — 재생된 결과를 후처리로 보정. 계단에서 발을 실제 지면 높이에 붙이는 풋 IK가 대표적이며, 이게 없으면 캐릭터는 경사면을 발목까지 담그고 걷는다.
  • 래그돌 전환 — 죽는 순간 애니메이션을 끄고 본 계층에 대응하는 강체 동역학 관절 사슬로 넘긴다. PhysXHavok 같은 물리 엔진이 그다음을 맡는다. 물리와 애니메이션 사이를 부드럽게 오가는 것(파워드 래그돌)이 아직도 난제다.

포즈 데이터의 출처는 손으로 키를 찍는 것 아니면 모션 캡처다. 캡처 데이터는 리타게팅 — 배우 골격을 캐릭터 골격에 맞추는 작업 — 이 필요하고, 여기서 뼈 길이 비율이 어긋나면 손이 벽을 뚫는다.

5. 성능[편집]

스키닝은 매 프레임 모든 정점에 대해 도는 계산이라 군중 시뮬레이션처럼 캐릭터가 수백 나오는 장면에서는 무시 못 할 비용이 된다.

  • GPU 스키닝 — 스킨 행렬 팔레트를 상수 버퍼나 텍스처로 올리고 정점 셰이더에서 변형. 기본값.
  • 인스턴싱 + 애니메이션 텍스처 — 포즈 시퀀스를 텍스처에 구워 수천 인스턴스를 드로우콜 하나로. 개별 블렌딩은 포기해야 한다.
  • 컴퓨트 스키닝 — 변형 결과를 버퍼에 한 번 쓰고 그림자 패스와 재사용. 패스가 여러 개면 이익이 난다.
  • 본 LOD — 먼 캐릭터는 손가락 본을 통째로 죽인다. 어차피 두 픽셀이다.

6. 현업에서의 현실[편집]

  • 리깅은 3D 파이프라인에서 가장 저평가된 공정이다. 잘된 리그는 아무도 언급하지 않고, 못된 리그는 프로젝트 내내 욕을 먹는다.
  • 스킨 가중치 페인팅은 자동 도구(하모닉/열확산 기반 — 사실상 라플라스 방정식을 메시 위에서 푸는 것이다)로 시작해서 결국 손으로 다듬는다. 겨드랑이와 사타구니에서 자동 도구는 늘 진다.
  • 스케일 본은 가급적 건드리지 않는 게 좋다. 비균일 스케일이 계층을 타고 내려가면 자식 본이 전단(shear)되고, 그 순간 쿼터니언 가정이 깨진다.1
  • 본 개수 예산은 아직도 존재한다. 손가락 다 살리면 손만 30본이고, 화면에 서른 명 나오면 그게 900본이다.2
  • “캐릭터 팔꿈치가 이상해요” 티켓의 대부분은 캔디 래퍼다. 그리고 그 대부분은 헬퍼 본 하나로 끝난다.3

7. 관련 문서[편집]

8. Footnotes[편집]

  1. 회전+이동만 있으면 변환이 강체라 쿼터니언으로 깔끔하게 표현되지만, 비균일 스케일이 끼면 일반 아핀 변환이 되어 “회전을 보간한다”는 전제 자체가 무너진다. 그래서 많은 엔진이 스케일을 별도 채널로 빼두고 계층 전파 규칙을 따로 정의한다. 규칙이 엔진마다 달라서, FBX를 다른 엔진으로 옮길 때 캐릭터가 납작해지는 고전적 사고의 주범이기도 하다.

  2. 그래서 손가락은 LOD1에서 가장 먼저 학살당한다. 슬프지만 2미터 밖의 새끼손가락 두 번째 마디를 알아보는 사람은 QA 팀에도 없다.

  3. 헬퍼 본이 “회전각의 절반만 따라가는” 이유는, 비틀림을 두 관절에 나눠 각각의 블렌딩 각도를 줄여 선형 보간의 오차를 작게 만들기 때문이다. 원리를 알고 나면 우아하지만, 처음 배울 땐 그냥 “0.5 곱하면 예뻐지는 마법 숫자”로 외우게 된다.