애니메이션 노드를 정리한 애니메이션 노드를 만들어 보았습니다.
Transform (Modify) 노드에 필요한 노드를 정리해보기
이번에는 애님 그래프로 배치하는 노드를 하나로 정리한 노드를 C++로 만들어 보겠습니다.
정리하는 노드는 이쪽.
애님 그래프로 배치하면 다음과 같습니다.
변경된 것을 알 수 있듯이 Transform (Modify) Bone 노드에서 루트 본을 약간 위로 올려보십시오.
(변경하는 파라미터는 빨간색 테두리로 묶여 있습니다.)
Anim Behavior 노드 준비
이제 Anim Behavior 노드를 준비합니다.
이번에도 규모는 크지 않기 때문에, 소스 코드를 그대로 싣습니다.
AnimNode_MyTransformBone.h#pragma once
#include "Animation/AnimNodeBase.h"
#include "Animation/AnimNodeSpaceConversions.h"
#include "BoneControllers/AnimNode_ModifyBone.h"
#include "AnimNode_MyTransformBone.generated.h"
USTRUCT()
struct MYSANDBOX_API FAnimNode_MyTransformBone : public FAnimNode_Base
{
GENERATED_USTRUCT_BODY()
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Links)
FPoseLink SourcePose;
public:
FAnimNode_MyTransformBone();
virtual void Initialize(const FAnimationInitializeContext& Context) override;
virtual void CacheBones(const FAnimationCacheBonesContext& Context) override;
virtual void Update(const FAnimationUpdateContext& Context) override;
virtual void Evaluate(FPoseContext& Output) override;
private:
FAnimNode_ConvertLocalToComponentSpace LocalToComponentNode;
FAnimNode_ModifyBone ModifyBoneNode;
FAnimNode_ConvertComponentToLocalSpace ComponentToLocalNode;
};
AnimNode_MyTransformBone.cpp#include "MySandbox.h"
#include "AnimNode_MyTransformBone.h"
#include "Animation/AnimInstanceProxy.h"
// ----------------------------------------------------------------------------
FAnimNode_MyTransformBone::FAnimNode_MyTransformBone()
: LocalToComponentNode()
, ModifyBoneNode()
, ComponentToLocalNode()
{
}
// ----------------------------------------------------------------------------
void FAnimNode_MyTransformBone::Initialize(const FAnimationInitializeContext& Context)
{
FAnimNode_Base::Initialize(Context);
// ノードやポーズを接続する
ComponentToLocalNode.ComponentPose.SetLinkNode(&ModifyBoneNode);
ModifyBoneNode.ComponentPose.SetLinkNode(&LocalToComponentNode);
LocalToComponentNode.LocalPose = SourcePose;
// Transform(Modify) Bone ノードでルートボーンを少しだけ上に上げる。
ModifyBoneNode.BoneToModify.BoneName = FName("Root");
ModifyBoneNode.BoneToModify.Initialize(Context.AnimInstanceProxy->GetSkeleton());
ModifyBoneNode.Translation = FVector(0, 0, 100);
ModifyBoneNode.TranslationMode = BMM_Replace;
ComponentToLocalNode.Initialize(Context);
}
// ----------------------------------------------------------------------------
void FAnimNode_MyTransformBone::CacheBones(const FAnimationCacheBonesContext& Context)
{
ComponentToLocalNode.CacheBones(Context);
}
// ----------------------------------------------------------------------------
void FAnimNode_MyTransformBone::Update(const FAnimationUpdateContext& Context)
{
ComponentToLocalNode.Update(Context);
}
// ----------------------------------------------------------------------------
void FAnimNode_MyTransformBone::Evaluate(FPoseContext& Output)
{
ComponentToLocalNode.Evaluate(Output);
}
이번에는 FAnimNode_ModifyBone을 포함하므로 다음 모듈을 '~.Build.cs'의 'PublicDependencyModuleNames'에 추가해야 합니다.
#pragma once
#include "Animation/AnimNodeBase.h"
#include "Animation/AnimNodeSpaceConversions.h"
#include "BoneControllers/AnimNode_ModifyBone.h"
#include "AnimNode_MyTransformBone.generated.h"
USTRUCT()
struct MYSANDBOX_API FAnimNode_MyTransformBone : public FAnimNode_Base
{
GENERATED_USTRUCT_BODY()
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Links)
FPoseLink SourcePose;
public:
FAnimNode_MyTransformBone();
virtual void Initialize(const FAnimationInitializeContext& Context) override;
virtual void CacheBones(const FAnimationCacheBonesContext& Context) override;
virtual void Update(const FAnimationUpdateContext& Context) override;
virtual void Evaluate(FPoseContext& Output) override;
private:
FAnimNode_ConvertLocalToComponentSpace LocalToComponentNode;
FAnimNode_ModifyBone ModifyBoneNode;
FAnimNode_ConvertComponentToLocalSpace ComponentToLocalNode;
};
#include "MySandbox.h"
#include "AnimNode_MyTransformBone.h"
#include "Animation/AnimInstanceProxy.h"
// ----------------------------------------------------------------------------
FAnimNode_MyTransformBone::FAnimNode_MyTransformBone()
: LocalToComponentNode()
, ModifyBoneNode()
, ComponentToLocalNode()
{
}
// ----------------------------------------------------------------------------
void FAnimNode_MyTransformBone::Initialize(const FAnimationInitializeContext& Context)
{
FAnimNode_Base::Initialize(Context);
// ノードやポーズを接続する
ComponentToLocalNode.ComponentPose.SetLinkNode(&ModifyBoneNode);
ModifyBoneNode.ComponentPose.SetLinkNode(&LocalToComponentNode);
LocalToComponentNode.LocalPose = SourcePose;
// Transform(Modify) Bone ノードでルートボーンを少しだけ上に上げる。
ModifyBoneNode.BoneToModify.BoneName = FName("Root");
ModifyBoneNode.BoneToModify.Initialize(Context.AnimInstanceProxy->GetSkeleton());
ModifyBoneNode.Translation = FVector(0, 0, 100);
ModifyBoneNode.TranslationMode = BMM_Replace;
ComponentToLocalNode.Initialize(Context);
}
// ----------------------------------------------------------------------------
void FAnimNode_MyTransformBone::CacheBones(const FAnimationCacheBonesContext& Context)
{
ComponentToLocalNode.CacheBones(Context);
}
// ----------------------------------------------------------------------------
void FAnimNode_MyTransformBone::Update(const FAnimationUpdateContext& Context)
{
ComponentToLocalNode.Update(Context);
}
// ----------------------------------------------------------------------------
void FAnimNode_MyTransformBone::Evaluate(FPoseContext& Output)
{
ComponentToLocalNode.Evaluate(Output);
}
노드와 포즈 연결
UE4 4.15부터 FPoseLinkBase::SetLinkNode라는 함수가 추가되었습니다.
이게 뭐야? 라고 하면, 애님 그래프로 말하는 곳의 포즈와 노드를 연결하는 부분에 상당합니다.
예를 들어,
ModifyBoneNode.ComponentPose.SetLinkNode(&LocalToComponentNode);
이것을 애님 그래프로 표현하면 다음과 같습니다.
이번 경우에는
ComponentToLocalNode.ComponentPose.SetLinkNode(&ModifyBoneNode);
ModifyBoneNode.ComponentPose.SetLinkNode(&LocalToComponentNode);
이렇게 기술하는 것만으로 3개의 노드를 연결한 것입니다.
입력 포즈를 포함하는 노드로 전달
사용자 정의 노드의 입력 포즈를 포함하는 노드에 전달하려면 다음과 같이 포즈를 할당하십시오.
LocalToComponentNode.LocalPose = SourcePose;
이것은 Initialize 로 한 번 대입하면 괜찮습니다.
루트 노드 함수 호출만으로 사용자 정의 노드 업데이트
이와 같이 노드나 포즈를 연결했을 경우, 루트 노드(애님 그래프로 보고, 제일 마지막에 실행되는 노드. 이번의 경우는 ComponentToLocal 노드)의 Initialize 나 Update, Evaluate 를 호출하는 것만으로, 연결된 모든 노드 처리가 수행됩니다.
예를 들어, 이번 커스텀 노드의 Evaluate는 이것뿐입니다.
void FAnimNode_MyTransformBone::Evaluate(FPoseContext& Output)
{
ComponentToLocalNode.Evaluate(Output);
}
Anim Graph 노드 준비
Anim Behavior 노드가 준비되면 Anim Graph 노드를 준비합니다.
이번에도 타이틀을 바꾸었을 뿐이므로, 포즈를 돌려주는 노드 와 완전히 같은 구성입니다.
만약을 위해, 코드를 올려 둡니다.
AnimGraphNode_MyTransformBone.h#pragma once
#include "AnimGraphNode_Base.h"
#include "Animation/AnimNode/AnimNode_MyTransformBone.h"
#include "AnimGraphNode_MyTransformBone.generated.h"
UCLASS()
class UAnimGraphNode_MyTransformBone : public UAnimGraphNode_Base
{
GENERATED_UCLASS_BODY()
UPROPERTY(EditAnywhere, Category = Settings)
FAnimNode_MyTransformBone Node;
public:
virtual FText GetNodeTitle(ENodeTitleType::Type TitleType) const override;
};
AnimGraphNode_MyTransformBone.cpp#include "MySandboxDeveloper.h"
#include "AnimGraphNode_MyTransformBone.h"
#define LOCTEXT_NAMESPACE "MySandboxDeveloper"
UAnimGraphNode_MyTransformBone::UAnimGraphNode_MyTransformBone(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
}
// ----------------------------------------------------------------------------
FText UAnimGraphNode_MyTransformBone::GetNodeTitle(ENodeTitleType::Type TitleType) const
{
return LOCTEXT("AnimGraphNode_MyTransformBone_Title", "My Transform Bone");
}
#undef LOCTEXT_NAMESPACE
UE4Editor에서 확인
이렇게 완성된 노드가 이쪽입니다. 이전과 마찬가지로 인수는 입력 포즈뿐입니다.
Reference
이 문제에 관하여(애니메이션 노드를 정리한 애니메이션 노드를 만들어 보았습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/go_astrayer/items/eb8b2d249018ac4f472f
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
#pragma once
#include "AnimGraphNode_Base.h"
#include "Animation/AnimNode/AnimNode_MyTransformBone.h"
#include "AnimGraphNode_MyTransformBone.generated.h"
UCLASS()
class UAnimGraphNode_MyTransformBone : public UAnimGraphNode_Base
{
GENERATED_UCLASS_BODY()
UPROPERTY(EditAnywhere, Category = Settings)
FAnimNode_MyTransformBone Node;
public:
virtual FText GetNodeTitle(ENodeTitleType::Type TitleType) const override;
};
#include "MySandboxDeveloper.h"
#include "AnimGraphNode_MyTransformBone.h"
#define LOCTEXT_NAMESPACE "MySandboxDeveloper"
UAnimGraphNode_MyTransformBone::UAnimGraphNode_MyTransformBone(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
}
// ----------------------------------------------------------------------------
FText UAnimGraphNode_MyTransformBone::GetNodeTitle(ENodeTitleType::Type TitleType) const
{
return LOCTEXT("AnimGraphNode_MyTransformBone_Title", "My Transform Bone");
}
#undef LOCTEXT_NAMESPACE
이렇게 완성된 노드가 이쪽입니다. 이전과 마찬가지로 인수는 입력 포즈뿐입니다.
Reference
이 문제에 관하여(애니메이션 노드를 정리한 애니메이션 노드를 만들어 보았습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/go_astrayer/items/eb8b2d249018ac4f472f텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)