일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 애셋로드
- UE_LOG
- 프로그래머스
- map
- 언리얼가비지컬렉터
- 언리얼엔진구조체
- 강참조
- enumasByue
- dataasset
- 데이터애셋
- C++최적화
- 스마트포인터
- 정렬
- 크리티컬섹션
- stl
- 선택정렬
- moreeffectiveC++
- 약참조
- C++
- unorder_map
- 자료구조
- 람다
- 델리게이트
- BFS
- 람다사용정렬
- UML관련
- 알고리즘
- 정렬알고리즘
- UELOG
- UE4 커스텀로그
- Today
- Total
기억을 위한 기록들
언리얼 커스텀 애니메이션 노드 만들기- 분석편(2)(feat. Bone Modify) 본문
언리얼 커스텀 애니메이션 노드 만들기- 분석편(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 변수를 이용하여
Space구분을 지어주고 있다.
그리고 해당 구조체 생성자와, 익숙한 변수가 있다.
이전 글에서 해당 애니메이션 그래프의 실질적인 연산이 되는데 사용 되는 함수들과
이전에는 보지 못한 함수도 있다. 해당 함수들을 살펴보자.
cpp 파일을 보면,
해당 구조체의 변수들을 초기화 해주고 있다.
우선 GatherDebugData(..)함수는 콘솔명령 ShowDebug Animation 시 확인 가능하도록 하게 하는 함수이다.
다음 EvaluateSkeletalControl_AnyThread(..)함수는 '포즈'를 만들어내기 위한 함수로 중요한 부분이다.
크게 보면 EBoneModificationMode 변수에 따라 각각의 LRS가 'BMM_Ignore'(무시) 상태가 아니라면 if문 진입을 한다.
그 다음 제일 먼저
FAnimationRuntime::ConvertCSTransformToBoneSpace(...) 함수에 각각의 설정과 LRS 값을 넣어주는데,
해당 함수는
라는 내용으로 필요에 맞는 ComponentSpace으로 맞춰준다.
그 다음
BMM_Additive 상태라면 현재 본 위치(LTS)에 새로운 값을 곱해준다. (말그대로 더하여 준다.)
그리고 else는 나머지인 BMM_Replace을 뜻하며, 새로운 값을 그대로 적용 시켜준다.
그리하고 해당 본의 Transform을 다시
FAnimationRuntime::ConvertBoneSpaceTransformToCS(..)함수로 적용시켜준다.
(여기서 Convert BoneSpace Transform To CS에서 마지막 CS는 Component Space을 뜻한다.)
해당 함수를 살펴보면,
로 각 필요에 맞게 다시 설정해준다.
즉, 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() : 함수는 해당 그래프의 이름을 띄어준다.
'UnrealEngine > Unreal Engine 관련' 카테고리의 다른 글
[UE4 함수] Add Tick Prerequisite Actor (0) | 2021.07.01 |
---|---|
[UE4] Camera Shake Setting Tip (0) | 2021.06.06 |
언리얼 커스텀 애니메이션 노드 만들기- 세팅편(1) (1) | 2020.07.05 |
ue4/Lerp(Linear Interpolation) - 선형 보간에 관하여 (0) | 2020.06.29 |
델리게이트 & 다이나믹 델리게이트 (0) | 2020.05.06 |