PART 5 · 강의 2/3

Chooser와 Trajectory

ChooserTable, Trajectory Prediction, Feature Channel의 구성과 커스터마이징을 분석합니다.

SECTION 01

Chooser 시스템

조건에 따라 다른 PoseSearchDatabase를 선택하는 Chooser

Chooser는 게임 상태에 따라 다른 PoseSearchDatabase를 동적으로 선택하는 시스템입니다. 예를 들어 무기 타입, 이동 상태, 전투/비전투 상태에 따라 다른 DB를 사용할 수 있습니다.

Chooser Table 구조
UChooserTable ├── Row 0: Condition(WeaponType == Rifle AND bInCombat) │ └── Result: DB_Rifle_Combat ├── Row 1: Condition(WeaponType == Rifle AND !bInCombat) │ └── Result: DB_Rifle_Locomotion ├── Row 2: Condition(WeaponType == Pistol) │ └── Result: DB_Pistol_All └── Default: DB_Unarmed_Locomotion 평가 순서: 위에서 아래로, 첫 번째 매칭 Row 사용
Chooser 조건 타입 설명 예시
GameplayTag GameplayTag 보유 여부 State.Combat, Weapon.Rifle
Enum 열거형 값 비교 EWeaponType::Rifle
Bool 불린 값 bIsInAir, bIsCrouching
Float Range 실수 범위 Speed > 300
Chooser vs 단일 대형 DB

모든 애니메이션을 하나의 거대한 DB에 넣으면 검색 비용이 증가하고, 부적절한 포즈가 선택될 수 있습니다. Chooser로 상황별 DB를 분리하면 검색 공간이 줄어 성능이 향상되고, 각 상황에 맞는 포즈만 후보가 되어 품질이 높아집니다.

SECTION 02

Trajectory 예측 시스템

CharacterTrajectoryComponent의 궤적 예측 메커니즘

Trajectory는 캐릭터의 과거 이동 경로와 미래 예측 경로를 나타냅니다. Motion Matching은 이 궤적을 DB의 애니메이션 궤적과 비교하여 가장 자연스럽게 이어질 포즈를 찾습니다.

Trajectory 샘플 포인트
과거 (History) 현재 미래 (Prediction) -0.5s -0.3s -0.1s 0 +0.1s +0.3s +0.5s +1.0s ●───────●───────●───────★───────●──────●──────●──────● ↑ 캐릭터 현재 위치 각 포인트의 데이터: - Position (XY): 2D 이동 위치 - Facing Direction: 캐릭터가 향하는 방향 - Velocity (선택): 이동 속도 벡터
C++
// CharacterTrajectoryComponent 설정 UPROPERTY(EditAnywhere, Category = "Trajectory") int32 HistorySamples = 3; // 과거 샘플 수 UPROPERTY(EditAnywhere, Category = "Trajectory") int32 PredictionSamples = 4; // 미래 샘플 수 UPROPERTY(EditAnywhere, Category = "Trajectory") float HistoryHorizon = 0.5f; // 과거 최대 시간 (초) UPROPERTY(EditAnywhere, Category = "Trajectory") float PredictionHorizon = 1.0f; // 미래 최대 시간 (초) // 궤적 예측 방식: // 1. CharacterMovementComponent의 Velocity + Acceleration 기반 // 2. 입력 방향 + 최대 속도로 미래 위치 추정 // 3. 네비게이션 경로 기반 (AI 캐릭터)
Trajectory 정확도와 반응성

PredictionHorizon이 길수록 먼 미래까지 매칭하여 부드러운 움직임을 만들지만, 갑작스러운 방향 전환 반응이 느려집니다. 짧은 Horizon(0.5s)은 반응이 빠르지만 예측이 부정확해 포즈 전환이 잦아집니다. 0.5~1.0s가 일반적인 균형점입니다.

SECTION 03

Feature Channel 커스터마이징

Schema의 Pose/Trajectory Channel 세부 설정과 가중치 조절

Pose Channel 설정 설명 권장값
Sampled Bones 검색 시 비교할 본 목록 foot_l, foot_r, hand_l, hand_r
Position Weight 본 위치 매칭 가중치 1.0
Velocity Weight 본 속도 매칭 가중치 0.5
Use Velocity 속도 비교 활성화 true

Trajectory Weight 조절

Trajectory 가중치를 높이면 이동 방향/속도 매칭 우선. 방향 전환이 자연스러워지지만 현재 포즈 연속성이 약해질 수 있습니다.

Pose Weight 조절

Pose 가중치를 높이면 현재 포즈와 유사한 포즈 우선. 포즈 연속성이 좋지만 방향 전환 반응이 느려질 수 있습니다.

Normalization

피처 값의 스케일이 다르면 큰 값이 Cost를 지배합니다. NormalizationSet으로 각 피처를 정규화하여 공정한 비교를 보장합니다.

블렌딩 설정

포즈 전환 시 Inertialization 블렌딩을 사용합니다. BlendTime은 0.2~0.4s, 너무 길면 반응 지연, 짧으면 끊김이 발생합니다.

SECTION 04

Multi-Database 검색 전략

여러 DB를 동시에 검색하는 고급 패턴

AnimGraph 패턴
// 방법 1: Chooser로 단일 DB 선택 Motion Matching Node └── Database Source: Chooser Table ├── Condition → DB_A └── Default → DB_B // 방법 2: Multi-DB 검색 (Motion Matching Node 여러 개) // 각 노드가 다른 DB를 검색하고, Blend로 합침 UpperBody_MM → DB_UpperBody_Actions LowerBody_MM → DB_Locomotion ↓ Layered Blend Per Bone (spine_01 기준) // 방법 3: PoseSearchDatabase 내 Multi-Sequence // 하나의 DB에 여러 AnimSequence를 등록 // 각 Sequence에 Tag를 부여하여 검색 범위 제한 DB_Locomotion: - Walk_Fwd (Tag: None) - Walk_Bwd (Tag: None) - Run_Fwd (Tag: None) - Sprint_Fwd (Tag: State.Sprint) ← Sprint Tag 있을 때만 후보
DB 크기와 성능

DB에 등록된 애니메이션의 총 프레임 수가 많을수록 검색 비용이 증가합니다. KD-Tree 최적화가 적용되어 있지만, 10,000 프레임 이상이면 성능 영향을 체감할 수 있습니다. Chooser로 DB를 분리하거나, 불필요한 프레임(블렌드 인/아웃 구간)을 제거하여 DB 크기를 관리하세요.

SUMMARY

핵심 요약

  • Chooser는 GameplayTag/Enum/Bool 조건으로 상황에 맞는 PoseSearchDatabase를 동적 선택한다.
  • Trajectory는 과거 이동 기록과 미래 예측 경로로 구성되며, PredictionHorizon으로 반응성을 조절한다.
  • Feature Channel의 가중치 조절로 Pose 연속성과 Trajectory 반응성의 균형을 맞춘다.
  • Normalization으로 피처 스케일을 정규화하여 공정한 Cost 비교를 보장한다.
  • Multi-DB 전략으로 상체/하체를 독립적으로 Motion Matching하는 것도 가능하다.
PRACTICE

도전 과제

배운 내용을 직접 실습해보세요

실습 1: Trajectory 예측 시각화

캐릭터의 현재 속도와 입력으로부터 미래 궤적(0.5초, 1초 후 예상 위치)을 계산하세요. Debug Draw로 예측 궤적을 시각화하고, 실제 이동 경로와 비교하여 Trajectory Prediction의 정확도를 확인하세요.

실습 2: Chooser Table 구성

ChooserTable을 생성하여 게임 상태(IsGrounded, IsInCombat, MovementMode)에 따라 다른 PoseSearchDatabase를 선택하도록 설정하세요. Evaluate Chooser로 런타임에 적절한 Database가 선택되는지 확인하세요.

심화 과제

커스텀 Feature Channel을 C++로 구현하여 특수한 매칭 기준(무기 상태, 지형 경사도 등)을 추가하세요. Trajectory 예측에 가속도와 회전 속도를 반영하여 급격한 방향 전환 시에도 자연스러운 애니메이션이 매칭되도록 튜닝하세요.