[UE 4]c++でAnimSequenceにFloatCurveを追加
[UE 4]c++でAnimSequenceにFloatCurveを追加
ラベル(スペース区切り):UE 4 unrealengine幻エンジン
プロジェクトに必要なため、アニメーションに関連する多くのデータをアニメーションに記録するには、ユーザ機器UE 4はアニメーションエディタのインタフェースで手動でアニメーションにカーブを追加するしかありません.手動で追加するのは正確ではないので、プラグインを書いてEditorモードでアニメーションデータを抽出して計算します(例えば、アニメーションのフレームごとにボーンノードの速度があり、実行時に処理すると性能がもったいない)、結果をアニメーションの曲線に保存します.そうすると、実行時に現在のアニメーションの曲線から直接取ればいいので、性能を節約して便利です.
UE 4は、FloatCurveとVectorCurveをサポートします.次に、FloatCurveを追加してVectorCurveを追加する方法を説明します.
関連API:
FloatCurve AnimSequenceBaseに存在するRawCurveData(タイプ:FRawCurveTracks)
アニメーションのUSkeletonのSmartName Containerでカーブに新しいName Skeletonを作成します.h :
サンプルコード:
ラベル(スペース区切り):UE 4 unrealengine幻エンジン
プロジェクトに必要なため、アニメーションに関連する多くのデータをアニメーションに記録するには、ユーザ機器UE 4はアニメーションエディタのインタフェースで手動でアニメーションにカーブを追加するしかありません.手動で追加するのは正確ではないので、プラグインを書いてEditorモードでアニメーションデータを抽出して計算します(例えば、アニメーションのフレームごとにボーンノードの速度があり、実行時に処理すると性能がもったいない)、結果をアニメーションの曲線に保存します.そうすると、実行時に現在のアニメーションの曲線から直接取ればいいので、性能を節約して便利です.
UE 4は、FloatCurveとVectorCurveをサポートします.次に、FloatCurveを追加してVectorCurveを追加する方法を説明します.
関連API:
FloatCurve AnimSequenceBaseに存在するRawCurveData(タイプ:FRawCurveTracks)
struct FRawCurveTracks
{
...
TArray FloatCurves // FloatCurve
/**
* UID , true
* bVectorInterpCurve == true, FVectorCuve, FFloatCurve
*/
ENGINE_API bool AddCurveData(USkeleton::AnimCurveUID Uid, int32 CurveFlags = ACF_DefaultCurve, ESupportedCurveType SupportedCurveType = FloatType);
// CurveFlags AnimCurveTypes.h EAnimCurveFlags
/**
* UID , , (Time) (Value)
*/
ENGINE_API void AddFloatCurveKey(const USkeleton::AnimCurveUID Uid, int32 CurveFlags, float Time, float Value);
...
}
アニメーションのUSkeletonのSmartName Containerでカーブに新しいName Skeletonを作成します.h :
// return bool - name ( false)
ENGINE_API bool AddSmartNameAndModify(FName ContainerName, FName NewName, FSmartNameMapping::UID& NewUid);
ContainerName USkeleton::AnimCurveMappingName,
,
UID,
サンプルコード:
{
FName CurveName = FName(TEXT("NewCurve"));
USkeleton::AnimCurveUID CurveUid; // UID
USkeleton* Skeleton = AnimSequence->GetSkeleton(); // AnimSequence
if (Skeleton->AddSmartNameAndModify(USkeleton::AnimCurveMappingName, RootMotionCurveName, CurveUid))
{
AnimSequence->Modify(true);
AnimSequence->RawCurveData.AddCurveData(CurveUid); // AnimSequence
AnimSequence->MarkRawDataAsModified();// AnimSequence ,
}
if (Skeleton->GetSmartNameContainer(USkeleton::AnimCurveMappingName)->Exists(RootMotionCurveName))
//
{
//
int32 CurveFlag = ACF_Metadata;// metadata( , )
float Time = 1.f;
float Value = 0.5f;
// , 1s 0.5
AnimSequence->Modify(true);
AnimSequence->RawCurveData.AddFloatCurveKey(CurveUid, CurveFlag, Time, Value);//
AnimSequence->MarkRawDataAsModified();
UE_LOG(LogTemp, Warning, TEXT("Add FloatCurve Successful"));
}
}