Page MenuHome

Spline IK 'Fit Curve' scaling incorrect on FBX export
Confirmed, NormalPublicKNOWN ISSUE

Description

System Information
Operating system: Windows-10-10.0.18362-SP0 64 Bits
Graphics card: GeForce GTX 970/PCIe/SSE2 NVIDIA Corporation 4.5.0 NVIDIA 432.00

Blender Version
Broken: version: 2.82 (sub 7), branch: master, commit date: 2020-02-12 16:20, hash: rB77d23b0bd76f

Short description of error
FBX export of a typical Spline IK with non-uniform scaling options (e.g. Fit Curve) gives incorrect results. Baking via F3 -> Bake Action did NOT reproduce the issue.

Problem has apparently been bugging people for a while (see this thread and this video for an example.) A suggested fix is to duplicate the bone chain, remove all parenting and constraints from the new chain and add "Copy Transform" constraints from each new bone to the original. Due to animation baking, I can confirm this does initially appear to work, however: it removes parenting information in the final export, meaning that even with baking, blending between multiple animations will fail completely.

Exact steps for others to reproduce the error

  1. Load the attached .blend file.
  2. Hit Space to play the current action. Notice the correct shape of the animated noodle poses.
  3. Navigate to File -> Export -> FBX.
    1. Under Transform, set 'Apply Scalings' to 'FBX Units scale'
    2. Under Armature, enable 'Only Deform Bones' and disable 'Add Leaf Bones'
    3. Make an Operator Preset to save some trouble.
    4. Hit 'Export FBX'.
  4. Open the exported FBX in Windows 3D Viewer, or whatever application you prefer.
  5. Notice incorrect animated noodle poses.

Blend File:

Broken FBX:

Expected poses:

Result poses:

Comments
I'm not familiar with the source, but in the FBX exporter plugin, a place to look may be in file fbx_utils.py, function fbx_object_matrix, possibly not accounting for the Inherit Scale option. It's pretty hard to decipher without knowing the plugin well, however.

Thanks for your time.

Event Timeline

Richard Antalik (ISS) changed the task status from Needs Triage to Confirmed.Feb 17 2020, 12:43 PM
Richard Antalik (ISS) changed the subtype of this task from "Report" to "Known Issue".

Thanks for acknowledging this issue, hopefully someone takes a look at it soon! If I get some time, I might see if I can get involved, though I'd specifically want to work on this problem.

Also, I haven't tested this, but I suspect it may be affecting non-uniform scale in exported animations unrelated to the Spline IK. If true, I imagine that would affect priority.

As to evaluating importance: as a game dev, this is completely blocking my ability to have "squash and stretch" animations on my main character model (which if you're Disney, is an important feature!) Anyone modeling a creature or humanoid with a tail may also be blocked by this, as evidenced by discussion of this issue on other platforms. And if it's blocking all non-uniform scale, then that's a huge feature that both UE4 and Unity support, and game developers would be missing out on.

Godspeed, Blender devs!

I should give an update, this may help in decision-making:

I went through the trouble of cloning the Blender repo and trying to fix this issue, which turned out to involve "Non-Uniform Scale Inheritance." As it just so happens, FBXNode has an attribute for this, "TransformInheritType", that can be set to one of three values, RrSs = 0, RSrs = 1, Rrs = 2. (See here, but search for "Transformation Propagation") In the current build, it's always set to RSrs, and the output transforms implicitly assume this inheritance type as they're computed. When I modified the code to output the correct inheritance type, and compute the transform accordingly, something interesting happened. I opened it up in Unity and got this warning:

ImportFBX Warnings:
File contains 7 (out of 11) nodes with Scale Compensation. Scale Compensation is not supported by Unity (because it works differently in 3dsMax and Maya). This might result in scale imported incorrectly, if this happens try disabling Scale Compensation in your file.

It was also very, very incorrect. I got much better results in Windows 3D Viewer, however, but still incorrect. (Ultimately I have no idea if my transforms were actually correct, but I don't know of a way to verify besides heavily modifying my game engine, which is not independently reproducible.) This leads me to believe that scale compensation is not a well supported feature, and an effort to add it to Blender might also necessitate an effort to add it to other software packages.

The best approach? We could add it to Blender but leave a checkbox to "Disable Scale Compensation", checked by default. Then everyone's happy - if some software package or game developer (like yours truly) wants to use Scale Inheritance as documented by FBX, they can; and other packages can stay the same, or migrate to the "correct" method over time.

Now, we could do nothing... but like I said before, that's a major feature that these engines claim to support, and it would be great to have for "toon-like" animation. In any case, Disney thought it was important enough to invent and publish their own algorithm for visualizing it in real-time, for artists working on Frozen.

More research should probably be done on this. Also, I can post my source changes and/or exported models with "Scale Compensation" if needed. Thanks for reading.