관리 메뉴

기억을 위한 기록들

MarketPlace / BluePrints /ALS(Advanced Locomotion System) V4 - 01 본문

UnrealEngine/Foot-Place IK 관련

MarketPlace / BluePrints /ALS(Advanced Locomotion System) V4 - 01

에드윈H 2020. 7. 6. 15:49

https://www.youtube.com/watch?v=ru1--3wP-F8&feature=youtu.be

이번에 확인 해볼 IK는 이전에 무료로 푼적 있는 프로젝트이다.

 

해당 프로젝트는 엔진 버전이 올라갈수록 그에 맞게 해당 프로젝트 버전도 올려서 업데이트 하였다.

 

플레이 해본 결과 가장 깔끔하고 자연스럽게 움직이는 Locomotion을 구현 해놓았다. 그 중에서도 Foot IK부분을 파해쳐 보도록 한다.

해당 프로젝트에서 제공하는 캐릭터
노란 체크 되어 있는 UpdateFootIK 함수

우선 이전에 썻던 글과는 다르게 해당 Foot IK 계산과 적용은 모두 Anim Blueprint에서 적용한다.

 

이전에는 캐릭터에서 계산한 값을 전달하여 적용하였고, 여기서는 Anim Instance에서 계산하여 적용한다.

 

사실 두 가지 방법 중에 뭐가 정답인지는 없고, 프로젝트 상황에 따라 고민 할 부분일 것같다.(ex, 같은 스켈레탈 메시을 쓰는 등)

 

만들어져 있는 Update Foot IK 함수를 들여다보면, 뒷 부분에서 Foot IK 관련된 계산이 나온다.

 

세팅되어 있는 MovementState 마다 실행하는 SetFootOffsets 함수 2개(왼발/오른발)와 Set Pelvis IKOffset 함수이다.

 

여기서 None,Grounded,Matling 일때만, IK를 계산 한다. 이전 프로젝트와는 다르게 걷는 도중에도 계산은 되고 있다는 점.

 

 

우선 차근차근 앞의 함수부터 들여다보자.

 

SetFootOffsets함수를 보면 입력받는 파라미터가 6개이다.

 

Enable_FootIK_L, ik_foot_l, root 의 1개의 커브값과 2가지 본 이름을 가져온다.

 

1. Enable_FootIK_L : 해당 커브값은 평소 서있을 때에의 값은 1이고, 액션을 하는 점프상태, 구르기 상태일때는 0이 되고 해당 모션이 끝나면 값이 1이된다. 

 

2. ik_foot_l 본: 해당 본은 기본적인 발목의 뼈 본 이름이다.

3. root 본 : 대부분 스켈레탈 메시 본의 최상단 구조로 양 발 사이 가운데 지점이다.

 

그리고 2개의 Vector값과 1개의 Rotator값을 참조로 받는다. (아이콘 모양 다름)

일반적으로 넘겨주는건 동그란데 참조를 체크해주면 각이 생긴다. 해당 3개의 값은 어떻게 쓰이는지, 함수를 들어가서 보도록 하자

 

 

아래 3개 변수에 참조전달 체크가 되어있다.

 

 

함수내부

해당 코멘트를 번역하자면,

항상 Foot IK 커브값이 있을때만 FootIK Offset 값들을 업데이트합니다. 만약에 0이라면, offset값들을 0으로 초기화해줍니다.

라고한다. 이건 위에서 말한 점프, 구르기 등을 할때는 0이 되어 참조전달 받고 있는 offset값들을 0으로 만들어준다. 

 

그 다음 3개의 노드 시퀀스로 갈라는데 0번부터 보면,

 

해당 코멘트를 번역하면, 

1단계 : 발위치로부터 아래쪽으로 Trace하여, 지오메트리를 찾는다. 표면이 걸을 수 있는경우, Impact Location 과 Impact Normal 값을 저장합니다.

 

달려 있는 코멘트대로 해당 캐릭터의 IKFootBone(발목 본)의 X,Y값root본의 Z값으로 IKFoot FlootLocation Vector값에 저장해준뒤, 

 

해당 값의 일정 높이 만큼위(IK_TraceDistanceAboveFoot=50.0)에서 시작(Start)하고,

해당 값의 일정 아래의 값(IK_TraceDistanceBelowFoot=45.0) 만큼으로 밑(End)으로 Trace를 쏴준다.

그리하여 쏜 Trace가 있고, 캐릭터가 걷기 가는한 상태라면

 

Impact Point와 Impact Normal 값을 저장해준다. 

(Impact Point는 Trace를 쏴서 맞은 월드 위치 값이고, Impact Normal은 맞은 표면의 방향값이다.)

 

 

그 다음을 코멘트를 살펴보면,

 

1.1 단계 : Impact Point와 바닥위치로 예상되는 곳의 차이를 찾습니다.

이러한 값들은 각진 표면에서 더 나은 동작을 하기위해 발 높이에 곱한 Offset 값이 된다.

 

결국에는 Trace하여 얻은 바닥 값(ImpactPoint)에서 발높이 만큼의 올라온 값(ImpactNormal + FootHeight)와 , 

처음에 얻고 있는 캐릭터 Root본 위치의 바닥값의 차이를 구하여 CurrentLocationTarget 값으로 초기화해주고 있다.

 

그 다음으로는 

 

1.2단계 : 바닥에 닿은 Impact Normal의 Atan2를 구해 회전 오프셋을 구해준다.

해당 노드는 간단하지만, 아크탄젠트 함수인 Atan2를 사용하고 있다.

여기서 Atan1과 Atan2은 같은 용도로 사용할수는 있지만, 

Atan1의 각도 범위가 -90~90이기 때문에 90~180등의 각을 표현하지 못하므로 얻을 수 있는 Atan2를 사용한다.

 

그리고 그 다움 시퀀스 1로 넘어가면

 

CurrentLocationOffset을 Location Target으로 보간 초기화합니다.

새로운 Target 값이 현재  Target값보다 높고 낮은지 여부에 따라 다른 속도로 보간해줍니다.

 

시퀀스 0에서 계산 되고 있는 CurrentLocationTarget값과 현재의 CurrentLocationOffset값의 발 높이Offset값을 비교하여 속도로만 보간해준다........결국에는 CurrentLocationOffset값에 CurrentLocationTarget값으로 넣어주는 건 마찬가지이나, 단지 보간 속도의 차이가 있다.

 

 

그 다음 마지막 시퀀스 2에서는

3단계 : 파라미터로 받고 있는 CurrentRotationOffset 값에 시퀀스 0에서  계산하고 있는 TargetRotationOffset값으로 보간 하여 줍니다.

 

일단 이렇게까지가 SetFootOffsets 함수이다. 왼발 오른발 각각 계산하여 주기 때문에 2번 사용 되고 있고 이 다음은,

 

SetPelvisOffset 함수이다. 이 함수는 앞에서 사용 되고 있는 FootOffsetLTarget, FootOffsetRTarget 을 파라미터로 받고 있다. 여기서 입력 받고 있으니 참조전달로 이전에 사용 된것같다. 안그러면 쓸일이 없으니, 

 

 

들어가서 보면

코멘트에는 

Calculate the Pelvis Alpha by finding the average Foot IK weight. If the alpha is 0, clear the offset.

두 발 Foot IK 커브 값의 평균을 구하여, 0 이 아닐때만, 실행되고 0이라면 Offset을 초기화 시켜준다.

 

마찬가지로 점프,구르기 등을 할때는 PelvisOffset을 0으로 초기화해준다.

 

 

그 다음, 시퀀스 2개로 나뉘어 지는데 첫번째 시퀀스 0을 보면

 

Step 1: Set the new Pelvis Target to be the lowest Foot Offset

1단계 : 더 낮은 Foot Offset의 값으로 Pelvis Target 값으로 초기화 해줍니다.

 

여기서 Pelvis Target 값은 해당 함수에서만 사용 하는 지역변수 이다. 어디서 사용되는지는 밑에서 살펴보자.

 

 

Step 2: Interp the Current Pelvis Offset to the new target value. Interpolate at different speeds based on whether the new target is above or below the current one.

2 단계 : Current Pelvis Offset값에 Pelvis Target 값으로 보간합니다. 새로운 Target 값이 현재 Target값 보다 높거나 낮은지에 따라 보간 속도를 조정해줍니다. 

 

일단 여기까지 Foot IK의 연산 방법이었다.

 

이제 다음글에서  여기서 계산되어 나온 값들을 가지고 적용하는 애님 그래프를 확인해보도록 하자 .