안녕하세요, 저는 에픽게임즈의 애니메이션 테크니컬 프로덕트 매니저 제레미아 그랜트(Jeremiah Grant)입니다. 이번 블로그에서는 언리얼 엔진 5 얼리 액세스 프로젝트, 에인션트의 협곡의 막바지에 조우하게 되는 거대 로봇 '에인션트 원'의 리깅과 애니메이팅에 사용된 사고방식, 구현 및 툴에 대해 설명합니다. 애런 심즈 크리에이티브 컴퍼니(Aaron Sims Creative Company)와 함께 협력하여 탄생한 에인션트 원은 나나이트와 언리얼 엔진 5 얼리 엑세스에서 100% 진행한 애니메이션 기능을 활용하여 애니메이션 및 리깅 시스템의 한계를 시험하고자 제작되었습니다.
그럼 시작하겠습니다.
블루프린트 구축
에인션트 원을 구상할 때는 나나이트를 사용하여 이 피조물에 기하학적 디테일을 더할 계획이었습니다. 그러면서 다양한 디자인 및 워크플로를 고려하게 되었습니다. 스켈레탈 메시 및 기존의 스킨 방식에 의존하는 대신, 이 로봇은 블루프린트를 통해 스켈레톤에 어태치된 고해상도 나나이트 메시에 분명하게 표현되도록 디자인되었습니다. 즉, 모든 표현 요소는 고유 메시가 되어야 했으며, 이에 따른 혼란을 피하려면 아주 잘 정의된 체계가 필요했습니다.
그래서 명확한 명명 규칙과 폴더 구조를 사용한 레벨 구축 방식과 비슷한 접근법을 통해 이 체계 문제를 다루었습니다. 특정 명명 규칙을 따르는 각 메시 엘리먼트는 스켈레톤의 본 이름과 함께 짝지어졌습니다. 지오메트리와 머티리얼은 신체 영역별로 폴더를 구성하여 머리, 쇄골, 다리 등 프로젝트 체계를 쉽게 탐색할 수 있도록 했습니다. 이런 접근법을 취한 덕분에 BP_AncientOne의 간단한 함수를 사용하여 지오메트리를 스켈레톤에 어태치할 방식을 신속하게 파악할 수 있었습니다. 이는 동일한 함수가 새로 추가되는 지오메트리와 본을 자동으로 어태치하였습니다.
AttachMeshesToRig 함수는 블루프린트 내 BodyParts의 모든 자손을 단순히 반복작업하면서 컴포넌트에 '컴포넌트 붙이기'를 사용합니다. 릭에 새 지오메트리를 추가하기 위해 우선 지오메트리를 언리얼 엔진으로 임포트한 다음 BodyParts 컴포넌트 아래로 드래그했습니다.
BP_AncientOne의 Rig 함수에 메시를 어태치합니다.
스켈레톤
스켈레톤 자체는 더 적은 손가락을 갖춘 동일한 기본 계층 구조를 사용하면서, 트위스트(AncientOne_skeleton_Skeleton)와 같은 교정형 본을 제거한 메타휴먼 스켈레톤으로부터 파생되었습니다. 이 스켈레톤은 마야(Maya)에서 적절한 비율로 수정되었으며, 언리얼 엔진에서 나나이트 메시를 어태치할 수 있는 스켈레탈 메시를 생성하고자 간단한 큐브로 스키닝되었습니다. 메타휴먼 스켈레톤을 기반으로 사용했다는 것은 곧 메타휴먼 컨트롤 릭을 즉시 사용하여 언리얼 엔진에서 애니메이션 작업을 시작할 수 있다는 뜻입니다. 애니메이션이나 스켈레톤에 큰 영향을 주지 않으면서 캐릭터의 반복작업을 더 쉽게 만들기 위해 이 로봇은 메타휴먼과 동일한 비율로 제작되어 엔진에서 스케일 조정을 거쳤습니다. 덕분에 환경과 캐릭터 상호작용 스케일에서 상당한 유연성을 확인할 수 있었습니다.
모든 메시를 어태치한 에인션트 원의 스켈레톤
컨트롤 릭
언리얼 엔진 5 얼리 액세스에서는 현재 컨트롤 릭 에디터에서 스태틱이 또는 나나이트 메시의 시각화가 불가능합니다. 컨트롤 릭은 항상 평가를 하기 때문에 저희는 릭을 레벨 내에 배치하고 컨트롤 릭을 변경하는 방식으로 테스트했습니다. 릭 변경 사항은 컴파일을 통해 업데이트되고 전파되므로, 5천만 개에 달하는 트라이앵글 메시의 릭 퍼포먼스를 실시간으로 시각화 및 테스트할 수 있습니다.
왼쪽: 레벨 에디터, 오른쪽: 컨트롤 릭 에디터
로봇에 사용할 컨트롤 릭을 만들기 위해 우선 메타휴먼 프로젝트의 컨트롤 릭을 바탕으로 AncientOne_Body_CtrlRig에 몇 가지 수정을 가했습니다. 우선 릭 계층구조와 프리뷰 메시를 새 지오메트리에 맞게 업데이트했습니다. 릭 계층구조는 우클릭 후 '계층구조 새로고침'을 선택한 다음 올바른 스켈레탈 메시를 골라서 업데이트할 수 있습니다. 그러면 컨트롤, 스페이스 및 커스텀 본 등 나머지 릭 계층구조는 그대로 유지하면서 스켈레탈 계층구조가 업데이트된 버전으로 대체됩니다.
컨트롤 릭에는 이벤트 설정(Setup Event), 정방향 솔브(Forward Solve), 역방향 솔브(Backward Solve)의 세 가지 모드가 있습니다. 메타휴먼 릭에서 이벤트 설정은 임포트한 릭 계층구조의 모든 컨트롤을 적용하여 해당 릭을 재사용할 수 있게 만들어줍니다. 이는 본의 초기값을 읽고, 컨트롤 오프셋 트랜스폼을 설정하고, 스켈레톤의 적절한 위치에 컨트롤을 배치하는 식으로 이루어집니다. 이건 사용자 생성 그래프이므로 폴 벡터의 위치 정의, FK 및 IK 컨트롤의 배치, 또는 그래프에서 나중에 사용할 수 있는 초기값 설정 등의 복잡한 작업도 가능합니다.
메타휴먼 컨트롤 릭은 대칭 캐릭터를 상정하고 있기 때문에 비대칭 로봇 제작에서는 몇 가지 변경이 이루어졌습니다. 저희는 이벤트 그래프 구성에서 왼쪽 팔 구성 섹션을 복제해 필드를 적절한 정보로 채운 뒤 그래프에 연결했습니다. 또한 정방향 및 역방향 솔브 그래프에서는 손가락 본을 참조하는 항목 컬렉션이 이벤트 구성 시작점의 변수 세트를 참조하도록 변경했습니다. 덕분에 캐릭터를 제작할 때도 여러 군데에서 변경 사항을 만들 필요 없이 참조되는 손가락 수를 쉽게 변경할 수 있었습니다.
왼쪽 다리, IK, FK 및 폴 벡터 컨트롤 배치를 위한 이벤트 그래프 구성
기본 메타휴먼 컨트롤 릭에 대한 변경 사항 외에, 직접 애니메이션을 적용해야 할 판금 장갑에도 컨트롤이 추가되었습니다. 애니메이션 팀에서 구체적으로 요청한 것 중 하나는 바로 팔의 기본 설정을 FK가 아닌 IK로 해달라는 것이었습니다. 이 부분은 IKFK 컨트롤의 초기 부울 값을 arm_l_fk_ik_switch 및 leg_l_fk_ik_switch 등으로 변경하는 방법을 통해 쉽게 처리할 수 있었습니다.
에인션트 원은 절차적으로 구동하고자 했던 내부 메커니즘 및 모션을 다수 갖추고 있어, 애니메이터의 작업량을 줄이고 시네마틱과 게임플레이 간 애니메이션 컨텍스트에서 절차적 애니메이션 워크플로를 테스트할 수 있었습니다. 또한 캐릭터의 자동 구동 요소를 추가하기 위해 메타휴먼 릭을 확장하는 대신 절차적으로 구동되는 메커니즘을 전부 별도의 컨트롤 릭( AncientOne_Mechanics_CtrlRig)으로 나누고 이를 스켈레탈 메시 에셋 디테일(AncientOne_Post_AnimBP)의 '포스트 프로세스 애님 블루프린트' 세팅에 할당된 포스트 프로세스 애니메이션 블루프린트에 추가했습니다. 포스트 프로세스 애니메이션 블루프린트는 레벨 시퀀스나 스테이트 머신까지 모든 게 프로세스된 뒤 평가에 들어갑니다. 즉, 릭이 시퀀서에서 애니메이팅되든 포격 애니메이션을 재생하든 상관없이 모든 절차적 애니메이션이 실행된다는 것입니다.
팔의 피스톤, 톱니바퀴, 후방 갑옷 등의 요소들이 절차적으로 애니메이팅됩니다.
언리얼 5 얼리 액세스에서는 컨트롤 릭에 함수를 도입합니다. 덕분에 로봇의 어깨나 가슴에 부착된 피스톤처럼 릭의 다양한 부위에서 비헤이비어를 쉽게 구분하고 재사용할 수 있습니다.
clavicle_pistons 함수를 보면 그 구조 방식을 알 수 있습니다. 두 개의 항목 집합이 전달되는데, 하나는 피스톤의 시작 본, 하나는 끝 본에 사용됩니다. 함수에서 시작 본과 끝 본은 이름이 일치하면서 서로를 가리키게 됩니다. 모든 항목이 루프되고 나면, 이 함수는 릭 그래프의 다음 노드까지 이동하기 전에 최종 포즈를 반환합니다. 이 함수를 다른 피스톤 그룹에 재사용한 덕분에 더 작지만 가독성은 높은 그래프를 갖추면서 단일 위치에서 모든 문제를 수정할 수 있게 되었습니다.
AncientOne_Mechanics_CtrlRig의 피스톤 함수는 릭의 피스톤 그룹마다 재사용되었습니다.
피스톤 함수는 입력 퍼포먼스를 기반으로 포즈를 조정하는 그래프의 좋은 사례입니다. 즉 팔이 애니메이팅되는 방식에 따라서 피스톤의 위치를 자동으로 설정한다는 것입니다. 또 다른 함수인 core_gears를 보면 컨트롤 릭 그래프의 또 다른 사용 사례를 볼 수 있습니다. 여기서는 절차적 모션으로 코어 톱니바퀴와 원반들로 시계 같은 움직임을 만들어 냈습니다. Accumulated Time 노드는 저희가 사용하고 다른 노드에 입력할 시간을 생성하여 회전을 구동하거나 사인(sine)에 입력하여 이런 시계 같은 작동을 형성합니다. 이 비헤이비어에 대한 더 높은 수준의 컨트롤을 제공하고자, Accumulated Time 노드의 속력 값에 입력할 gear_weight를 노출시켜 블루프린트를 통해 이 비헤이비어를 비활성화하거나 블렌드 오프할 수 있게 하였습니다. 여기서는 에인션트 원을 물리쳤을 때 이 변수를 사용해 톱니바퀴의 움직임을 블렌드 오프합니다.
core_gears 함수는 절차적 톱니의 움직임에 대한 아트 방향성을 제어할 수 있도록 해 줍니다.
시퀀서에서 애니메이션 적용하기
에인션트의 협곡 개발 목표는 늘 언리얼 엔진 5 얼리 액세스에서 에인션트 원의 퍼포먼스를 최대한 많이 애니메이팅하는 것이었습니다. 언리얼 엔진의 비선형적 애니메이션 툴인 시퀀서가 최근 상당히 향상되면서, 이 프로젝트는 우리의 한계를 뛰어넘을 수 있는 기회를 제공해 주었습니다.
계속해서 발전하고 있는 유틸리티 세트를 활용해, 레벨 에디터에서 애니메이션 릭과 상호작용합니다.
로봇 애니메이션 제작은 레벨에서 레벨 시퀀스를 만들고 BP_AncientOne을 추가하는 것부터 시작했습니다. 여기서 눈여겨볼 점은 컨트롤 릭이 아니라 월드 디테일 패널의 액터 트랜스폼을 사용해서 로봇을 환경에 배치하고 스케일 조정했다는 것입니다. 그런 다음 시퀀서에서 키잉을 통해 항상 정확하게 배치되도록 하였습니다. 즉, 캐릭터의 스케일을 마음대로 조정하면서도 애니메이션 퍼포먼스에는 영향을 전혀 끼치지 않으며, 애니메이션이 항상 액터 위치에 상대적이므로 게임플레이 애니메이션 및 시네마틱 북엔드에서 상대적으로 원점 중심적인 위치를 유지할 수 있는 것입니다. 덕분에 레벨 시퀀스와 애니메이션 블루프린트 간에 매끄러운 블렌딩이 가능했습니다.
레벨 시퀀스를 구성한 다음에는 애니메이션 작업을 시작할 수 있었습니다. 컨트롤 릭 바디 애니메이션을 시퀀서에 추가하려면 BP_AncientOne에서 '+트랙'을 클릭한 뒤, Control Rig > Asset-Based Control Rig > AncientOne_Body_CtrlRig을 탐색하면 됩니다. 컨트롤 릭 트랙을 추가하면 레벨 에디터 모드가 애니메이션 모드로 자동 전환됩니다. 또는, 뷰포트 상단의 툴바에서 '달리는 사람 아이콘'을 클릭해서 직접 전환할 수도 있습니다. 레벨 시퀀스에서 트랙을 확장하면 키잉할 수 있는 컨트롤 목록이 표시되며, 이제 뷰포트에서 조작 및 애니메이션 작업을 할 수 있는 컨트롤도 볼 수 있습니다.
시퀀서에서 로봇을 구성하는 방식
로봇의 기본적인 레벨 시퀀스 구성 방법에 대한 이해를 바탕으로, 게임플레이 애니메이션 레벨 시퀀스의 일부를 살펴볼 수 있습니다. 이 시퀀스는 다음 폴더에서 찾을 수 있습니다. /AncientBattle/Characters/AncientOne/Animations/SourceSequences/SEQ_Robot_Fire 레벨 시퀀스를 실행하면 로봇이 월드 내 적절한 위치에 로드되며, 이 레벨 시퀀스를 미세조정해 포격 애니메이션을 조정할 수 있습니다.
참고: 새 레벨에서 소스 시퀀스를 실행하면 원점이 아니라 메인 레벨에서 스폰되는 곳에 로봇을 로드합니다. 이 오프셋 트랜스폼은 레벨 시퀀스에서 키잉되었습니다.
언리얼 엔진 5 얼리 액세스에서 새로 도입된 애니메이션 유틸리티는 애니메이션 모드 창의 툴바에서 찾을 수 있습니다. 여기서는 뷰포트 모드를 선택 전용 컨트롤로 빠르게 변경할 수 있어서, 다른 월드 오브젝트를 피하면서 레벨 에디터에서 컨트롤을 선택하기가 훨씬 쉽습니다. 또한 여기서는 새로운 포즈 라이브러리(Pose Library), 트윈(Tween) 툴, 스냅퍼(Snapper) 툴 등에도 액세스가 가능합니다. 자세한 정보는 언리얼 엔진 5 얼리 액세스 문서를 참고하세요. 특히 포즈 라이브러리의 경우 프로젝트 개발 시 정말 편리합니다. 애니메이터들은 손 포즈나 대기 포즈 같은 전신 포즈 등 컨트롤 릭 포즈를 미리 만들어 두고 나중에 사용할 수 있었습니다. 또한 포즈는 영향을 주는 컨트롤도 저장하므로 이걸 선택 세트로도 활용하여 자주 조작해야 하는 컨트롤을 빠르게 선택할 수 있습니다. 이 포즈들은 에셋으로 저장되므로 다양한 레벨 시퀀스에서 포즈를 적용할 수 있습니다. 인트로 시퀀스에서 대기 포즈를 조정할 때는 다른 레벨 시퀀스에 이 포즈를 저장하고 붙여넣는 방식으로 다른 애니메이션 상태의 대기 포즈들을 빠르게 업데이트할 수 있었습니다.
포즈 라이브러리는 언리얼 엔진 5에 새로 추가된 애니메이션 유틸리티 중 하나입니다.
레벨 시퀀스에는 4.26부터 도입된 링크된 애니메이션 시퀀스라는 신기능이 있습니다. 링크된 애니메이션 시퀀스를 사용하면 레벨 시퀀스가 저장될 때마다 스켈레탈 애니메이션 시퀀스를 자동 업데이트할 수 있습니다. 즉, 시퀀서에서 애니메이팅할 경우, 다른 툴을 전혀 활용하지 않고도 애니메이션 블루프린트에서 사용할 애니메이션을 자동으로 구울 수 있는 것입니다. 바로 이것이 로봇의 모든 게임플레이 애니메이션 시퀀스 생성에 사용된 주된 방법이었습니다.
링크된 애니메이션 시퀀스를 생성하려면 시퀀서에서 액터를 우클릭 후, BP_AncientOne > 링크된 애니메이션 시퀀스 생성(Create Linked Animation Sequence)을 선택하면 됩니다. 그러면 애니메이션 시퀀스의 저장 위치를 선택하라는 알림이 표시됩니다. 이 링크를 생성한 후 반드시 레벨 시퀀스와 새 애니메이션 시퀀스를 저장하세요.
링크된 애니메이션 시퀀스는 시퀀서 액터 트랙으로부터 생성할 수 있습니다.
링크된 애니메이션 시퀀스를 탐색하려면 시퀀서에서 액터를 우클릭 후 링크된 애니메이션 시퀀스 열기(Open Linked Animation Sequence)를 선택하면 됩니다. 마찬가지로 애니메이션 시퀀스에서 원래 레벨 시퀀스로 이동하려면, 애니메이션 시퀀스 에디터(Animation Sequence Editor) > 시퀀서(Sequencer) 버튼 > 편집(Edit)에서 레벨 시퀀스 열기(Open Level Sequence)를 선택하면 됩니다.
팁: 다양한 애니메이션 상태에 대한 추가 레벨 시퀀스를 생성하려면, 레벨 시퀀스 에셋을 복제한 뒤 키프레임을 깔끔하게 삭제하여 새로 시작하면 됩니다. 복제된 레벨 시퀀스가 애니메이션 시퀀스에 링크되어 있었다면, 잘못된 애니메이션 시퀀스를 실수로 덮어쓰지 않도록 새 링크된 애니메이션 시퀀스를 생성하세요.
링크된 레벨 시퀀스와 결합된 시퀀서에서 컨트롤 릭을 활용하면, 스켈레톤을 변경한 뒤에 애니메이션을 업데이트하기가 정말 쉽습니다. 시퀀서는 본이 아니라 컨트롤을 구동하기 때문에 컨트롤 릭에서 일어나는 모든 변경에 대응합니다. 레벨 시퀀스를 실행했다가 다시 저장하기만 하면 애니메이션 에셋이 업데이트되면서 최신 스켈레톤 변경 사항대로 다시 구워집니다.
풀 바디 IK
마지막으로 우리의 주인공을 노리는 에인션트 원의 포즈를 확장하고 조정하고자 추가된 풀 바디 IK 레이어를 살펴보겠습니다. 이 효과는 애디티브로 설계되어서 애니메이터의 의도를 대체하는 게 아니라 더욱 강화해 줍니다.
풀 바디 IK는 애니메이션이 플레이어에게 반응할 수 있게 하여 애니메이션을 강화합니다.
UE5 얼리 액세스에서 풀 바디 IK 솔버는 더욱 빠르고 쉽게 조작할 수 있도록 향상되었습니다. 풀 바디 IK는 컨트롤 릭의 노드로 액세스 가능하며, CR_AncientOne_ArmAim_CtrlRig에서 찾을 수 있습니다.
이 이펙트를 생성하는 컨트롤 릭 에셋을 살펴보기 전에 트리거 방식부터 살펴보겠습니다. 로봇의 애니메이션 블루프린트 AncientOne_AnimBP는 단순한 스테이트 머신으로 비헤이비어를 제어하며 포즈를 컨트롤 릭으로 보낸 뒤 최종 포즈를 출력합니다. 또한 Control Rig 노드에 전달할 일부 변수를 수집하고 있으며 AlphaCR 플로트 변수를 통해 컨트롤 릭 자체의 블렌드 온/오프를 설정하고자 웨이트 양을 제어하고 있습니다.
암 에이밍(Arm Aiming)은 스테이트 머신이 평가된 후 애니메이션 블루프린트에 의해 제어됩니다.
Alpha_CR 변수에서는 풀 바디 이펙트가 적용될 시점과 Control Rig anim 노드의 Interp 프로퍼티로 블렌드 온/오프 속도를 제어할 수 있습니다. 노드를 선택하고 디테일 패널을 보면 알파 스케일 바이어스 클램프(Alpha Scale Bias Clamp) 섹션을 확인할 수 있습니다. 여기서 사용할 훌륭한 트릭이 있는데, 바로 블렌드 온과 블렌드 오프 비헤이비어 간의 속도를 다르게 하는 것입니다. '보간 속도 증가(Interp Speed Increasing)' 및 '보간 속도 감소(Interp Speed Decreasing)'를 조정하면 됩니다. 컨트롤 릭의 블렌드 온은 빠르지만 블렌드 오프는 느립니다. 이 점은 다음 노드 웨이트 핀 설명에 반영됩니다. FInterp(Alpha, (10:2))
Reach Amount 변수는 로봇이 공격할 때 주인공 에코(Echo)에게 손을 뻗는 범위를 조정하기 위해 설정할 빠른 0-1 플로트 변수를 제공합니다. 이 변수는 게임플레이가 아니라 애님 블루프린트에서 추가적인 아트 디렉팅 제어용으로 설정했던 값에 따라 달라집니다. Laser Location 변수는 레이저가 지면에 닿는 월드 내 위치를 나타냅니다. 이 값은 BP_AncientOne에서 직접 설정되어 컨트롤 릭의 풀 바디 IK의 방향을 지정합니다.
컨트롤 릭은 애님 블루프린트에서 노드를 더블클릭하여 실행할 수 있습니다. 이 그래프는 한눈에 보기에 매우 단순합니다. LaserLocation은 로봇에 상대적인 월드 스페이스로부터 변환되며, actor_transform이라는 컨트롤을 구동하는 데 사용됩니다. 이 컨트롤은 로봇의 공격 위치를 나타내는 데 쓰입니다. 세트 이동 컨트롤을 우회하여 컨트롤을 수동으로 움직이고 컨트롤 릭 에디터에서 로봇을 직접 테스트 및 디버그할 수 있습니다.
암 에임 컨트롤 릭은 함수와 분기를 사용하여 빠른 테스트가 가능합니다.
컨트롤 릭은 기본적으로 풀 바디 IK를 사용하지만, 간소화된 접근법을 나타내고자 BasicIK 베리언트를 포함시켰습니다. AimWithFBIK 노드를 더블클릭하면 풀 바디 IK 이펙트를 생성하는 함수로 통하게 됩니다.
각 로직 섹션별로 코멘트를 갖춘 풀 바디 IK 컨트롤 릭 함수
AimWithFBIK 함수는 데이터 수집, 힙 조정, 도달 방식 계산, 풀 바디 IK 적용, 그리고 마지막으로 핸드 오리엔테이션 조정이라는 여러 부분으로 구성됩니다.
간단히 덧붙이자면 이 구성을 생성하면서 여러 가지를 발견했으며 아직도 사용하지 않은 기능이 몇 가지 남아 있습니다.
함수에서 처음으로 보게 되는 노드는 Entry 노드이고, 그 다음은 Sequence 노드입니다. 보통 Sequence 노드를 사용하여 함수 기능을 로직 단계별로 나누어, 가독성을 높이고 디버그를 수월하게 만듭니다. Sequence 노드의 A핀은 데이터 수집과 힙 조정을 처리합니다. 본 트랜스폼 데이터를 수집하는 데는 Get Transform 노드를 사용하여 제어 중인 Set Transform 노드로 Transform 값을 전달합니다. 컨트롤을 생성하고 그 트랜스폼을 본 트랜스폼으로 설정하는 건 애니메이션 블루프린트의 입력 애니메이션 포즈를 저장하는 훌륭한 방법입니다. 둘 다 매우 시각적으로 표시되는 데다 오류가 발생했을 때도 디버그가 쉽기 때문입니다. 컨트롤에는 본 트랜스폼이 다수 저장되어 있지만, 결국 사용하게 되는 것은 foot_l, foot_r, hand_r 본과 컨트롤입니다.
Get/Set Transform 노드 다음으로 Offset Transform 노드와 전방 골반 작업을 쉽게 해 주는 약간의 로직이 컨트롤에 본을 저장합니다. 본질적인 기능은 레이저가 발사될 때 앞으로 몸을 숙인 로봇을 눈속임으로 만드는 것입니다. 레이저가 로봇으로부터 발사되면 약간의 움직임이 해당 Offset Transform에 곱해지게 됩니다.
Sequence 노드를 B핀으로 내린 다음에는 풀 바디 IK의 데이터 개선 작업을 시작합니다. 이는 레이저가 발사될 때 에코를 향해 오른팔을 뻗도록 만들되, 손이 땅바닥 쪽을 향하게 하지 않도록 만들기 위함입니다. 이를 위해 hand_r_ctrl의 Z 위치를 actor_transform의 X 및 Y 위치와 결합합니다. 그러면 hand_r_ctrl에 저장된 입력 애니메이션 핸드 트랜스폼과 방금 계산한 새 트랜스폼 간에 보간할 수 있게 됩니다. Interpolate의 출력 트랜스폼은 오른손의 새로운 목표 포즈를 나타내며, 이는 다시 풀 바디 IK 솔버로 곧장 입력됩니다.
손을 뻗는 포즈 트랜스폼을 계산한 다음, Remap으로 안전한 포즈에 클램프합니다.
이제 모든 데이터를 수집하고 개선했다면 마지막으로 솔버에 전부 입력합니다. 솔버에 입력하기 전에 수집한 데이터가 전부 클린한지, 그리고 예상대로의 결과를 내는지 충분한 시간을 들여 확인하는 것이 중요합니다.
풀 바디 IK 솔버는 저장된 발 애니메이션 트랜스폼과 계산된 손 포즈 트랜스폼을 사용하여 전체 바디 포즈를 조정합니다.
여기서는 각 솔버 세팅에 대해 일일이 설명하지는 않겠습니다. 대신, 최근에 녹화한 라이브스트림을 한번 살펴볼 것을 추천드립니다(모션 워핑 및 풀 바디 IK | 인사이드 언리얼). 이 영상에서는 솔버의 작동 원리와 에인션트 원에 활용된 방식을 심도 있게 다룹니다. 간단히 요약하자면 저희에게 필요한 작업은 몸을 기울이면서 오른손을 앞으로 뻗은 상태에서 발은 고정한 채 나머지 신체를 조정하여 에코를 향하도록 하는 것입니다. 솔버에서 일부 본 세팅을 조정하면, 저희가 제공한 트랜스폼에 솔버가 도달하려 할 때 비틀리고 움직이는 본을 찾아 개선할 수 있습니다.
이 함수의 마지막 부분은 actor_transform 컨트롤로 저장된 레이저 공격 위치에 손을 조준하는 것입니다. 올바른 손 방향을 얻고자 솔버에만 의존하지 않고, 솔버가 대략적인 포즈를 취하되 해당 작업이 끝난 뒤 그 포즈를 조정합니다. 이런 방식을 통해 많은 수고를 들이지 않고도 솔버의 장점을 사용하는 동시에 아트의 방향성을 유지할 수 있습니다. 에임 구성에서는 손바닥의 축을 파악한 다음, actor_transform을 타깃으로 제공하였습니다
여러분의 스토리텔링을 해 보세요
애니메이션은 스토리텔링의 도구이고, 에픽게임즈에서는 최선을 다해 스토리텔링 툴을 개발하고 있습니다. 이제 저희는 직접 키잉을 하든 또는 모션 픽처를 활용하든, 시퀀서가 캐릭터 애니메이션으로 어떤 결과물을 만들 수 있는지 살펴보고 있습니다. 런타임 엔진과 결합된 컨트롤 릭 및 풀 바디 IK와 같은 툴 덕분에 스토리텔링은 더욱 역동적이고 몰입도가 높아지며 더 큰 효과를 가져다줄 것입니다.
캐릭터 릭과 런타임 구성 자체는 복잡할 수 있지만, 레이어별 빌드 및 로직의 구획화 덕분에 디버그하기 쉽고, 더 유연하면서 절차적 아트 방향성을 제시할 수 있는 캐릭터를 빌드할 수 있었습니다. 이런 디자인 하나하나는 전부 아티스트와 디자이너에게 힘을 실어 주고자 빌드되었으며, 컨트롤 릭은 강력한 툴세트 중 하나에 불과합니다.
최근 인사이드 언리얼 라이브스트림에서는 직접 제작한 샘플과 함께 풀 바디 IK 솔버 및 그래프 구현에 대해 보다 자세하게 다룹니다.
언리얼 엔진 5는 아직 얼리 액세스이며, 리깅과 애니메이션 향상을 위해 노력하고 있습니다. 여러분의 피드백은 언리얼 엔진 5를 개선하는 데 소중히 사용됩니다. 포럼에 참여해 주시거나 트위터(Twitter)를 통해 연락해 주셔도 됩니다.
에인션트의 협곡 애니메이션 기능에 대한 자세한 내용과 프로젝트에 투입된 멋진 노력들에 대해 알아보고 싶다면 콘텐츠 및 샘플 페이지의 가이드 투어를 참고하세요.