Large fbx import causes some keyframes to be in a broken state

When testing importing this very large rig (millions of vertices and 264 bones)
Some of the keyframes seem to be in a broken state.


You can see from this video where I’m scrubbing through the keyframes, everything looks good.
Once I play the animation, the hands on the right are jittering.


Further investigation where I look at the keyframes in one of the broken hands shows this.
The orientation values appear to completely change when running.


If I manually change some of the rotations by hand and play it, everything appears to be fine?
(doesn’t matter what I change them to, as long as some sort of update to the keyframe gets triggered)


Finally for comparison, if I look at the orientation values of bone “hand6:arm_root” on the very first keyframe of time 0.
This is what it looks like in the animation editor:


And this is what it looks like in the keyframe:


As you can see, something is clearly in a broken state as there isn’t any logical reason why arbitrary bone keyframes are not working properly. Other than the rig being very large, I’m unsure why this is happening


Rig used in example: (includes animation)

(cannot send fbx directly because its >10mb)

Place with rig (using keyframes from AnimSaves/working)
BrokenRig_2.rbxl (669.5 KB)

2 Likes

Your rig has left arm MeshParts that are inside-out (flipped normals), because they were likely created by just making reflected copies of the right arm parts (possibly all automatically with mirroring). You don’t see them as inside out in your 3D modeling and animation app because the animation transforms are also flipped; i.e. they have a scale value of -1.0, so the animation transforms actually turn the left arms back right-side out!

The trouble with this is that Roblox’s animator doesn’t support scale in animation transforms, because properly CFrame are only meant to store orthonormal rotation matrices and a translation vector. When your FBX is imported, the FBX SDK is baking that -1 scale into the transforms, resulting in an invalid CFrame with a -1 determinant.

The reason things look OK when you scrub your animation with snapping set to Keyframes is that both CFrames and Bones can actually store and display CFrames with -1 scale correctly, but… in between keyframes, a weighted CFrame:Lerp gets done in order to interpolate between them, and the result is not correct because the resulting CFrame is getting re-orthonormalized, not preserving the negative scale and not producing the interpolation.

What you should do is change your source file so that animation scale of -1 is not being used to flip the left arm copies back right-side out. You should flip all of these parts back manually, and then correct the animation transform scales back to +1 also. A file so corrected will import and work as expected in Roblox.

2 Likes

Thank you so much for this thoroughly written explanation of the issue. This makes so much sense now. Very appreciated

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.