Full Body IK와 Control Rig
UControlRig, FullBodyIK 솔버, Backwards Reach의 동작 원리와 Control Rig 프로그래밍을 분석합니다.
Control Rig 아키텍처
UControlRig 시스템의 구조와 AnimGraph 통합
Control Rig는 UE5의 프로시저럴 본 조작 시스템입니다. 비주얼 스크립팅(Rig Graph)으로 본 트랜스폼을 프로그래밍하며, AnimBP의 Control Rig 노드를 통해 런타임에 적용됩니다.
AnimBP의 TwoBoneIK/FABRIK 노드는 단일 솔버를 간단히 적용할 때 적합합니다. Control Rig는 여러 솔버를 조합하거나, 복잡한 프로시저럴 로직(스파인 정렬, 시선 추적, 무기 그립 조정 등)을 구현할 때 필수적입니다. 성능은 Control Rig가 약간 더 무겁지만, 유연성이 훨씬 뛰어납니다.
Full Body IK (PBIK) 솔버
다중 이펙터 전신 IK 솔버의 동작 원리
Full Body IK(Position Based IK, PBIK)는 전신 스켈레톤에 여러 IK Goal을 동시에 적용하는 솔버입니다. 양발, 양손, 골반 등 여러 이펙터를 한 번에 풀어 전체 포즈를 조정합니다.
| 설정 | 설명 | 기본값 |
|---|---|---|
| Root Bone | PBIK 솔버의 루트 (보통 pelvis) | pelvis |
| Iterations | 솔버 반복 횟수 (높을수록 정확하지만 느림) | 20 |
| Mass Multiplier | 본별 질량 가중치 (높은 본이 덜 움직임) | 1.0 |
| Stiffness | 관절 강성 (높을수록 원래 포즈 유지) | 0.0 |
| Pull Chain Alpha | 이펙터가 체인을 당기는 강도 | 1.0 |
// Control Rig에서 FBIK 설정
[Forwards Solve]
// 1. PBIK 솔버 추가
PBIK_Solver:
Root = "pelvis"
Iterations = 20
Effectors:
- foot_l → IK_Foot_L_Goal (Position + Rotation)
- foot_r → IK_Foot_R_Goal (Position + Rotation)
- hand_r → IK_Hand_R_Goal (Position Only)
Bone Settings:
- spine_01: Stiffness = 0.8 (스파인은 덜 움직이도록)
- pelvis: RotationStiffness = 0.5
// 2. 결과 적용
Set Bone Transform(foot_l, PBIK_Result.foot_l)
Set Bone Transform(foot_r, PBIK_Result.foot_r)
...
양발에 각각 TwoBoneIK를 적용하면 골반이 조정되지 않아 부자연스럽습니다. PBIK는 양발 목표에 맞게 골반과 스파인까지 함께 조정하여 자연스러운 전신 포즈를 만듭니다. 특히 경사면에서 양발 높이가 다를 때 PBIK가 필수적입니다.
Control Rig 프로그래밍
Rig Graph의 노드 종류와 커스텀 로직 구현
Get/Set Bone Transform
본의 트랜스폼을 읽고 수정하는 기본 노드. Initial(레퍼런스), Current(현재 평가) 중 선택합니다.
Aim / Look At
특정 본이 목표 방향을 바라보도록 회전합니다. 머리 추적, 눈 시선 등에 사용합니다.
Spring / Damper
물리 기반 스프링 동작을 시뮬레이션합니다. 보조 본(귀, 꼬리)의 자연스러운 흔들림에 활용합니다.
Distribute Rotation
여러 본에 걸쳐 회전을 분배합니다. 스파인 꺾임을 여러 본에 균등 분배할 때 사용합니다.
// 커스텀 Rig Unit 구현
USTRUCT(meta = (DisplayName = "Custom Spine Solver"))
struct FRigUnit_CustomSpineSolver : public FRigUnitMutable
{
GENERATED_BODY()
UPROPERTY(meta = (Input))
FRigElementKey SpineStart; // spine_01
UPROPERTY(meta = (Input))
FRigElementKey SpineEnd; // spine_03
UPROPERTY(meta = (Input))
FVector TargetDirection; // 상체가 향할 방향
UPROPERTY(meta = (Input))
float Alpha = 1.0f;
RIGVM_METHOD()
virtual void Execute() override
{
// Spine 체인의 본들을 순회하며
// TargetDirection을 향해 균등 회전 분배
// Alpha로 적용 강도 조절
}
};
AnimBP와 Control Rig 통합
Control Rig 노드의 AnimGraph 배치와 데이터 연동
// AnimBP에서 Control Rig 입력 데이터 전달
void UMyAnimInstance::NativeUpdateAnimation(float DeltaSeconds)
{
Super::NativeUpdateAnimation(DeltaSeconds);
// Control Rig의 IK Goal 위치 계산
// 발 IK 타겟 (지면 트레이스 결과)
IK_Foot_L_Location = CalculateFootIKTarget(FName("foot_l"));
IK_Foot_R_Location = CalculateFootIKTarget(FName("foot_r"));
// 손 IK 타겟 (무기 그립 위치)
IK_Hand_R_Location = WeaponGripTransform.GetLocation();
}
// Control Rig 노드에서 이 프로퍼티를 Input으로 바인딩
// AnimBP → Control Rig → 본 수정 → Output
Control Rig는 모든 본을 순회하므로 비용이 높습니다. LOD에 따라 Control Rig를 비활성화하거나, Alpha를 0으로 설정하여 먼 거리 캐릭터에서는 IK를 스킵하세요. bIsEnabled 프로퍼티로 전체 비활성화하면 평가 비용이 0이 됩니다.
핵심 요약
- Control Rig는 Rig Graph(비주얼 스크립트)로 본 트랜스폼을 프로시저럴하게 제어하는 시스템이다.
- Full Body IK(PBIK)는 다중 이펙터를 동시에 풀어 골반/스파인까지 전신을 자연스럽게 조정한다.
- Control Rig의 Rig Unit으로 커스텀 솔버를 C++로 구현하고, Rig Graph에서 조합할 수 있다.
- AnimGraph에서 Control Rig 노드는 State Machine/Blend 이후, Output 직전에 배치한다.
- LOD 기반 비활성화로 Control Rig의 성능 비용을 관리해야 한다.
도전 과제
배운 내용을 직접 실습해보세요
Control Rig 에셋을 생성하고, Forwards Solve 그래프에서 Get Transform / Set Transform 노드로 특정 본의 위치를 수정하세요. AnimBP에서 Control Rig 노드를 연결하여 런타임에 적용되는지 확인하세요.
Control Rig에 Full Body IK 솔버를 추가하세요. Root, Effector(양손, 양발, 머리)를 설정하고, 각 Effector의 Goal Transform을 외부 변수로 받아 캐릭터가 벽에 기대거나 물건을 잡는 포즈를 생성하세요.
Control Rig에서 커스텀 솔버 로직을 구현하세요. Aim, Spring, Math 노드를 조합하여 호흡에 의한 미세한 상체 움직임, 피격 시 리액션 오프셋, 가방 무게에 의한 어깨 기울임 등의 절차적 애니메이션을 만드세요.