언리얼 엔진의 모션 매칭 시스템을 분석하기 전에 먼저 모션 매칭 시스템을 이용하기 위해 필요한 것들과 어떻게 동작하는지 간단하게 먼저 알아보자. 에픽에서 제공한 GameAnimationSample에서 구성된 모션 매칭 시스템을 살펴보았다.
Motion Matching Asset 구조
- 스키마 에셋 (
Pose Search Schema
) - 데이터 베이스 에셋 (
Pose Search Database
)
Pose Search Scheme
애니메이션을 찾기 위한 ( Query ) 데이터들을 정의한다. 프로젝트의 PSS_Default
를 보면 다음과 같은 채널들이 지정되어 있다.

즉, PSS_Default
스키마를 사용하게 되면 캐릭터의 이동 궤적( Trajectory ), 본의 상대적 위치( Position ), 본의 속도( Velocity ), 본의 회전축 일치 여부( Heading )의 설정 기준 및 가중치 비율을 가지고 애니메이션을 선택하겠다는 것이다.
Pose Search Database
애니메이션 에셋들이 들어있는 곳이다.

이렇게 데이터베이스에 있는 애니메이션들 중에서 스키마를 통해 가장 적합한 애니메이션을 선택하게 된다.
스키마 지정
어떤 스키마를 사용할 것인가는 데이터베이스에서 설정한다.

즉, 각 데이터베이스에 있는 애니메이션들의 특성에 따라 애니메이션의 선택 기준들을 다르게 설정할 수 있게 된다.
Chooser Table
캐릭터의 모든 애니메이션을 하나의 데이터 베이스( PSD
: Pose Search Database )에 포함하게 되면 캐릭터의 현재 애니메이션을 선택할 때 정교함이 떨어질 수 있고, 애니메이션 그룹마다 스키마를 적용하기 어렵게 된다. 그래서 캐릭터의 상태에 따라 애니메이션 그룹들을 나누어서 데이터베이스들을 만들게 된다. 이렇게 그룹화된 각 PSD
를 1차적으로 캐릭터 상태에 따라 선택을 하게 되는데, 이 때 Chooser Table
을 이용하게 된다.

1차로 분류한 캐릭터 상태. 아이들, 걷기, 달리기, 공중상태로 분류된다.

달리기 상태는 더 세분화되어 각 상태에 따라 데이터베이스가 지정된다.
최종적으로 선택된 데이터베이스에서 비로소 스키마를 통해 마지막 애니메이션이 결정된다. 이전까지 즉, 최종 데이터베이스 선택전까지는 개발자가 내 캐릭터의 상태값을 세분화하고 판단하여 지정해주어야 한다. 이 기준은 각 프로젝트마다 다르게 지정될 수 있다. 구현 특성에 따라 혹은 표현하려는 애니메이션의 범주에 따라 다르게 지정될 수 있는 것이다.
캐릭터가 가질 수 있는 상태가 매우 단순하다면 Chooser Table
의 구성을 생략하고 하나의 PSD
만을 사용해서 모션 매칭 시스템을 이용할 수도 있다.
In Animation Blueprint
이제 애니메이션 블루프린트에서 모션 매칭 노드를 구성에 대해 알아보자.
Motion Matching Node
모션 매칭 시스템을 사용하기 위해 필요한 첫번째 노드이다.

디폴트에서는 데이터베이스를 바로 지정할 수 있게 되어 있다.

하지만 샘플 프로젝트에서는 Chooser Table
을 이용한 PSD
를 선택하기 때문에 Update Motion Matching
함수를 On Update슬롯에 지정하여 매 Tick마다 해당 함수를 통해 PSD
를 최종적으로 전달 받도록 되어 있다.

Update Motion Matching
함수를 보면 ABP
( Animation Blueprint )를 통해 Chooser Table
에 PSD
를 선택하기 위한 데이터들을 넘겨주고 반환받은 PSD
를 설정해주고 있다. 이때 Interrupt Mode
도 함께 넘겨주고 있는데 이것은 데이터베이스가 변경되었을 때 이전 애니메이션을 강제로 새로운 애니메이션으로 교체할지 아니면 이전 애니메이션의 재생을 보장할지 선택하는 모드이다.


인터럽트 모드를 결정하는 함수를 보면 각 캐릭터의 상태값들에 따라 조건들을 해석한뒤 최종 모드 값을 결정하고 있다.
Pose History Node
모션 매칭 시스템을 사용하기 위해 필요한 두 번째 노드이다. Motion Matching
노드에서 결정된 최종 PSD
에서 스키마를 통해 애니메이션을 쿼리할 때 필요한 데이터들을 이 노드에서 참조할 수 있다. Trajectory
이 경우는 이 노드에서 생성할 수도 있고 다른곳에서 생성한 Trajectory
를 참조시킬 수도 있다. 또한 이전 포즈를 캐슁하고 있어 이 데이터 또한 스키마에서 참조할 수 있다.

이렇게 본들을 지정하면 해당 본들의 트랜스폼을 캐슁해둔다.

이 옵션을 체크하면 자체적으로 궤적을 생성한다.
Generate Trajectory
[[#Pose History Node]]에서 Generate Trajectory를 체크하지 않는다면 직접 궤적을 생성하는 함수 노드를 만들어 주어야 한다. GenerateTrajectory
함수와 생성된 궤적을 캐슁할 Trajectory
( Pose Serach Query Trajectory )변수를 만들어 준다. 함수는 다음과 같이 노드 구성이 된다.

Pose Search Generate Trajectory
를 이용해서 궤적을 생성하고 Trajectory
에 생성된 궤적을 저장한다. 그리고 이 저장된 궤적을 Pose History Node
에 연결해준다.

Event Blueprint Update Animation
는 tick마다 호출되는 애니메이션 블루프린트의 이벤트 함수이다. GenerateTrajectory
함수를 연결하여 tick마다 호출되도록 한다.

요약
Pose Search Schema 준비
데이터베이스에서 애니메이션을 쿼리( 가장 적합한 애니메이션을 선택 )하기 위한 정책들을 설정하는 에셋이다.
Pose Search Database 준비
후보 애니메이션들이 담긴 에셋이다. Schema
에 미리 설정된 PSS
를 연결해서 후보 애니메이션 중에서 스키마에 따라 애니메이션이 쿼리될 수 있도록 한다.
Chooser Table 준비 ( 선택 )
애니메이션 및 캐릭터의 상태가 복잡한 경우 애니메이션의 선택 정밀도를 올리기 위해 그룹별로 분류하여 PSD
들을 준비한 후 Chooser Table
에 조건과 PSD
를 설정하여 1차 필터링을 할 수 있도록 한다.
Animation Blueprint설정
Motion Matching
노드와 Pose History
노드를 추가하여 설정해준다. 스키마에서 사용할 데이터들도 준비해준다. Trajectory
및 Bone Transform History
데이터들이 필요하다. Trajectory
를 생성하는 함수는 [[#Generate Trajectory]]를 통해 준비해준다.
Select Animation Flow
