시작하기전에..
요즘 상용 엔진에서는 기본적으로 지원하는 애니메이션 재활용 기법인 Retargeting을 구현하는 과정에서의 아이디어를 정리해보려한다. 사실 요즘 상용엔진을 사용하지 않고 네이티브로 구현할 일이 얼마나 있을지는 잘 모르겠지만.. 나중에 다시 구현해야할 일이 있을 경우 동일한 실수를 반복하지 않기 위해...
Skeletal Mesh의 Bone 구조가 다르거나 Bone의 Base Pose가 다른 경우 Animation을 재활용 할 수 있을까?
먼저 애니메이션이 어떻게 처리되는지 생각해보자.
기준이되는 모델의 각 노드별 Local Transform에 대한 Base Pose를 기준으로 각 애니메이션 트랙 내의 프레임에서 표현되는 키값은 변화한 각 노드들의 로컬 공간에서의 변화량에 대한 정보를 의미한다.
예를 들어 Skeletal Mesh A와 Skeletal Mesh B의 Bone의 계층 구조는 같지만 각 본의 Base Pose가 다르다면 Skeletal Mesh A의 애니메이션을 Skeletal Mesh B에 그대로 재활용 하였을때 정상적으로 출력이 될까?
의도한 Skeletal Mesh A의 애니메이션 동작과 유사해 보이겟지만 실제 원하는 애니메이션이 출력되기는 어렵다. Base Pose가 다르기에 Skeletal Mesh A의 Base Pose 기준으로 표현된 애니메이션이므로 Skeletal Mesh B에서는 정상적인 애니메이션 처리가 되지 않기 때문이다.
이외에도 계층 구조가 Skeletal Mesh A의 본 구조를 포함하지만 추가 본이 있는 Skeletal Mesh B가 있을 경우에도 애니메이션을 단순 대입으로 재활용시 문제가 동일하게 발생한다.

본 구조가 동일하되 Local Pose만 다른 경우 단순한 보정만 처리해준다면 아래와 같은 동일한 동작의 애니메이션 처리가 가능하다.
다만, 본 구조가 다른 경우는 좀 더 복잡한데 원본 애니메이션에 없는 본이 있는 경우 해당 본에 대한 애니메이션 처리는 어떻게 진행해야 할까?
최하위 본이 추가되지 않은 이상 중간에 디테일 본이 추가된 경우 단순히 해당 본의 애니메이션 데이터가 없이 상위 본의 변화량만 반영한다면 원본 애니메이션과 다른 결과가 나올 확률이 높다. 이런 경우 정보가 없는 본의 애니메이션을 어떻게 생성해야 할까?
예를 들자면 기존의 모델의 규격은 아주 오래전에 제작되어 매우 적은 본을 사용하였기에 손가락의 표현 및 어깨와 허벅지 부분이 캔디 래핑이 심하여 디테일 본을 추가해서 제작해야하는 상황인 경우 기존의 애니메이션을 재사용 하는 방식에 대해 고민이 필요하다.

Animation Retargeting 방식에 대한 아이디어
하위 링크의 Nvidia의 Animation Retargeting 관련 자료를 보면 이해하기가 쉽다.
https://www.nvidia.com/en-us/on-demand/session/gtcspring22-s41482/
Deep Dive: One Click Animation Retargeting in Omniverse | GTC Digital Spring 2022 | NVIDIA On-Demand
Animation retargeting has been a challenge for many years while the demand of diverse characters and use cases are increasing tremendously outside of the t
www.nvidia.com
본의 구조 내에서 시작 지점과 끝지점으로 이루어진 체인을 설정하여 중간에 삽입된 본의 위치를 유추하는 방식이다.
원본 Animation의 Skeleton을 기준으로 시작과 끝 지점(End Effector)을 체인 형태로 매핑하여 범위를 설정해준다. 설정한 각각의 체인의 시작 지점부터 끝지점 까지의 범위를 [0~1]로 가정하면 Retargeting 대상 Skeleton의 중간에 추가된 본에 대한 Keyframe을 예측할 수 있다.
원본 체인과 타겟 체인의 길이가 다른 경우 체인 단위로 분할해두었기에 시작과 끝 지점의 길이에 대한 보정이 가능하다. 원본 체인의 시작 지점부터 끝 지점의 길이에 대한 타겟 체인의 길이의 비율을 반영하게 된다면 성인의 애니메이션을 아이의 모델에 반영할 수 있게 된다.
Rigging Chain 구조

이러한 예측 방식은 IK(Inverse Kinematics)와 동작 방식이 비슷하다. 위 그림에서 T(Target)의 Skeleton과 S(Source)의 Skeleton이 있다고 할 때, 각각 [A,B] & [B,C] 두개의 체인을 구성하였다고 하자.
T는 체인 중간에 AB, BC 본이 있고 해당 본은 S에는 없는 본이다.
체인의 시작 지점에서 중간본까지의 길이와 중간본에서 체인 끝 지점까지의 길이는 애니메이션이 진행된다 하더라도 변하지 않기에 IK 방식으로 AB, BC의 위치를 계산할 수 있다.
IK 방식의 원리에 대해선 하위 블로그에 설명이 잘 되어있다.
IK (Inverse Kinematics)
IK는 Inverse Kinematics의 약자로, 번역하자면 역운동학입니다. 사전적인 말로는, '어떤 데이터...
blog.naver.com


완벽히 원본과 일치할 수도 있고 일치하기 힘든 구조인 경우도 있을 것이다.
어짜피 Animation Retargeting은 인게임에서 런타임에 진행이 되는 것이 아닌, 툴에서 사전에 계산된 애니메이션 데이터를 재활용 하기 위한 기법이므로 지정한 오차 범위 내의 결과가 나올때까지 IK 재연산을 진행하거나 수동으로 해당 본의 로컬 오프셋을 반영하는 방법이 있을 수 있다.
Animation Constraint란?
Animation Constraint는 기존 키프레임 애니메이션의 여러 한계점을 해결하기 위해 개발되었다. 제약 조건이 도입되기 전에는 애니메이터가 객체의 모든 변형(위치, 회전, 크기 조절)을 수동으로 설정해야 했다. 심지어 예측 가능하거나 종속적인 동작(ex: 카메라가 캐릭터를 따라가거나 캐릭터의 손이 움직이는 객체에 닿아 있는 동작)을 따라야 하는 경우에도 마찬가지였다. 이는 시간이 많이 걸리고 관리하기 어려웠으며, 특히 복잡한 장면에서는 더욱 그랬다.
3D 게임에서의 캐릭터만 생각해봐도 캐릭터의 손목을 돌렸을때 Constraint가 없는 Rigging 구조에서는 하위 본의 회전이 일어난다 하더라도 상위 본에 영향을 주지 않고 해당 본에 대한 가중치가 매핑된 폴리곤만 회전이 반영될 것이다. 이렇게 된다면 특정 각도를 넘어갈 수록 캔디래핑 현상이 발생되기 쉽다. 현실에서 사람의 손목이 돌아갈 경우 상위 본인 팔꿈치에도 영향이 간다는 것을 확인할 수가 있다. 이를 해결하기 위해 헬퍼 본 즉, Constraint Bone을 활용하여 회전의 반영 방식에 대한 트릭을 주어 해결할 수 있으며 그 외에도 IK 및 여러 상황에 대한 처리를 보다 유연하게 해결할 수 있다.
3ds MAX Document에 기술되어 있는 Constraint 관련 설명을 읽어보면 각 기능별 상황에 맞는 형태를 사용하는데 도움이 된다.
https://help.autodesk.com/view/3DSMAX/2024/ENU/?guid=GUID-10AC3D82-523D-4670-8240-D6E3AC79F0BF
Help
help.autodesk.com
Constraint Bone의 형식
3ds MAX 기준 Constraint Bone 중 캐릭터 Rigging에 주로 사용하는 두 가지 형식에 대해 정리해보려한다.
LookAt Constraint

LookAt 형식은 Up Node와 LookAt Node를 링크해줘야하는데 Up Node가 해당 Node의 Up Vector가 되며, LookAt Node가 Forward Vector가 되어 해당 노드의 Rotation을 설정한다. 상위 본까지의 중첩된 Transform을 반영을 하되 해당 본의 Local Space에서 Up Node와 LookAt Node에 대한 회전 처리를 진행한다.
Orientation Constraint

Orientation 형식은 링크된 Node들의 Local 회전값의 평균을 해당 노드에 반영하는 방식이며 링크된 Node들은 가중치를 설정하며 가중치가 반영된 회전값의 합에대한 평균을 해당 노드의 Rotation으로 설정하는 방식이다.
Constraint Bone Retargeting 방식
Model Tool (ex: 3ds MAX, Blender...)에서 Constraint Bone을 사용하여 Animation Keyframe을 추출하였다면 해당 노드의 Keyframe 데이터 기반으로 Regargeting시 문제가 생길 가능성이 높다.
해당 노드의 고유한 Keyframe이 아닌 해당 노드에 연결된 Target Bone을 기반으로 사전에 계산된 Keyframe이므로 Target Bone에 대한 Retargeting이 실행된다면 Target Bone의 위치가 변경되기에 Retargeting 처리가 끝난 Rigging 구조에서의 Constraint Bone에 대한 재연산을 통해 Keyframe을 다시 생성해주어야 정상적인 Skinning 처리가 될 것이다.
References
https://www.nvidia.com/ko-kr/on-demand/session/gtcspring22-s41482/
https://wickedengine.net/2022/09/animation-retargeting/
https://dev.epicgames.com/documentation/ko-kr/unreal-engine/ik-rig-in-unreal-engine
https://dev.epicgames.com/documentation/ko-kr/unreal-engine/ik-rig-solvers-in-unreal-engine
'Graphics' 카테고리의 다른 글
| Animation Compression (0) | 2025.04.22 |
|---|---|
| Texture Block Compression (0) | 2025.04.15 |
| [DirectX 11] Dissolve Effect (0) | 2022.06.27 |
| [DirectX 11] Color Grading & LookUpTable Texture (0) | 2022.06.23 |
| [DirectX 11] HDRI Sky Light & Sky Cube Baking (0) | 2022.05.25 |