If you use StartFrameOffset set to 1 or higher in conjunction with the Use Animation Blueprint, the character's animation will be rough towards the end of the section. Specifically, it seems that the animation specified in the section and its reference pose are switched every frame.
In UE5.1, the implementation of FMovieSceneSkeletalAnimationSectionTemplateParameters::MapTimeToAnimation was changed so that the calculation result including StartFrameOffset exceeds the animation playback range.
5.0
AnimPosition += InFrameRate.AsSeconds(FirstLoopStartFrameOffset); if (SeqLength > 0.0 && (bLooping || !FMath::IsNearlyEqual(AnimPosition, SeqLength, 1e-4))) { AnimPosition = FMath::Fmod(AnimPosition, SeqLength); } AnimPosition += InFrameRate.AsSeconds(StartFrameOffset); if (bReverse) { AnimPosition = GetSequenceLength() - AnimPosition; } return AnimPosition; }
5.1
// The Time from the beginning of SectionStartTime to InPosition in seconds double SecondsFromSectionStart = FFrameTime::FromDecimal((InPosition - SectionStartTime).AsDecimal() * AnimPlayRate) / InFrameRate; // Logic for reversed animation if (bReverse) { // Duration of this section double SectionDuration = (((SectionEndTime - SectionStartTime) * AnimPlayRate) / InFrameRate); SecondsFromSectionStart = SectionDuration - SecondsFromSectionStart; } // Make sure Seconds is in range if (SeqLength > 0.0 && (bLooping || !FMath::IsNearlyEqual(SecondsFromSectionStart, SeqLength, 1e-4))) { SecondsFromSectionStart = FMath::Fmod(SecondsFromSectionStart, SeqLength); } // Add the StartFrameOffset and FirstLoopStartFrameOffset to the current seconds in the section to get the right animation frame SecondsFromSectionStart += InFrameRate.AsSeconds(StartFrameOffset) + InFrameRate.AsSeconds(FirstLoopStartFrameOffset); return SecondsFromSectionStart; }
So, FAnimMontageInstance::SetSequencerMontagePosition creates and destroys AnimMontage intermittently.
It is possible to fix the behavior by changing the timing of FMath::Fmod implementation in 5.1 as follows. But it will likely conflict with the changes made by other fix code.
double FMovieSceneSkeletalAnimationSectionTemplateParameters::MapTimeToAnimation(FFrameTime InPosition, FFrameRate InFrameRate) const { ... //for fix SecondsFromSectionStart += InFrameRate.AsSeconds(FirstLoopStartFrameOffset); // Make sure Seconds is in range if (SeqLength > 0.0 && (bLooping || !FMath::IsNearlyEqual(SecondsFromSectionStart, SeqLength, 1e-4))) { SecondsFromSectionStart = FMath::Fmod(SecondsFromSectionStart, SeqLength); } // Add the StartFrameOffset and FirstLoopStartFrameOffset to the current seconds in the section to get the right animation frame // for fix //SecondsFromSectionStart += InFrameRate.AsSeconds(StartFrameOffset) + InFrameRate.AsSeconds(FirstLoopStartFrameOffset); SecondsFromSectionStart += InFrameRate.AsSeconds(StartFrameOffset); return SecondsFromSectionStart; }
result : Character animation is erratic in the second half of the Animation track's section
I am not able to find world outliner how to enable it?
How can i modify the param name in EQS node
Undefined sysmbol: typeinfo for AActor when cross-compile linux dedicated server on windows
I'm working on a VR Project and I cannot add Nav Mesh to the stairs??
How to achieve HLSL Multiple Render Target in Material blueprints?
How does TextureRenderTarget2D get TArray<uint8> type data?
What method is used to fill polygonal regions when drawing spline mesh at run time?
Teleporter in the Creative Hub is Locked and cannot be accessed
There's no existing public thread on this issue, so head over to Questions & Answers just mention UE-175425 in the post.
0 |
Component | UE - Anim - Sequencer - Anim in Engine |
---|---|
Affects Versions | 5.1, 5.2 |
Target Fix | 5.2 |
Created | Jan 30, 2023 |
---|---|
Resolved | Jan 30, 2023 |
Updated | Feb 14, 2023 |