PART 6 · 강의 1/3

Physical Animation Component

UPhysicalAnimationComponent의 프로파일 시스템, 모터 강도, 물리-애니메이션 블렌딩 메커니즘을 분석합니다.

SECTION 01

Physical Animation 개요

키프레임 애니메이션과 물리 시뮬레이션의 블렌딩

Physical Animation은 키프레임 애니메이션의 포즈를 물리 시뮬레이션의 힘(모터)으로 구동하여, 외부 충격이나 충돌에 반응하면서도 원래 애니메이션을 따르는 하이브리드 시스템입니다.

키프레임 애니메이션

미리 정의된 포즈를 정확히 재생합니다. 시각적으로 완벽하지만 물리적 상호작용(충돌, 바람 등)에 반응하지 않습니다.

물리 시뮬레이션

중력, 충돌, 외력에 의해 자연스럽게 반응합니다. 그러나 제어가 어렵고 원하는 포즈를 유지할 수 없습니다.

Physical Animation (하이브리드)

물리 모터가 키프레임 포즈를 "목표"로 추종합니다. 외력이 없으면 애니메이션대로, 외력이 있으면 물리적으로 반응합니다.

UPhysicalAnimationComponent

UPhysicalAnimationComponent는 USkeletalMeshComponent에 물리 애니메이션을 적용하는 컴포넌트입니다. 각 본에 대해 물리 모터의 강도, 감쇠, 최대 힘 등을 Physical Animation Profile로 정의합니다.

SECTION 02

Physical Animation Profile

본별 물리 모터 설정을 관리하는 프로파일 시스템

프로파일 속성 설명 권장 범위
IsLocalSimulation 로컬 스페이스 시뮬레이션 여부 true (권장)
OrientationStrength 회전 모터 강도 (애니메이션 회전 추종) 1000~10000
AngularVelocityStrength 각속도 감쇠 강도 100~1000
PositionStrength 위치 모터 강도 (애니메이션 위치 추종) 1000~10000
VelocityStrength 선속도 감쇠 강도 100~1000
MaxLinearForce 최대 선형 힘 제한 (0 = 무제한) 0 or 10000
MaxAngularForce 최대 각력 제한 (0 = 무제한) 0 or 10000
C++
// Physical Animation Component 설정 void AMyCharacter::SetupPhysicalAnimation() { // 컴포넌트 생성 PhysAnimComp = CreateDefaultSubobject<UPhysicalAnimationComponent>( TEXT("PhysAnim")); // 프로파일 설정 FPhysicalAnimationData AnimData; AnimData.bIsLocalSimulation = true; AnimData.OrientationStrength = 5000.f; AnimData.AngularVelocityStrength = 500.f; AnimData.PositionStrength = 5000.f; AnimData.VelocityStrength = 500.f; AnimData.MaxLinearForce = 0.f; // 무제한 AnimData.MaxAngularForce = 0.f; // 무제한 // 특정 본 이하에 프로파일 적용 PhysAnimComp->SetSkeletalMeshComponent(GetMesh()); PhysAnimComp->ApplyPhysicalAnimationProfileBelow( FName("spine_01"), // 이 본과 모든 자식 본에 적용 FName("DefaultProfile")); }
부위별 강도 차별화

상체는 강도를 낮게(외부 충격에 많이 반응), 하체는 강도를 높게(로코모션 유지) 설정하는 것이 일반적입니다. 머리/손은 물리 반응을 강조하고, 골반/다리는 애니메이션을 우선하는 식으로 차별화합니다.

SECTION 03

물리 시뮬레이션 활성화

본별 SimulatePhysics 활성화와 Physics Asset 설정

Physical Animation이 작동하려면 대상 본들에 물리 시뮬레이션이 활성화되어야 합니다. 전체 메시가 아닌 특정 본 이하만 시뮬레이션하는 부분 물리가 가능합니다.

C++
// 부분 물리 활성화 void AMyCharacter::EnablePartialPhysics() { USkeletalMeshComponent* Mesh = GetMesh(); // 전체 메시에 대해 시뮬레이션 활성화 (필요한 본만) Mesh->SetAllBodiesBelowSimulatePhysics( FName("spine_01"), true, // bSimulate true // bIncludeSelf ); // 블렌드 웨이트 설정 (0=애니메이션, 1=물리) // 0.5면 50% 물리 + 50% 애니메이션 Mesh->SetAllBodiesBelowPhysicsBlendWeight( FName("spine_01"), 0.0f // 초기값: 순수 애니메이션 ); } // 점진적 물리 블렌딩 (피격 반응 등) void AMyCharacter::ApplyHitReaction(float PhysicsWeight) { GetMesh()->SetAllBodiesBelowPhysicsBlendWeight( FName("spine_01"), PhysicsWeight // 0.3~0.5 정도로 설정 ); // 임펄스 적용 GetMesh()->AddImpulseAtLocation( HitDirection * ImpulseStrength, HitLocation, HitBoneName); }
Physics Asset 요구사항

Physical Animation은 Physics Asset이 올바르게 설정되어 있어야 합니다. 각 본에 적절한 Physics Body(Sphere, Capsule, Box)가 있어야 하며, Constraint(관절 제한)가 설정되어 있어야 자연스러운 물리 반응을 얻습니다. Physics Asset이 없거나 불완전하면 시뮬레이션이 비정상적으로 동작합니다.

SECTION 04

실전 사용 사례

피격 반응, 바람 효과, 인터랙션 등 실전 패턴

피격 반응 (Hit Reaction)

피격 시 PhysicsBlendWeight를 순간적으로 높이고 Impulse를 적용합니다. 시간에 따라 Weight를 다시 0으로 보간하여 애니메이션으로 복귀합니다.

환경 반응 (Procedural)

NPC의 상체가 벽이나 좁은 공간에서 자동으로 구부러지는 효과. Physical Animation이 벽과의 충돌에 반응하면서 다리는 애니메이션을 유지합니다.

보조 동작 (Secondary Motion)

캐릭터의 장식(벨트, 주머니, 귀걸이)에 낮은 강도의 Physical Animation을 적용하여 자연스러운 흔들림을 추가합니다.

탈것 탑승

차량 탑승 중 상체에 Physical Animation을 적용하면 차량 가감속/회전에 맞춰 몸이 자연스럽게 흔들립니다.

C++
// 피격 반응 전체 흐름 void AMyCharacter::OnHitReaction(const FHitResult& Hit, float Damage) { USkeletalMeshComponent* Mesh = GetMesh(); // 1. 피격 부위 근처 본의 PhysicsBlendWeight 증가 float BlendWeight = FMath::Clamp(Damage / 100.f, 0.2f, 0.8f); Mesh->SetPhysicsBlendWeight(Hit.BoneName, BlendWeight); // 2. 임펄스 적용 FVector ImpulseDir = Hit.TraceEnd - Hit.TraceStart; ImpulseDir.Normalize(); Mesh->AddImpulseAtLocation( ImpulseDir * Damage * 10.f, Hit.ImpactPoint, Hit.BoneName); // 3. 타이머로 복원 GetWorldTimerManager().SetTimer( RecoveryTimer, [this, Hit]() { // 점진적으로 BlendWeight를 0으로 감소 float Current = GetMesh()->GetPhysicsBlendWeight(Hit.BoneName); float NewWeight = FMath::FInterpTo(Current, 0.f, 0.016f, 5.f); GetMesh()->SetPhysicsBlendWeight(Hit.BoneName, NewWeight); if (NewWeight < 0.01f) { GetWorldTimerManager().ClearTimer(RecoveryTimer); } }, 0.016f, true); // 매 프레임 }
SUMMARY

핵심 요약

  • Physical Animation은 물리 모터가 키프레임 포즈를 추종하며, 외력에는 물리적으로 반응하는 하이브리드 시스템이다.
  • Physical Animation Profile로 본별 모터 강도(Orientation/Position Strength)를 세밀하게 제어한다.
  • PhysicsBlendWeight(0=애니메이션, 1=물리)로 물리 영향의 정도를 동적으로 조절한다.
  • 피격 반응: BlendWeight 증가 + Impulse 적용 → 시간에 따라 BlendWeight를 0으로 복원한다.
  • 올바른 Physics Asset 설정이 자연스러운 물리 애니메이션의 전제 조건이다.
PRACTICE

도전 과제

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

실습 1: Physical Animation 기본 설정

캐릭터에 Physical Animation Component를 추가하세요. Physics Asset이 올바르게 설정되었는지 확인하고, Apply Physical Animation Profile Below로 spine_01 이상의 본에 물리 애니메이션을 적용하세요. Strength와 Damping 값을 조절하여 흔들림 정도를 제어하세요.

실습 2: 외력 반응 시스템

Physical Animation이 적용된 캐릭터에 Add Force / Add Impulse를 호출하여 외부 충격에 반응하도록 하세요. 폭발이나 강한 바람에 캐릭터 상체가 자연스럽게 흔들리면서도 애니메이션을 유지하는 시스템을 구현하세요.

심화 과제

상황별 Physical Animation Profile을 여러 개 만들어(Default, Hit, Drunk) 동적으로 전환하는 시스템을 구현하세요. 피격 시 일시적으로 강도를 낮춰 물리 반응을 크게 하고, 회복 후 원래 프로파일로 보간 전환하세요.