We now have the following error that is generated in FFbxImporter::ValidateAnimStack
if (!FMath::IsNearlyZero(SubFrame, KINDA_SMALL_NUMBER) && !FMath::IsNearlyEqual(SubFrame, 1.0f, KINDA_SMALL_NUMBER)) { AddTokenizedErrorMessage(FTokenizedMessage::Create(EMessageSeverity::Error, FText::Format(LOCTEXT("Error_InvalidImportLength", "Animation length {0} is not compatible with import frame-rate {1} (sub frame {2}), animation has to be frame-border aligned."), FText::AsNumber(SequenceLengthInSeconds), TargetFrameRate.ToPrettyText(), FText::AsNumber(SubFrame))), FFbxErrors::Animation_InvalidData); return false; }
However, we always hit this error for animations that were generated with fractional framerates (like 29.97/NTSC). This is because the FBX import code assumes that framerates can be stored as an int rather than float/double (FFbxImporter::ImportAnimations):
else { // For FBX data, "Frame Rate" is just the speed at which the animation is played back. It can change // arbitrarily, and the underlying data can stay the same. What we really want here is the Sampling Rate, // ie: the number of animation keys per second. These are the individual animation curve keys // on the FBX nodes of the skeleton. So we loop through the nodes of the skeleton and find the maximum number // of keys that any node has, then divide this by the total length (in seconds) of the animation to find the // sampling rate of this set of data // we want the maximum resample rate, so that we don't lose any precision of fast anims, // and don't mind creating lerped frames for slow anims int32 BestResampleRate = GetMaxSampleRate(SortedLinks); if (BestResampleRate > 0) { ResampleRate = BestResampleRate; } }
There's no existing public thread on this issue, so head over to Questions & Answers just mention UE-161914 in the post.
56 |
Component | UE - Anim - Runtime |
---|---|
Affects Versions | 5.0.3 |
Target Fix | 5.6 |
Created | Aug 24, 2022 |
---|---|
Updated | Sep 16, 2024 |