UE5 Control Rig 기초 완전 가이드
Control Rig는 UE5의 프로시저럴 애니메이션 및 리깅 시스템입니다. 기존 스켈레탈 메시 애니메이션과 독립적으로 본을 직접 제어하며, 런타임 IK, 커스텀 리그, Sequencer 기반 애니메이션 제어에 활용됩니다.
플러그인: ControlRig, RigLogicLibrary 활성화
1. Control Rig 구조
섹션 제목: “1. Control Rig 구조”Control Rig Asset: Controls: FK/IK 조작 핸들 (에디터/런타임 제어) Bones: 스켈레톤 본 참조 Spaces: 커스텀 좌표 공간 RigUnits: 로직 노드 (C++ 또는 BP)
실행 순서: [Backward Solve] ← Controls → Bones 역계산 (에디터 포징용) [Forward Solve] → Bones 위치 최종 계산 (런타임)2. C++ RigUnit 구현
섹션 제목: “2. C++ RigUnit 구현”#pragma once#include "ControlRig.h"#include "Units/RigUnit.h"
// 간단한 IK RigUnitUSTRUCT(meta = (DisplayName = "Simple IK", Category = "Custom|IK"))struct FRigUnit_SimpleIK : public FRigUnit{ GENERATED_BODY()
RIGVM_METHOD() virtual void Execute() override;
public: // 입력: 루트 본 UPROPERTY(meta = (Input)) FRigElementKey Root;
// 입력: 타겟 본 UPROPERTY(meta = (Input)) FRigElementKey Effector;
// 입력: 목표 위치 UPROPERTY(meta = (Input)) FVector Target = FVector::ZeroVector;
// 입력: IK 가중치 UPROPERTY(meta = (Input)) float Weight = 1.0f;
// 출력: 중간 본 위치 UPROPERTY(meta = (Output)) FVector MidBoneLocation;};void FRigUnit_SimpleIK::Execute(){ if (Weight <= SMALL_NUMBER) return;
URigHierarchy* Hierarchy = ExecuteContext.Hierarchy;
// 본 글로벌 변환 가져오기 FTransform RootTransform = Hierarchy->GetGlobalTransform(Root); FTransform EffectorTransform = Hierarchy->GetGlobalTransform(Effector);
// 목표 위치로 본 이동 (간단한 2본 IK) FVector RootPos = RootTransform.GetLocation(); FVector CurrentEffectorPos = EffectorTransform.GetLocation();
// FABRIK 또는 기타 IK 알고리즘 적용 FVector NewEffectorPos = FMath::Lerp(CurrentEffectorPos, Target, Weight);
// 중간 본 위치 계산 MidBoneLocation = (RootPos + NewEffectorPos) * 0.5f;
// 본 변환 업데이트 EffectorTransform.SetLocation(NewEffectorPos); Hierarchy->SetGlobalTransform(Effector, EffectorTransform);}3. Full Body IK (FBIK)
섹션 제목: “3. Full Body IK (FBIK)”Control Rig에서 FBIK 설정:1. Full Body IK 노드 추가2. Root: Pelvis 본 설정3. Effectors 추가: - RightHand → 오른손 타겟 - LeftHand → 왼손 타겟 - RightFoot → 오른발 타겟 - LeftFoot → 왼발 타겟4. Pull Chain Settings: 가중치 조정4. 런타임 C++ 제어
섹션 제목: “4. 런타임 C++ 제어”#include "ControlRig.h"#include "ControlRigComponent.h"
UCLASS()class AMyCharacter : public ACharacter{ GENERATED_BODY()
UPROPERTY(VisibleAnywhere) TObjectPtr<UControlRigComponent> ControlRigComp;
public: // Control 위치 설정 void SetHandTarget(FVector WorldLocation) { UControlRig* ControlRig = ControlRigComp->GetControlRig(); if (!ControlRig) return;
// Control 찾기 FRigControlElement* HandControl = ControlRig->FindControl(FName("hand_r_ctrl"));
if (HandControl) { // 글로벌 변환 설정 FTransform NewTransform = FTransform(WorldLocation); ControlRig->SetControlGlobalTransform( FName("hand_r_ctrl"), NewTransform, true, // bNotify EControlRigSetKey::DoNotCare); } }
// 파라미터 설정 void SetIKWeight(float Weight) { UControlRig* ControlRig = ControlRigComp->GetControlRig(); if (!ControlRig) return;
ControlRig->SetVariableFromString( FName("IKWeight"), FString::SanitizeFloat(Weight)); }};5. Sequencer 통합
섹션 제목: “5. Sequencer 통합”Sequencer에서 Control Rig 사용:1. 캐릭터 선택 → Control Rig Track 추가2. FK Controls로 포즈 키프레임 설정3. IK Controls로 타겟 위치 제어4. AnimLayer로 기존 애니메이션과 블렌딩// C++에서 Sequencer Control Rig 접근#include "MovieSceneControlRigParameterSection.h"
void GetSequencerControlRig(){ // ControlRig를 Sequencer 트랙에서 접근 // 주로 에디터 스크립팅에 활용}6. FK Control 설정
섹션 제목: “6. FK Control 설정”Control 설정 예: Name: spine_01_ctrl Control Type: Transform Parent Space: spine_00 Gizmo: Circle (편집 핸들 모양)
Forward Solve 로직: 1. spine_01_ctrl 변환 읽기 2. spine_01 본에 적용 (FK) 3. 자식 본들 자동 전파7. 프로시저럴 애니메이션 — 보행 IK
섹션 제목: “7. 프로시저럴 애니메이션 — 보행 IK”발 IK 로직 (Forward Solve):1. 바닥 레이캐스트 (발 아래 표면 감지)2. 발 타겟 위치 = 레이캐스트 히트 포인트3. 발 타겟 회전 = 바닥 법선 기반4. Two-Bone IK로 무릎 각도 계산5. Pelvis 높이 조정 (낮은 발 기준)- Control Rig = UE5 프로시저럴 리깅/애니메이션 시스템
- RigUnit = C++ 기반 커스텀 IK/FK 로직
- Forward Solve: 런타임 본 위치 계산
- Backward Solve: 에디터 포즈 편집용
- Sequencer 통합으로 시네마틱 애니메이션 제어
UControlRigComponent로 런타임 C++ 제어