Make Unreal REAL.
article thumbnail
Unreal Engine 5 C++ Multiplayer Shooter

 

FABRIK(Forward And Backward Reaching Inverse Kinematics)

언리얼 엔진에서 제공하는 애니메이션 IK 기능이다.

 

 

FABRIK

Forward And Backward Reaching Inverse Kinematics, 앞뒤로 늘어나는 IK 를 사용하는 애니메이션 노드입니다.

docs.unrealengine.com

 

FABRIK을 활용해 현재 무기 장착 시 부자연스럽게 보이는 왼쪽 손의 위치를 조정해본다.

 

우선 무기 메쉬에 소켓을 추가한다.

  • 나중에 다른 무기들에도 사용할 수 있도록, 소켓 이름에 일관성을 유지해야 한다.

 


애니메이션 블루프린트에서 FABRIK 노드를 사용할 때, IK 끝 지점의 Transform 정보를 전달해야 한다.

 

 

애님 인스턴스에서 무기 메쉬의 LeftHandSocket을 사용하기 위해, 캐릭터 클래스에서 무기 객체의 Getter를 제공한다.

 

 

무기 클래스에서는 메쉬를 가져올 수 있도록 제공한다.

 

 

애님 인스턴스에 현재 장착 중인 무기를 저장하는 변수를 선언하고, NativeUpdateAnimation() 함수에서 가져와 사용한다.

 


NativeUpdateAnimation() 함수의 아랫부분에 매 프레임마다, FABRIK에 전달할 IK 끝 지점인 LeftHandTransform 정보를 갱신하도록 한다.

 

USkinnedMeshComponent::GetSocketTransform() 함수를 통해 소켓의 Transform 정보를 가져올 수 있다.

  • ERelativeTransformSpace::RTS_World
    월드 기준 절대적
  • ERelativeTransformSpace::RTS_Actor
    액터 기준 상대적
  • ERelativeTransformSpace::RTS_Component
    컴포넌트 기준 상대적
  • ERelativeTransformSpace::RTS_ParentBoneSpace
    부모 Bone 기준 상대적

 

USkinnedMeshComponent::TransformToBoneSpace() 함수를 통해, 월드 기준 절대 위치와 회전을 Bone 기준 상대 위치와 회전으로 변환한다.

  • Hand_R Bone을 전달한 이유는, 오른손이 항상 무기에 고정되어 있기 때문에 기준점으로 사용할 수 있기 때문이다.

 


애님 그래프에 FABRIK을 사용할 새로운 상태와 포즈 캐시를 만든다.

 

 

Aim Offset 포즈 캐시와 IK 끝 지점인 LeftHandTransform 정보를 입력으로 받는다.

 

기준점은 C++에서 작성한 것과 동일하게, Hand_R Bone으로 설정하고 Transform 정보는 Bone Space라고 알려준다.

  • 회전은 LeftHandTransform에 있는 값을 그대로 사용할 것이기 때문에, No Change로 설정한다.

 

IK의 영향을 받아 움직이게 될 시작 Bone인 Root Bone은 UpperArm_L, 끝 Bone인 Tip Bone은 Hand_L로 설정해준다.

 

 

상체를 Aim Offset 포즈 캐시에서 FABRIK이 적용된 포즈 캐시로 블렌딩하도록 변경한다.

 

 

이제 실행해서 작동하는지 확인해보자.


실행 중일 때 Shift + F1을 눌러 포커스를 해제한 후, F8을 눌러 플레이어 컨트롤러에서 Detach하면 게임 플레이 중에도 에디터를 조작할 때처럼 월드를 탐색할 수 있다.

 

 

이 상태에서 무기 메쉬를 열어 소켓의 위치를 조정하면 실시간으로 반영된다.

  • NativeUpdateAnimation() 함수에서 매 프레임마다 소켓의 Transform 정보를 가져오기 때문이다.
  • IK를 적용할 수 있는 거리를 넘어가 Bone들이 쭉 펴지는 정도까지는 하면 안 된다.

 


권총 메쉬에도 LeftHandSocket 소켓을 추가하고 위치를 조정한 후, 무기를 권총으로 변경해 테스트 해본다.

 

 

FABRIK을 통한 IK 적용에 성공했다.

 

'Unreal Engine > UE5 C++ Multiplayer Shooter' 카테고리의 다른 글

Rotate Root Bone  (0) 2023.04.17
옆으로 도는 애니메이션 적용  (0) 2023.04.16
회전 리플리케이션 시 고려할 사항  (0) 2023.04.14
Aim Offset 적용  (0) 2023.04.13
Aim Offset  (0) 2023.04.12
profile

Make Unreal REAL.

@diesuki4

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그