[Motion Matching] 1. GameAnimationSample에서 구성된 모션 매칭 시스템

언리얼 엔진의 모션 매칭 시스템을 분석하기 전에 먼저 모션 매칭 시스템을 이용하기 위해 필요한 것들과 어떻게 동작하는지 간단하게 먼저 알아보자. 에픽에서 제공한 GameAnimationSample에서 구성된 모션 매칭 시스템을 살펴보았다.





  • 스키마 에셋 ( Pose Search Schema )
  • 데이터 베이스 에셋 ( Pose Search Database )



애니메이션을 찾기 위한 ( Query ) 데이터들을 정의한다. 프로젝트의 PSS_Default를 보면 다음과 같은 채널들이 지정되어 있다.

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




애니메이션 에셋들이 들어있는 곳이다.

이렇게 데이터베이스에 있는 애니메이션들 중에서 스키마를 통해 가장 적합한 애니메이션을 선택하게 된다.


어떤 스키마를 사용할 것인가는 데이터베이스에서 설정한다.

Pasted image 20241212171748.png

즉, 각 데이터베이스에 있는 애니메이션들의 특성에 따라 애니메이션의 선택 기준들을 다르게 설정할 수 있게 된다.




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

Pasted image 20241212172337.png

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

Pasted image 20241212172727.png

달리기 상태는 더 세분화되어 각 상태에 따라 데이터베이스가 지정된다.

최종적으로 선택된 데이터베이스에서 비로소 스키마를 통해 마지막 애니메이션이 결정된다. 이전까지 즉, 최종 데이터베이스 선택전까지는 개발자가 내 캐릭터의 상태값을 세분화하고 판단하여 지정해주어야 한다. 이 기준은 각 프로젝트마다 다르게 지정될 수 있다. 구현 특성에 따라 혹은 표현하려는 애니메이션의 범주에 따라 다르게 지정될 수 있는 것이다.

캐릭터가 가질 수 있는 상태가 매우 단순하다면 Chooser Table의 구성을 생략하고 하나의 PSD만을 사용해서 모션 매칭 시스템을 이용할 수도 있다.





이제 애니메이션 블루프린트에서 모션 매칭 노드를 구성에 대해 알아보자.




모션 매칭 시스템을 사용하기 위해 필요한 첫번째 노드이다.

Pasted image 20241212173632.png

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

Pasted image 20241212173801.png

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

Pasted image 20241212174129.png

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

Pasted image 20241212174553.png

Pasted image 20241212174638.png

인터럽트 모드를 결정하는 함수를 보면 각 캐릭터의 상태값들에 따라 조건들을 해석한뒤 최종 모드 값을 결정하고 있다.




모션 매칭 시스템을 사용하기 위해 필요한 두 번째 노드이다. Motion Matching노드에서 결정된 최종 PSD에서 스키마를 통해 애니메이션을 쿼리할 때 필요한 데이터들을 이 노드에서 참조할 수 있다. Trajectory이 경우는 이 노드에서 생성할 수도 있고 다른곳에서 생성한 Trajectory를 참조시킬 수도 있다. 또한 이전 포즈를 캐슁하고 있어 이 데이터 또한 스키마에서 참조할 수 있다.

Pasted image 20241212200212.png

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

Pasted image 20241212200321.png

이 옵션을 체크하면 자체적으로 궤적을 생성한다.




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

Pasted image 20241212202254.png

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

Pasted image 20241212202435.png

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

Pasted image 20241212202604.png




데이터베이스에서 애니메이션을 쿼리( 가장 적합한 애니메이션을 선택 )하기 위한 정책들을 설정하는 에셋이다.



후보 애니메이션들이 담긴 에셋이다. Schema에 미리 설정된 PSS를 연결해서 후보 애니메이션 중에서 스키마에 따라 애니메이션이 쿼리될 수 있도록 한다.



애니메이션 및 캐릭터의 상태가 복잡한 경우 애니메이션의 선택 정밀도를 올리기 위해 그룹별로 분류하여 PSD들을 준비한 후 Chooser Table에 조건과 PSD를 설정하여 1차 필터링을 할 수 있도록 한다.



Motion Matching노드와 Pose History노드를 추가하여 설정해준다. 스키마에서 사용할 데이터들도 준비해준다. TrajectoryBone Transform History데이터들이 필요하다. Trajectory를 생성하는 함수는 [[#Generate Trajectory]]를 통해 준비해준다.






이전글 : [Motion Matching] 언리얼 엔진의 모션 매칭 시스템 분석

Leave a Comment