特定条件のモーション素材でカーブをいじるとプレビュー画面からキャラクタが消える

お世話になっております。

特定のモーション素材でカーブをいじるとデータを保存するまでRootのスケルトンのスケールが0になってキャラクタが消えてしまいプレビューしながら値が編集できないそうです。

発生の条件は、

・EnableRootMotionがON

・Adidive Anim TypeがMesh SpaceもしくはLocal Space

・カーブを追加し、編集する

再現できるサンプルと再現手順の動画を添付いたしますので調査のほどよろしくお願いします。link text

お世話になっております。

再現プロジェクトを共有いただき、ありがとうございます。

こちらでも検証を進めてまいります。

引き続きよろしくおねがいします。

お世話になっております。

こちら、手元でも再現いたしました。

コードを確認すると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);
	}

以上となります。

また、挙動としてはバグに見受けられますので、別途バグ登録させていただこうと思います。

お手数をおかけしますが、よろしくお願いします。

ご報告ありがとうございます。
こちらでも再現し、データベースとして登録いたしました。

UE-61522 - If “Additive Anim Type” isn’t “No Additive”, constant values of curves can be broken

この問題は、AnimSequence.cpp内部のUAnimSequence::BakeOutAdditiveIntoRawData()にてAddtive用にCurveデータを再生する際に一定の値だった場合はキーを打たないようにしているためです。(IsNewKeyDifferent部分です。)

if (!bHasKeys || IsNewKeyDifferent(RawCurve->FloatCurve.GetLastKey(), CurveEL.Value))
{
	RawCurve->UpdateOrAddKey(CurveEL.Value, CurrentFrameTime);
}

こちら修正されるまで、暫定的な対応としましては、上記if()をコメントアウトし、必ずその部分を通るようにしていただければと思います。

ご不便をおかけいたしますが、よろしくお願いいたします。

お世話になっております。

エンジンをいじって対応してみます。

対応ありがとうございました。

ご返答ありがとうございます。

以下の情報で登録させていただきました。

UE-60019 / Scale is 0.0f when editing a curve with Animation Sequencer.

よろしくお願いします。

お世話になっております。

上記の対応でモデルが消える件は解決しました。

ですが、上記素材のアニメーションカーブの値がうまく出力されないようです。

キーを打った直後は、アニメーションカーブウィンドウで自動にチェックを入れると正しく出るのですが一回Saveすると値の挙動がおかしくなるようです(今回の修正とは関係ない不具合です)

ランタイム上でもプレビュー画面と同じく想定していない動きをしますが、モーションをエクスポートしてもおかしなキーが打たれている気配がありません。

モーションのキーの数も増やしてみたのですがうまくいきませんでした。

以前添付した素材で同様の動きをしているようなので、調査のほどお願いいたします。

お世話になっております。

Save以降の処理まで確認ができておらず大変失礼いたしました。

現在こちらでSave後の挙動について調査を行っております。

引き続きよろしくおねがいします。

お世話になっております。

こちら、お時間を頂いてしまい申し訳ありません。

問題として発生しているのは以下の現象で相違ないでしょうか?

アニメーションカーブを編集した際、編集直後はアニメーションカーブウィンドウの自動にチェックを入れた時は正しく結果が出力されているが、Saveを行うとキーの補完が強制的にLinearに設定されてしまう(グラフの表示状はLinearでなくてもアニメーションカーブウィンドウのウェイトの値はLinearの変化となっている)、というものでしょうか?

こちらで確認したところ、以前にお伝えしたコードの変更を行いビルドしたエンジンではSave後に強制的にLinearに変わる挙動が見られませんでした。

現在、別の原因がないか調査しております。

よろしくお願いします。

お世話になっております。

お時間を頂いてしまい申し訳ありません。

以前に添付いただいたプロジェクトで再現いたしました。

こちらコードを追ってみたところ、保存が実行されたタイミングではCurve内のkeyの正常な値は保持されたままのようでした。

ただ、別のプロジェクトのアニメーションシーケンスのAssetではSave後のプレビューの表示も問題なく出力されていました。

現在、不具合が発生しているアセットを検証中です。

引き続きよろしくおねがいします。

お世話になっております。

問題が発生しているアセットを確認いたしましたところ、Additive SettingsがMesh Spaceに設定されていました。

こちらの設定をNo additiveにしたところ、問題の症状が発生しなくなりました。

該当の設定項目を確認いただけますでしょうか?
また、こちらの設定は意図したものでしょうか?

よろしくおねがいします。

こちら急ぎ対応しております。お時間頂き恐縮ですが、今しばらくお待ちください。

お世話になっております。

お渡したサンプルですと1.0->1.0->0.0にしたいのですが、キーを打った直後はカーブウィンドウで自動にチェックを入れてみてみると1->0となります。

ですがSaveしてプレビューすると間の値が0.23とかになってしまいます。

最初のデータは、キーが2個しか打たれていないのが気になったので0にする直前に1のキーも入れてみたのですが1-1の間でも0.97とか1にならない挙動をしました。

また補完タイプもConstantで設定しており、アセットアクションでエクスポートして正しく設定されているのは確認しています。

お世話になっております。

こちらの設定は意図したものになります。

今想定している使い方は、下半身をベースのモーションにして上半身を加算でブレンドすることで上半身と下半身のモーションの組み合わせで動きを作れるようにしています。

今回、上半身の攻撃モーション(加算)にカーブ情報を入れてその値に連動してIK制御をするのを試している所です。

引き続き調査をよろしくお願いします。