콘텐츠로 이동

UE5 Control Rig 기초 완전 가이드

Control Rig는 UE5의 프로시저럴 애니메이션 및 리깅 시스템입니다. 기존 스켈레탈 메시 애니메이션과 독립적으로 본을 직접 제어하며, 런타임 IK, 커스텀 리그, Sequencer 기반 애니메이션 제어에 활용됩니다.

플러그인: ControlRig, RigLogicLibrary 활성화


Control Rig Asset:
Controls: FK/IK 조작 핸들 (에디터/런타임 제어)
Bones: 스켈레톤 본 참조
Spaces: 커스텀 좌표 공간
RigUnits: 로직 노드 (C++ 또는 BP)
실행 순서:
[Backward Solve] ← Controls → Bones 역계산 (에디터 포징용)
[Forward Solve] → Bones 위치 최종 계산 (런타임)

#pragma once
#include "ControlRig.h"
#include "Units/RigUnit.h"
// 간단한 IK RigUnit
USTRUCT(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);
}

Control Rig에서 FBIK 설정:
1. Full Body IK 노드 추가
2. Root: Pelvis 본 설정
3. Effectors 추가:
- RightHand → 오른손 타겟
- LeftHand → 왼손 타겟
- RightFoot → 오른발 타겟
- LeftFoot → 왼발 타겟
4. Pull Chain Settings: 가중치 조정

#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));
}
};

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 트랙에서 접근
// 주로 에디터 스크립팅에 활용
}

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++ 제어