본문 바로가기
공부/Unreal Engine 5

[언리얼5] IK(Inverse Kinematics)

by MY블로그 2023. 12. 3.

스켈레탈 메시가 경사면에 위치하였을때 경사면과 충돌한 루트를 기준으로 높이가 고정되기 때문에

비스듬한 경사혹은 단차가 있는 지형에서 관절이 떠있는 현상을 해결하기 위한 기술 입니다.

 

1.Control Rig 블루프린트 생성하기

Animation > Control Rig > Control Rig Blueprint 생성

 

2. 스켈레톤 지정하기

여기서 ik로 지정된 본이있는 스켈레톤 에셋이라면 그대로 사용할 수 있으나

만일 ik로 지정되어있는 본이 없는 에셋이라면 가상본을 생성하여 사용할 수 있습니다.

좌 : ik_지정된 본들이있는 에셋 / 우 : 없을경우 원하는 본 우클릭 Add Virtual Bone 으로 타겟 지정하여 생성

 

다시 본론으로 돌아와서 생성한  Control Rig Blueprint에서 IK를 적용 시킬 하이어라이키를 등록하여 줍니다.

 

3. 함수 생성하기

발의 높이를 계산할 함수를 생성해야 합니다. 좌측패널의 My Blueprint 메뉴에서 FUNCTIONS카테고리의 우측에 + 아이콘을 클릭하여 함수를 생성하고 이름을 설정하도록 합니다.

추가적으로 우측 패널의 Details 메뉴에서 Inputs 객체를 추가합니다. 객체의 타입은 Rig Element Key 입니다.

 

4. 트레이스용 구체 생성

IK를 적용시킬 본을 파악하기 쉽도록 구체를 그려주도록 합니다.

 

5. 출력 변수 생성

Outputs의 변수를 생성하도록 합니다.(HitPoint) 해당 변수는 구체가 충돌한 위치의 값을 받습니다.

 

6. 이벤트 그래프 작성

우선 양쪽 발끝을 기준으로 위치를 변수에 저장해 주도록 합니다.

조건문은 IKTrace 변수를 기준으로 True 일떄는 양끝의 위치를 함수를 통하여 변수에 저장하고

False 일때는 양쪽다 위치를 0으로 저장합니다.

 

7. 보간 적용하기

단순하게 받아온 값을 세팅하면 매우 부자연스럽게 딱딱한 느낌일 것입니다. 때문에 보간을 적용 시켜야 합니다.

양쪽발끝본의 위치를 각각 새로 만든 변수에 세팅합니다.

이때 이벤트 그래프가 너무 복잡해진다면 시퀀스를 사용하여 작업 순서를 나누어주도록 합니다.

 

8. 위치값 비교하기

두개의 본 위치 지점의 값을 비교해서 더 낮은 위치의 값을 변수(허리)에 저장 합니다.

 

9. 최종 값들을 타겟의 Z(높이)값에 적용

최종으롤 저장된 값들을 3개의 본(왼발, 오른발, 허리)의 높이값을 세팅해줍니다.

이때 주의해야할점은 Mode의 값은 Additive Global로 설정해야 합니다.

또한 허리는 ik 본이아닌 원본의 본에 직접 적용했습니다.

 

10. 풀바디IK 적용 하기

Full Body IK 함수를 사용하여 허리(pelvis)본을 기준으로 여태까지 값을 적용시켜왔던 if_foot l&r 두개의 본의 Transform의 값을 실제의 foot_l, foot_r 양쪽 발끝의 본의 값을 세팅 하여 주면 완료 입니다.

 

위처럼 만들어진 Control Rig 블루프린트는 애니매이션의 Output Pose 직전에서 사용할 수 있습니다.

Control Rig을 그래프에서 생성하고 디테일 > Control Rig Class 에서 만들어둔 BP를 지정해주면 사용이 가능합니다.

 

추가적으로 블루프린트에서 만든 IK실행 조건문의 변수의 눈모양을 클릭하여 외부에서 실행조건을 On/Off 할 수 있습니다.

좌 : Control Rig Bp 내부의 변수 / 우 : 플레이어 애니매이션 Bp 에서 True, False 지정으로 사용. 미사용 설정

 

조금이라도 최적화 하기 위해서는 추가적인 설정이 필요합니다.

컨트롤릭 블루프린트 클래스의 최종단계인 Full Body IK 함수에서 세팅값을 바꿔줍니다.

Settings(확장) > Root Behavior (Pre Full 에서 Pin to Input) 입력값만 변경되도록 세팅.

또한 플레이어가 점프중이거나 낙하중일때는 IK를 계산할  필요가없으므로 Falling이 아닐때(바닥에있을때)만 계산 되도록 설정 합니다.

 

 

IK 적용 완료!

 

댓글