Cave
#ai-dev

LLM with Animation - 1

LLM으로 휴머노이드 Animation을 생성하는 원리

Live2D를 이용한 VTuber를 만들며 기본적인 백엔드에 해당하는 Perception(인지)Cognition(사고) 보다는 Behaviour(행동) 에 초점을 맞춰 작업하고 있습니다. Live2D 캐릭터의 애니메이션을 LLM으로 제어하는것이 목표인데, 개별 chunk들의 공통점을 기반으로 그룹화를 시키고 해당 그룹별로 duration과 target value를 통한 보간을 처리하는 방법을 생각하고 있었는데 곰곰히 생각해보면 최근에 휴머노이드 애니메이션도 AI가 만들어주는 서비스들을 많이 볼 수있습니다.

여기서 생각드는건 휴머노이드도 마찬가지로 어느 그룹화되어있는 데이터를 제어하는 방식으로 거의 동일할것으로 생각드는데, 세부적으로 어떻게 관절을 자연스럽게 움직이게 할지와 같은 요소를 어느정도 제어하고 있다는 소리인데 기본적인 휴머노이드 애니메이션을 생성해보고 어떤방식으로 생성되는지 - 어떻게 애니메이션 처리를 진행하는지와 메타데이터가 어떤식으로 관리되고 있는지를 파악해보겠습니다.

12

Real-time Animation Generation and Control on Rigged Models via Large Language Models 이라는 논문을 기반으로 알아보겠습니다. 해당 논문은 추후에 ai-paper에 따로 정리를 할수도 있긴한데 논문 내용자체가 간단하다보니 작성을 안할 가능성이 더 높을것 같네요.

정말 심플하게도 딱 두개만 보면 됩니다.

pviR3p_v^i \in \mathbb{R}^3 는 애니메이션을 표현할 시간 tit_i 에서 관절 vv 의 position의 정보이고

qviR4q_v^i \in \mathbb{R}^4 는 애니메이션을 표현할 시간 tit_i 에서 관절 vv 의 quaternion 정보입니다.

간단히 말하면 유니티 Animation Window에서 볼수있는 개별 스냅샷이라고 볼수있습니다. 따라서 이 모든 스냅샷들을 생성합니다. 추가적으로 이 모든 스냅샷들을 모아서 어떻게 보간하는지 궁금했는데 단순히 스냅샷만 생성하고 이후의 보간은 유니티 Animation의 기본값을 따라갑니다. 즉 Clamped Auto 상태로 동작합니다.

LLM의 결과 데이터는 아래와 같은 구조를 가집니다.

Armature/Root/Spine1/Spine2/Spine3/Spine4/Tail, (0.0,0.0,0.0,0.0,1.0), (0.7,-0.3,0.0,0.0,1.0),
(1.1,-0.6,0.0,0.0,1.0), (1.7,0.3,0.0,0.0,1.0), (2.3,0.6,0.0,0.0,1.0), (2.8,0.0,0.0,0.0,1.0)

Armature/Root/Spine1/Spine2/Spine3/Spine4/Tail/Tail_end, (0.0,0.0,0.0,0.0,1.0), (0.7,-0.4,0.0,0.0,1.0),
(1.1,-0.8,0.0,0.0,1.0), (1.7,0.0,0.0,0.0,1.0), (2.3,0.8,0.0,0.0,1.0), (2.8,0.0,0.0,0.0,1.0)

제일 첫번째로 주어지는 문자열은 해당 애니메이션을 제어할 관절을 의미하고 그 이후에 ()으로 묶여있는건 해당 애니메이션이 시작할 tt 이고 뒤는 Quaternion 정보를 담고있습니다. 즉 위 예시 에서는 0.7초 1.1초 1.7초 2.3초 2.8초에 키프레임을 가지는 R4\mathbb{R}^4 정보입니다. 점프와 같은 Position은 Root만 제어하며, 점프와 같은 액션들을 담당할때 처리합니다.

마치며

Live2D도 휴머노이드와 같이 캐릭터를 제어하는 특정 파라미터가 존재하고, 그 파라미터들을 제어할수있는 여러 방법이 있으니 해당부분을 잘 이용하고 Few-shot을 포함한 프롬프트를 제공한다면 원하던 결과를 출력할 수 있을것 같습니다. 우선은 몸을 움직이는것 보다는 상체와 얼굴, 표정을 자연스럽게 제어하는걸 목표로 작업해 볼 예정입니다.

Comments