관리 메뉴

기억을 위한 기록들

Youtube /CPP- FootPlaceAlgorithm - AnimInstance 본문

UnrealEngine/Foot-Place IK 관련

Youtube /CPP- FootPlaceAlgorithm - AnimInstance

에드윈H 2020. 6. 30. 22:32

- EffectorLocation 을 지정해주는 왼발 오른발 각각 함수 1개씩.

 

- Alpha값을 정해주는 마찬가지로 왼발오른발 각각 함수 1개씩.

 

- 왼발/오른발 관련 변수 각각3개 (EffectorLocatiom/JointTarget/FootAlpah)씩 3개 변수는 애니메이션 그래프에서 사용 된다.

 

 

AnimInstance CPP 부분

 

 

 

크게 복잡한거 없다.

 

 

다만 생성자 부분 JointTarget 변수에 각각 지정된 Vector값을 넣어준다.

 

그리고 

 

EffectorLocation 에는 새로 들어오는 값, 캐릭터 클래스에서 넣어주는 값으로 초기화해준다.

 

Alpha 값도 마찬가지

 

캐릭터 클래스 Tick 함수 중 넣어주는것을 확인할 수 있다.

 

이제 애니메이션 그래프를 확인해보자

 

 

 

위에서 설정 해준, EffectorLocation/JointTarget/Alpha 값은

 

Skeletal Mesh Control 노드 중 '2 본 IK' 라는  노드에 넣어준다.

 

https://docs.unrealengine.com/ko/Engine/Animation/NodeReference/SkeletalControls/TwoBoneIK/index.html

 

Two Bone IK

투 본 IK 를 사용해서 3 조인트 체인에 IK 를 적용하는 법입니다.

docs.unrealengine.com

관련으로는 공식문서에서 확인 해볼 수 있는데,

 

https://www.youtube.com/watch?time_continue=7&v=UgmGcHKmUDk&feature=emb_title

이처럼 변수를 활용해 캐릭터마다 다른 포즈 애니메이션 작업을 손수 해 줄 필요 없이 캐릭터가 무기 잡는 방식 등 캐릭터 모션 이외의 상호작용 관련에서 디테일한 도움을 받을 수 있다. 

 

 

이제 설정 해준 2 본 IK 를 보면

 

 

 

우선 하나씩 살펴보면

IKBone - 해당 스켈레탈 메시 본을 foot_l로 설정해주고, Effector Location Space 는 WorldSpace 로 설정해주었다.

그 이유로는 이 값은 캐릭터 클래스 Tick 함수에서 설정 해준 값이다.

 

왼발 오른발 높낮이 판별 후 , 파라미터로 넣어준 값을 보면 TraceHit으로 ImpactPoint + FVector(0.f,0.f,14.f)값을 넘겨주는데 즉, Trace를 쏘아서 닿은 지면의 값 + Z 값 14.f을 해주어 WorldLocation으로 설정되어 있었던 것

 

노란색 구체로 Draw 중인 LeftFootEffectorLocation 위치 

 14값은 foot_l 본자체가 땅에서부터의 14.f 정도로 계산한듯 하다. 그로 인해 발목 자체의 Z 높낮이가 변하는 것을 적용가능한것이다.

 

 

다음으로는 무릎의 변화로 JointTarget은 보통 팔관련되면 팔꿈치, 다리 관련되면 무릎을 사용한다고 한다.

일반적으로 Maya나 3D Max 리깅에서 사용 되는 Pole Vector와 같다고 한다. 

https://www.youtube.com/watch?v=e0SB4U4ZQT8&feature=player_detailpage#t=16

즉 Joint Target이란, 무릎(팔꿈치 등)이 향할 수 있는 지점에 지정한다고 생각하면 될것같다. 여기서는 ParentBoneSpace의 타겟 thigh_l로그 결과로 찾아낸 값이

애님 인스턴스 생성자에 있던 값이다. 

 

 

JointTargetLocationSpace로 ParentBoneSpace를 사용하였다.

(ParentBoneSpace 외에 WorldSpace/ComponentSpace/BoneSpace 존재)

 

Joint Taget(관절 타겟)은 thigh_l로  

해당 스켈레탈 메시의 foot_l의 루트 본인 골반 뼈이다.

 

이렇게 완성 된 Join Target 설정

생각보다 엄청 앞으로 되어 있다. 이 값을 잡는 기준은 따로 찾아봐야 할듯

JointTargetLeft=FVector(50.f,217.50296f,-38.598057f);

 

 

이렇게 해서 완성이 되었다

 

 

 

 

 

적용 후 
적용 전 

 

 

예전부터 해당 IK에 관한 내용들이 궁금했는데 마침 간단하게 설명해준 유튜브를 발견하여 작성해보았다.

 

 

여기서 확인 된것은 2가지로

 

1. Effector IK 적용 계산 방법은 World Location을 가져와서 계산하였고, 이 방법 외에 Relative Location으로 하는 방법도 있고 다양하게 있으며 이것 외에도 발견한 IK 관련이 있다면 그때그때 정리해보도록 하겠다. 

 

 

2. Joint Target Location은 무릎으로 보통 지정하나 골반 thigh_l, thigh_r 로도 하는 방법이 있는 것 같다 .