본문 바로가기
언리얼 엔진/기초

[Unreal Engine5] Inverse Kinematics

by TyT. 2023. 7. 29.
반응형

GitHub: https://github.com/tyt0815

 

tyt0815 - Overview

tyt0815 has 4 repositories available. Follow their code on GitHub.

github.com

Notion: https://www.notion.so/tyt0815/a16514d41cb240f08aa19fe5b4c0ab86?pvs=4 

 

언리얼 엔진

Unreal Engine 5 C++ The Ultimate Game Developer Course

www.notion.so

※노션에 기존에 작성하던 글이 있으니 참고

 

 

Inverse Kinematics

Inverse Kinematics를 이용해 계단형태 혹은 경사면에서 다리를 자연스럽게 만들어 봅시다.

Inverse Kinematics는 위키피디아에 다음과 같이 정의되어 있습니다.

In computer animation and robotics, inverse kinematics is the mathematical process of alculating the variable joint parameters needed to place the end of a kinematic chain, such as a robot manipulator or animation character's skeleton, in a given position and orientation relative to the start of the chain. Given joint parameters, the position and orientation of the chain's end, e.g. the hand of the character or robot, can typically be calculated directly using multiple applications of trigonometric formulas, a process known as forward kinematics. However, the reverse operation is, in general, much more challenging.

간단하게 요약하자면, 컴퓨터 애니메이션이나 로봇팔과 같이 관절을 수학적으로 계산해내는 것 입니다. 다행스럽게도, 언리얼 엔진에서는 이러한 Inverse Kinematics를 계산하기 위한 툴들이 있기 때문에 생각만큼 복잡한 계산이 필요하진 않습니다.

이전 포스트와 마찬가지로 아래 에셋에서 제공하는 블루프린트를 참고하며 만들겠습니다.

 

블루프린트가 조금 길어 보일수 있지만 차근차근 시작해 봅시다.

컨트롤 릭 블루프린트를 만들어 줍니다.

블루프린트를 작성하기 전에, 캐릭터의 스켈레탈 메시로 들어와 봅니다.

스켈레톤 트리를 보면 ik 본들이 있는 것을 확인 할 수 있습니다. 하지만 이는 에픽게임즈에서 제공하는 에셋이므로 있는 것이고, 실제론 제공되지 않을 수 있습니다. 그래서 만약 ik 본이 없는 경우 사용하는 방법을 먼저 해보겠습니다. ik본이 있는경우, 필수가 아닙니다. 

먼저 루트 본을 우클릭해 가상본을 추가해 줍니다. root를 클릭해 추가하면 VB root_root라는 가상 본이 생깁니다.

이번에는 가상본을 우클릭해 가상 본을 다시 추가해 줍니다. 왼발 오른발 두개를 추가합니다.

앞으로 ik_foot_l(r) 본을 사용하면 대신에 VB VB root_root_fooot_l(r)을 사용할 수 있습니다.

 

이제 컨트롤 릭으로 돌아와서 작업을 시작합니다.

릭 계층에서 계층을 임포트해 줍니다.

FootTrace라는 함수를 추가해 줍니다.

 

함수의 입력과 출력을 추가해 줍니다. 입력으로 양 발의 Ik 본(혹은 가상본)을 받고, 출력으론 위치 벡터를 출력하게 됩니다.

노드들을 구성해 줍니다. 

차근차근 설명해 보겠습니다.

  • Get Transform - Bone
    • 본의 Transform 정보를 받아 옵니다. 그중 이동(위치)벡터를 사용하게 됩니다. 위치 벡터는 로컬, 즉 해당 메시를 기준으로 받아오는 것을 확인했습니다. 따라서 Y축이 전방 방향이 됩니다. 위의 Get Transform 노드는 입력으로 받은 IK 본의 정보를, 아래 노드는 root노드의 정보를 받게 됩니다. 
  • Sphere Trace By Trace Channel
    • Get Transform에서 얻은 위치정보에 Add, Subtract함수를 거쳐 Start, End로 입력받습니다.Start는 발의 본의 위치의 전방으로 5, 윗방향으로 30만큼 더해진 위치 입니다. End는 발의 본 위치의 전방으로 5만큼 더해지고 아래로 50만큼 이동한 위치가 되겠습니다. 이렇게 되면 Start 부터 End까지, 반지름 3에 해당하는 가상의 구가 움직이며 Visibility 채널을에 속하는 물체에 부딪히게 되면 부딪힌 위치를 반환하게 됩니다. 그리고 그 위치를 저희는 함수의 출력으로 설정하였습니다.

축을 보면 Y축이 전방인 걸 확인할 수 있음

이제 메인 함수인 Forwards Solve Graph로 돌아옵니다. Sequence 노드를 추가해 줍니다. 총 네개의 시퀀스를 사용할 것 입니다.

최종적으로 만들게 될 그래프는 아래와 같습니다.

1번부터 차근차근 시작 해보겠습니다.

우선 Branch 노드가 있습니다. 이 컨트롤 릭은 ShouldDoIkTrace 불린을 인풋으로 받을 것 입니다. 참일때는 FootTrace 함수를 호출해 ZOffset 값을 설정해 줍니다. 여기서 다시한번 말하자면, 함수가 반환하는 위치 벡터는 캐릭터 메시의 로컬 좌표계이고, 이 좌표는 발의 위치의 위 30에서 아래 50까지 충돌하는 물체가 있다면, 충돌한 위치를 반환하게 됩니다.

직접 프린트해서 확인해 봅시다. 에픽 에셋에서 프린트해서 확인했습니다.

평지에서는 왼발 오른발의 offset 값이 동일
이미 만들어져 있는 에픽게임즈의 에셋. 경사면에서 캐릭터가 왼다리를 굽히고 있는데, offset값이 왼발이 양수고 오른발이 음수인 것을 확인할 수 있음

 

다음은 ZOffset을 보간으로 계산해 봅시다. 현재 Target 변수들은 최종적으로 발이 위치 하게될 곳을 가리키는 것 입니다. 따라서 보간을 통해서 프레임당 부드럽게 발이 이동하도록 새로운 변수 ZOffset_R/L을 만들어 계산해 봅시다.

 

그리고 Pelvis Offset 변수도 만들어 할당해 줍니다. L/R중 낮은 값으로 할당하는데 이유는 한쪽 발이 올라가는 매커니즘 이기 때문에 골반(Pelvis)는 낮은 발을 기준으로 Offset을 할당해야 자연스러운 모습이 연출이 됩니다.

 

이제 본격적으로 본의 위치를 변경해 줍시다.

아래쪽 밑줄쳐진 Mode는 Additive Global로 설정해 줌. FootTrace 함수를 구현할때 Global Space를 기준으로 계산했기 다는걸 기억
루트 행동을 Pin to Input으로 설정하고 입력 포즈에서 솔브 시작을 True로 해줌

 

이제 컨트롤 릭이 완성되었으니 애니메이션 블루프린트에 적용시켜 봅니다.

그 전에 ShouldDoIKTrace 변수가 외부 노드에서 설정이 가능하게 만들어 줍니다.

이제 애니메이션 블루프린트로 갑시다. 그리고 컨트롤 릭을 만들어 주고, 클래스를 방금 만들었던 컨트롤 릭으로 설정해 주고 ShouldDoIKTrace 변수를 핀으로 노출시켜 줍니다.

 

그리고 최종적으로 아래와 같이 구성해 줍니다. 이제 Is Falling으 False 일때만 컨트롤 릭이 적용이 됩니다.

 

실행해서 확인해 봅니다.

이렇게해서 경사면을 달려보면 캐릭터가 위 아래로 덜그덕 덜그덕(?) 통통거리는 모습을 볼 수 있습니다. 저는 이게 마음에 안들어서 수정해 주겠습니다.

여기서 부턴 기존 에셋에 존재하지 않는 부분이고 제가 임의로 넣은 노드입니다. 이런식으로 그냥 멈춰있을때에만 컨트롤 릭을 적용되게 하였습니다.

아래는 결과입니다.

 

마무리로, 제가 임의로 수정한 부분은 사실 임시 조치라고 할 수 있겠습니다. 실제로 경사면을 달리는 도중에도 컨트롤 릭이 적용된다면 훨씬 사실감 있는 연출이 나올 수 있을거라 생각되는데, 나중에 장인 정신이 들어서 하게된다면 그때 다시 포스트 해 보겠 습니다.

반응형