LeeTaes 공부노트

[Unreal Engine 5] FABRIK IK 본문

Game Programming/Unreal Engine5

[Unreal Engine 5] FABRIK IK

리태s 2024. 8. 25. 11:41
728x90
반응형

개요

언리얼 엔진 TPS 관련 강의를 들으며 AimOffset을 추가했더니 위, 아래 방향을 바라볼 때 다음과 같이 무기를 부착하지 않은 손의 위치가 이상해지는 것을 확인할 수 있었습니다.

사진을 자세히 보면 왼손의 위치가 총에 붙어있지 않고 허공에 떠있는 모습을 볼 수 있는데, 이를 맞춰주는 방법을 간단히 정리해보도록 하겠습니다.

FABRIK IK

FABRIK IK(Forward And Backward Reaching Inverse Kinematics)은 언리얼 엔진에서 사용되는 IK 솔버 중 하나로, 캐릭터의 뼈대를 자연스럽게 움직이기 위해 사용됩니다.

 

언리얼 엔진에서는 Control Rig나 Animation Blueprint에서 설정할 수 있으며, 주로 팔이나 다리 등이 목표 지점에 자연스럽게 도달하는 장면을 연출하기 위해 사용됩니다.

 

FABRIK IK전진후진 단계(Forward And Backward)를 반복하며, 뼈대들이 목표 위치에 도달하도록 조정합니다.

 

간단히 설명하면 특정 부위의 뼈를 우선 목표위치에 도달하도록 움직인 후, 루트(시작 뼈)를 기준으로 마지막 뼈까지 순차적으로 조정하며 자연스럽게 뼈대들이 위치할 수 있도록 해줍니다.

 

예를 들어, 손을 머리 위치까지 이동시키는 경우 손을 먼저 목표 위치(머리 위치)로 이동시키고 손목뼈, 팔꿈치(중간 뼈) 등을 조정하여 손과의 거리가 유지되도록 위치를 조정합니다. (Backward)

 

다음으로 팔의 끝인 어깨(말단 뼈, 고정 상태)를 기준으로 팔꿈치와 손목 등의 뼈 위치를 조정하여 자연스럽게 위치를 수정하는 방식(Forward)으로 자연스러운 결과물을 얻어낼 수 있습니다.

FABRIK IK 적용

위와 같은 상황에서 왼손의 위치를 정확히 총의 특정 소켓에 붙여, 언제나 자연스러운 애니메이션을 유지하는 것이 목표입니다.

 

우선, 총 메쉬의 스켈레톤에 왼손을 부착하기 위한 소켓을 추가해주도록 합니다.

 

다음으로 플레이어가 사용하는 Anim Instance에서 매 프레임마다 플레이어의 왼손이 위치할 Transform을 구해줘야 합니다.

 

플레이어의 왼손은 언제나 무기가 부착된 오른손을 기준으로 특정 위치만큼만 떨어져 있도록 설정하면 됩니다.

(오른손 기준으로 무기가 부착되므로, 플레이어가 무기를 든 상황에서 왼손의 위치는 언제나 오른손의 위치와 일정한 관계를 가짐)

 

즉, 플레이어의 오른손(hand_r) 위치를 받아와 무기에 추가된 소켓(LeftHandSocket)과의 상대적인 차이를 구하고 해당 차이만큼 플레이어의 왼손을 위치시켜주면 됩니다.

 

AnimInstance.cpp - NativeUpdateAnimation()...

더보기
// 장착한 무기의 왼손 소켓의 월드 기반 Transform을 가져옵니다.
LeftHandTransform = EquippedWeapon->GetWeaponMesh()->GetSocketTransform(FName("LeftHandSocket"), ERelativeTransformSpace::RTS_World);
		
// 값을 추출해 저장하기 위한 변수
FVector OutPosition;
FRotator OutRotation;
		
// LeftHandTransform을 hand_r을 기준으로 Location과 Rotation을 변환합니다.
BlasterCharacter->GetMesh()->TransformToBoneSpace(FName("hand_r"), LeftHandTransform.GetLocation(),FRotator::ZeroRotator, OutPosition, OutRotation);

// 왼손 소켓의 위치와 회전 정보를 변환된 정보로 재설정합니다.
LeftHandTransform.SetLocation(OutPosition);
LeftHandTransform.SetRotation(FQuat(OutRotation));

다음으로 Animation Blueprint로 돌아와 FABRIK 노드를 추가하고 설정해주도록 합니다.

 

위와 같이 설정한 후 무기에서 추가한 LeftHandSocket의 위치를 변경시켜가며 적당한 위치를 지정해주면 됩니다.

결과

 

이제 왼손이 허공이 아닌 무기에 자연스럽게 부착되는 모습을 확인할 수 있습니다.

 

참고 자료

https://www.udemy.com/course/unreal-engine-5-cpp-multiplayer-shooter/

728x90
반응형