[UE4] Feet IK 구현하기 (InverseKinemetics)
계단을 오르거나 언덕을 오를 때 자연스러운 발의 위치와 회전을 위해 Foot IK를 구현해보았다.
📦 Feet Component 제작
Foot IK 기능을 구현할 Feet Component를 제작하였다.
IK 속성 값으로는 보간속도(Interp Speed), IK 적용 거리(Trace Distance), 발을 띄워줄 간격(Offset Distance), 왼발 소켓, 오른발 소켓을 지정하였다.
📦 Feet Data 구조체 생성
Feet Component 클래스 안에는 IK 연산에 필요한 변수 값들을 저장할 구조체 FFeetData를 선언해두었다.
각 Distance와 Rotation은 발이 바닥까지 내려갈 거리와, 바닥에 발을 딛었을 때 자연스럽게 회전될 방향을 저장하는 것이다.
왼발과 오른발을 각각 구하고, 발이 내려감에 따라 자연스러운 애니메이션 동작을 위해 허리도 함께 내려갈 수 있도록 PelvisDistance도 추가하였다.
Tick 함수에서는 주기적으로 왼쪽 발과, 오른쪽 발의 충돌을 검사하여 각각의 발 아래 어떤 위치에 충돌체가 존재하고, 어떤 회전값을 가져야 하는지를 반환받는다.
🦿 발 아래 충돌 검사 : Trace 함수
Trace 함수는 매개변수로 받는 소켓 부위의 아래로 LineTrace를 수행한 뒤, 충돌 지점까지 이동할 거리와 방향을 Out 매개변수의 주소값으로 반환해준다.
IK에 관한 원리나 자세한 설명은 이미 블루프린트로 구현해본적이 있기 때문에 간단히 넘어가겠다.
2023.02.10 - [🎮Unreal4/BluePrint] - [UE4] IK 구현하기 -1 (Feet Data 구조체, Feet Trace)
2023.02.13 - [🎮Unreal4/BluePrint] - [UE4] IK 구현하기 -2 (Two Bone IK(2본IK), 로컬을 컴포넌트로/컴포넌트에서 로컬로)
Trace 함수의 핵심은 발 아래로 검사 거리(Trace Distance)만큼 LineTrace를 수행하여 충돌 Object를 구하고, 해당 Object의 Impact Point와 Normal 값을 통해 OutDistance와 OutRotation을 구하는 것이다.
이때, 충돌 Object를 알면 충돌된 높이와 충돌된 지점인 밑변을 알고있기 때문에 Atan을 이용하면 충돌 각도를 판별할 수 있다.
충돌 각도를 통해 발이 지면에 자연스럽게 딛을 수 있는 회전 값을 도출할 수 있는것이다.
Trace 함수를 통해 구한 발의 이동 위치와 방향을 FFeetData 변수에 저장하여 플레이어의 Animation Blueprint에서 사용할 수 있도록 하였다.
각 Distance와 Rotation은 부드러운 변형을 위해 InterpTo 보간을 진행하였다.
🕺🏻 IK 애니메이션 구현 : AnimInstance, Animation Blueprint
만들어진 FeetComponent를 CPlayer 클래스에 직렬화하여 추가해주었다.
AnimInstance에는 IK가 적용될 상태인지를 판단할 bool 변수와, IK를 위한 FeetData를 추가해주었다.
AnimInstance 클래스의 Update 함수에서는 IK의 적용 상태인지를 지속적으로 판별하며 파쿠르가 수행되고 있다면 IK가 적용될 수 없도록 제한하였다.
이후, Feet Component에서 지속적인 FeetData를 Update 해주었다.
애니메이션 블루프린트에서는 최종 애니메이션 포즈가 출력되기 직전에 IK를 적용하도록 했다. (모든 공격, 이동 애니메이션 후에 IK가 적용되어야 자연스럽기 때문)
직렬화해두었던 Feet Bool 변수를 불러와 포즈 블렌딩을 수행했다.
Feet Layer에서는 Feet Data를 기반으로 왼발, 오른발, 허리 순서대로 IK를 적용하였다.
Two Bone IK를 이용하여 발의 Joint는 무릎으로 설정하고 Effector를 발로 설정하였다.
(Two Bone IK의 원리에 대한 자세한 설명은 위에서 걸어둔 이전 게시글에 설명되어 있다.)
실행결과, Foot IK가 성공적으로 적용된 것을 확인할 수 있었다.