🎮Unreal4/Basic

[UE4] IK 기본 개념 (Bone 행렬, 애니메이션 행렬, 루트 모션, IK 개념/종류)

공대 컴린이 2023. 6. 27. 20:05
728x90

2023.02.10 - [🎮Unreal4/BluePrint] - [UE4] IK란?(Inverse Kinematic), Bone 구조, Two Bone IK 솔버(IK+FK), 애니메이션 공간(Mesh/Local/Component)

 

해당 게시글은 위 게시글에서 Bone들의 Transform 값이 도출되는 원리에 대해 좀 더 부가적인 설명을 정리해둔 글이다.


✔️ Bone 행렬 (월드행렬, 지역행렬)

A
ㄴ B (월드행렬)

A라는 본(Bone)과, B라는 본이 있을 때 A는 부모 본이고, B가 자식 본이다.

이때 B의 월드행렬을 구하고 싶다면 B의 지역행렬 x A의 월드행렬을 연산하면 된다.

 

B(지역) x A(월드) = B(월드)

 

여기서 x (곱하기)는 산술 곱하기가 아니라, 행렬곱을 수행하는 것이다.

행렬곱은 행렬의 공간을 변환하는 것으로, B의 지역행렬 공간과 A의 월드행렬 공간을 서로 더해 B의 월드행렬 공간으로 변환시킨다는 의미이다.

 

즉, 본들의 Tansform은 자기 자신의 지역행렬에 부모의 월드행렬을 곱해줘야 자신의 위치에서 부모만큼의 거리를 더 갈 수 있는 것이다.

( 언리얼은 회전 방향이 시계방향이므로 왼손 좌표계를 사용하고, 행우선 연산을 수행한다. )

 

언리얼에서 Matrix를 사용할 때 3x2나 4x3이 아닌 3x3, 4x4 행렬을 사용하는 이유는 뭘까?

그건 역행렬을 취하기 위함이다.

 

위에서는 B본의 지역행렬과, A본의 월드행렬이 주어졌을 때 B 본의 월드행렬을 구하는 방법을 설명했다.

만약, B의 월드행렬과 A의 월드행렬을 알고있을 때 B의 지역행렬을 구하고자 할때, 바로 역행렬을 사용해야 한다.

 

B(월드) x A(월드)^-1 = B(지역)
==>  B(월드) x A(지역) = B(지역)

 

B의 지역행렬을 구하려면 A의 월드행렬에 역행렬 연산을 수행해서 A의 지역행렬을 구하고, B의 월드행렬과 행렬곱을 수행하면 된다.

즉, A의 월드행렬의 역행렬은 A의 지역행렬이 된다는 것이다.

 

3D 위치 -> W -> V -> P -> 2D 위치 : Projection
2D 위치 -> P -> V -> W -> 3D 위치 : UnProjection 

 

이러한 원리는 Projection과 UnProjection의 원리와 동일하게 작용한다.

역행렬을 수행하는 것은 곧 반대된 결과를 찾을 수 있다.


✔️ 애니메이션 행렬

고유한 Bone들의 Transform이 존재할 때, 애니메이션을 출력하려면 행렬값에 어떤 값을 더해야 할까?

정답은, 애니메이션 행렬의 지역행렬 값을 행렬곱하면 된다.

 

B(지역) x Animation(지역) x A(월드) = B(월드)

 

예를 들어 T자 포즈로 팔을 벌리고 있는 캐릭터가 있다고 하자.

팔을 일자로 뻗고 있는 상태에서 앞으로 나란히를 수행한다는 애니메이션이 존재한다면, 해당 캐릭터의 어깨 Bone은 어깨를 회전한 만큼의 Animation 지역 행렬이 존재할 것이다.

 

-90도 만큼 어깨를 돌렸다고 한다면, 어깨 본은 자신의 지역행렬과 돌아간 어깨 애니메이션의 지역행렬을 행렬곱하고 거기에 부모 본인 A 월드행렬도 행렬곱을 수행한다.

 

이렇게 애니메이션 행렬을 별도로 사용하는 이유는 무엇일까?

애니메이션 행렬이 없다면, Bone에 애니메이션이 움직임에 따라 변하는 행렬들을 넣어놔야하는데, Bone에 행렬은 고정적이기 때문에 단 하나의 애니메이션만 사용할 수 있게 된다.

따라서, 원본 캐릭터 Mesh의 본 행렬들을 기준으로, 애니메이션에 따른 행렬을 만들어서 부모-자식 간의 Trasnform을 움직이는 것이다.


✔️ 루트 모션

루트모션이라는건, Root본이 움직이는 값을 Actor와 일치시키는 것을 말한다.


Root본에서 움직이는 본 정보를 실시간으로 Actor에게 전달하여 맞추기 때문에 루트모션을 켜면 애니메이션이 움직이는대로 Transform이 변경되는 것이다.
즉, 루트모션이란 Animation이 가진 Root값과 Actor가 갖는 Root값이 동기화 되는 것을 말한다.

✔️ IK 개념

언리얼을 기준으로, 스켈레톤 트리의 Root 본은 가상이다. 

애니메이션을 실행시켜도 Transform 값이 전혀 안바뀌지 않는다는 것을 보면 Root가 가상이라는 점을 알 수 있다.
Pelvis 본은 최상위 Root가 되는데, 부모인 A(월드)가 없는 것과 마찬가지이므로 B(지역) * Animation(지역) 행렬만 연산한다.
이렇게 위에서(Root)에서부터 아래로 쌓아가며 내려가는 것을 "정운동학 FK"라고 한다.

반대로, 찾고자 하는 본에서부터 Root 본으로 거꾸로 가는 것을 "역운동학 IK"라고 한다.
IK는 반대로 가는 것이기 때문에 위에서 설명한 역행렬이 필요한 것이다!

발을 디딛었으면 발에서부터 역행렬로 올라와서 무릎을 계산한다. 
이때 발이 부모 본이 되는 World 행렬이고, 무릎이 자식 본이 되는 Local 행렬이다.

 

전체가 IK라면 모든 Bone의 역행렬을 구해야해서 연산량이 어마무시하다. 

따라서 IK는 꼭 기준값을 정해서 FK와 IK를 동시에 사용하는 것이다.

 

B(지역) x Animation(지역) x A(월드)
: FK라면 A가 부모 본이고, IK라면 A가 자식 본이다.

 

✔️ IK 종류

Two Bone IK

- 발에 바닥에 있지만 계단같은 어떤 오브젝트의 위치에 맞출 수 있는 IK.

- 본의 간격을 유지하며 특정 위치에 붙일 때 사용한다.

- 너무 많이 늘어나는 경우는 붙지 않도록 처리할 수 있다.


FABRIK (Forward And Backward Reaching Inverse Kinematics)

- 특정 Bone 위치에 맞춰 붙이는 IK

- 버튼을 누른다던가 할때 버튼의 위치에 맞춰 손을 누르도록 처리할 수 있다.

- 어딘가에 늘려서(Reaching) 붙일 때, 본이 붙을 곳이 확실하게 정해져있을 때 사용된다. 
- Forward 지점을 Backward 지점에서부터 특정 Bone까지 늘려준다.


CCD IK (Cyclic Coordinate Descent Inverse Kinematics)

- 회전을 이용한 IK

- IK를 수행할 때 과도하게 꺾이거나 회전되는 Bone을 제한하기 위한 IK이다.
- 예를 들어 총을 들고있는데 누가 총을 뺏으면, 팔이 딸려 올라가면 안되고 어느정도 올라가다가 끊겨야하는데, 이렇게 제한을 걸어주는 IK가 CCD IK이다.

728x90