관리 메뉴

기억을 위한 기록들

언리얼 커스텀 애니메이션 노드 만들기- 분석편(2)(feat. Bone Modify) 본문

UnrealEngine/Unreal Engine 관련

언리얼 커스텀 애니메이션 노드 만들기- 분석편(2)(feat. Bone Modify)

에드윈H 2020. 7. 13. 13:36

우선 새로 작성하기에 앞서 기존에 엔진에 있던 애니메이션 그래프를 하나 까보도록 하자.

 

 

간단하게 본 하나를 정해준 뒤, 해당 본의 위치/회전/스케일을 조절 할 수 있는 본 트랜스폼(변경)이다.

 

 

해당 그래프는 

 

우선먼저 해당 그래프이 실질적인 계산이 일어나는 부분인 AnimNode관련된 파일인

 

 

\Engine\Source\Runtime\AnimGraphRuntime\Public\BoneControllers 폴더 안에

 

AnimNode_ModifyBone.h 을 보자면,

 

 

해당 클래스를 간단하게 살펴보면,

enum으로 3가지 본 수정모드(?)구분을 해주고 있다.

BMM_Ignode /* 이것은 이 채널을 무시한다(기존 골격 변환, 회전 또는 척도를 유지한다). */

BMM_Replace /*이것은 기존 본의 translation, rotation 또는 Scale을 대신한다. */

BMM_Addtive /*이것은 기존 본의 translation, rotation 또는 Scale에 더 해준다. */

 

 

그리고, 위에서부터  기본 FBoneReference BoneToModify;  변수와

Location,Rotation,Scale 등을 나타내는 변수 3개와

 해당 변수들의 본 수정 모드를 설정하는 변수와,

 

기본 엔진내부에 있는 EBoneControlSpace 변수를 이용하여

 

AnimTypes.h

Space구분을  지어주고 있다.

 

 

그리고 해당 구조체 생성자와, 익숙한 변수가 있다.

 

이전 글에서 해당 애니메이션 그래프의 실질적인 연산이 되는데 사용 되는 함수들과

 

이전에는 보지 못한 함수도 있다. 해당 함수들을 살펴보자.

 

cpp 파일을 보면,

 

 

해당 구조체의 변수들을 초기화 해주고 있다.

 

우선 GatherDebugData(..)함수는 콘솔명령 ShowDebug Animation 시 확인 가능하도록 하게 하는 함수이다.

 

다음 EvaluateSkeletalControl_AnyThread(..)함수는 '포즈'를 만들어내기 위한 함수로 중요한 부분이다.

 

크게 보면 EBoneModificationMode 변수에 따라 각각의 LRS가 'BMM_Ignore'(무시) 상태가 아니라면 if문 진입을 한다.

 

그 다음 제일 먼저

 

FAnimationRuntime::ConvertCSTransformToBoneSpace(...) 함수에 각각의 설정과 LRS 값을 넣어주는데,

 

해당 함수는 

AnimationRuntime.cpp 

라는 내용으로 필요에 맞는 ComponentSpace으로 맞춰준다.

그 다음 

BMM_Additive 상태라면 현재 본 위치(LTS)에 새로운 값을 곱해준다. (말그대로 더하여 준다.)

그리고 else는 나머지인 BMM_Replace을 뜻하며, 새로운 값을 그대로 적용 시켜준다.

 

그리하고 해당 본의 Transform을 다시

FAnimationRuntime::ConvertBoneSpaceTransformToCS(..)함수로 적용시켜준다.

(여기서 Convert BoneSpace Transform To CS에서 마지막 CS는 Component Space을 뜻한다.)

해당 함수를 살펴보면,

AnimationRuntime.cpp 

로 각 필요에 맞게 다시 설정해준다.

 

즉, Component Space(CS) -> Bone Space로 변환해주었다가. 각각의 LTS설정에 따라(Ignore,Additive,Replace 등) 값을 맞춰준 다음, 다시 Bone Space -> Component Space(CS)로 변환해준다.

 

각 변환 해주는 함수의 설명은 배제하겠다. (할줄몰라도 안하는거 아니다...진짜다...!)

 

그 다음

해당 함수는 해당 스켈레톤의 유효성을 검사해주는 함수이다.

 

 

그 다음

해당 함수는 본 참조를 초기화해준다. 

 

이렇게 FAnimNode_MofifyBone을 살펴보았다.

 

그러면 이제 이 구조체가 어떻게 애니메이션 그래프에 표현되는지 살펴보자.

 

그 다음으로 봐야 할 파일은 ,

 

 

\Engine\Source\Editor\AnimGraph\Classes 에 있는

 

AnimGraphNode_ModifyBone.h 파일이다.

 

보니 처음 보는 낯선 함수들이 많다..! 당황하지말자

 

 

우선 public에 속해 있는 2개의 함수를 보자(이전 글에서 보아 익숙하다.)

 

GetToolTipText() : 해당 그래프를 간단히 설명해주는 함수이다.

GetNodeTitle() : 해당 그래프의 이름을 그래프 상에서 나타내주는 함수이다.

 

그 다음 다시 위에서부터 보면 첫줄부터 생성자 부분까지

생성자에서 해주는 변수 초기화는 1가지로 int형 CurWidgetMode를 WM_Rotate;을 형변환하여 넣어준다.

(해당 값은 3이다.)

 

그다음 2개의 함수

ValidateAnimNodeDuringCompilation(...) 함수의 설명으로는

"런타임에 사용하기 위해 해당 노드를 수집하기 전에 각 시각적 노드에 최종 유효성 검사를 수행할 수 있는 기회 제공."

간단하게 해당 노드를 컴파일하는동안 유효성 검사를 하여 MessageLog에 띄어준다.

 

그 밑에

 

GetControllerDescription() : 함수는 해당 그래프의 이름을 띄어준다.