お世話になっております。
こちら、手元でも再現いたしました。
コードを確認するとScaleを - FVector(1.f)行っている箇所があり、そこでscaleがマイナスされているのが原因でした。
以下のコードを編集することで現象を回避できると思いますので、ご検討いただけますでしょうか。
AnimSequence.hのResetRootBoneForRootMotionの宣言に引数を追加します。
void ResetRootBoneForRootMotion(FTransform& BoneTransform, const FBoneContainer & RequiredBones, ERootMotionRootLock::Type InRootMotionRootLock, bool isScale) const;
AnimSequence.cppのResetRootBoneForRootMotionの定義を以下のように変更します。
void UAnimSequence::ResetRootBoneForRootMotion(FTransform& BoneTransform, const FBoneContainer& RequiredBones, ERootMotionRootLock::Type InRootMotionRootLock, bool isScale) const
{
switch (InRootMotionRootLock)
{
case ERootMotionRootLock::AnimFirstFrame: BoneTransform = ExtractRootTrackTransform(0.f, &RequiredBones); break;
case ERootMotionRootLock::Zero: BoneTransform = FTransform::Identity; break;
default:
case ERootMotionRootLock::RefPose: BoneTransform = RequiredBones.GetRefPoseArray()[0]; break;
}
if (isScale && IsValidAdditive() && InRootMotionRootLock != ERootMotionRootLock::AnimFirstFrame)
{
//Need to remove default scale here for additives
BoneTransform.SetScale3D(BoneTransform.GetScale3D() - FVector(1.f));
}
}
同ファイルの呼び出しで引数を追加します。
#if WITH_EDITOR
// this happens only with editor data
// Slower path for disable retargeting, that's only used in editor and for debugging.
if (bUseRawDataForPoseExtraction)
{
const bool bShouldUseSourceData = (RequiredBones.ShouldUseSourceData() && SourceRawAnimationData.Num() > 0);
const TArray& AnimationData = bShouldUseSourceData ? SourceRawAnimationData : RawAnimationData;
BuildPoseFromRawData(AnimationData, OutPose, ExtractionContext.CurrentTime);
if ((ExtractionContext.bExtractRootMotion && bEnableRootMotion) || bForceRootLock)
{
ResetRootBoneForRootMotion(OutPose[FCompactPoseBoneIndex(0)], RequiredBones, RootMotionRootLock, false);
}
return;
}
#endif // WITH_EDITOR
// Once pose has been extracted, snap root bone back to first frame if we are extracting root motion.
if ((ExtractionContext.bExtractRootMotion && bEnableRootMotion) || bForceRootLock)
{
ResetRootBoneForRootMotion(OutPose[FCompactPoseBoneIndex(0)], RequiredBones, RootMotionRootLock, true);
}
以上となります。
また、挙動としてはバグに見受けられますので、別途バグ登録させていただこうと思います。
お手数をおかけしますが、よろしくお願いします。