Spline IK 'Fit Curve' scaling incorrect on FBX export #73863
Labels
No Label
Interest
Animation & Rigging
Interest
Blender Cloud
Interest
Collada
Interest
Core
Interest
Documentation
Interest
Eevee & Viewport
Interest
Geometry Nodes
Interest
Grease Pencil
Interest
Import and Export
Interest
Modeling
Interest
Modifiers
Interest
Nodes & Physics
Interest
Pipeline, Assets & IO
Interest
Platforms, Builds, Tests & Devices
Interest
Python API
Interest
Rendering & Cycles
Interest
Sculpt, Paint & Texture
Interest
Translations
Interest
User Interface
Interest
UV Editing
Interest
VFX & Video
Meta
Good First Issue
Meta
Papercut
Module
Add-ons (BF-Blender)
Module
Add-ons (Community)
Platform
Linux
Platform
macOS
Platform
Windows
Priority
High
Priority
Low
Priority
Normal
Priority
Unbreak Now!
Status
Archived
Status
Confirmed
Status
Duplicate
Status
Needs Info from Developers
Status
Needs Information from User
Status
Needs Triage
Status
Resolved
Type
Bug
Type
Design
Type
Known Issue
Type
Patch
Type
Report
Type
To Do
No Milestone
No project
No Assignees
8 Participants
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: blender/blender-addons#73863
Loading…
Reference in New Issue
Block a user
No description provided.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
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:
blender/blender@77d23b0bd7
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 [ https:*www.youtube.com/watch?v=VIEfzo7iqjo | 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
Notice incorrect animated noodle poses.
Blend File: AnimBakeInheritScaleIgnored.blend
Broken FBX: AnimBakeInheritScaleIgnored.fbx
Expected poses: {F8342553}
Result poses: {F8342558}
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.
Added subscriber: @Frizzil
#71449 was marked as duplicate of this issue
Changed status from 'Needs Triage' to: 'Confirmed'
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!
Added subscriber: @hufeng
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:
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.
Added subscriber: @viadvena
Looks like Blender has big problem with scale. SplineIK, Stretch To - completely unusable and useless for export. No controlled ropes, no controlled tails. Rigify due this issue is also damaging bones and corrupt animation. It's sad that fundamental issues does not resolving for so long time. Where is Animation 2020?)
Blender can not handle standard animation tricks. I think there is no place for new features until so big issues will be resolved.
Added subscriber: @chuderluuri
I can confirm, that the Spline IK Baking is broken.
I had a fairly long chain ofbones (~30) and when baking the animation, the tip of the cian was just everso slightly off to not match with other animations.
I managed to solve it in the end by creating a second chain of bones, then clearing all the parents, and then constraining the with a "copy transform ocnstriant" to the corresponding bone in the spline ik chain.
Its an ugly hack, but it works.
Is is possible that when baking rotation (or saving it to fbx in that matter) somehow reduces accuracy in the numbers that store rotation? if so this would make sense, as small inaccuracies woul acumulate through the bone chain. but i am no expert, just a guess
Is there some hope for 3.0? This constraint doesn't work for game engines and this is big deal...
Added subscriber: @AM-1
This is not only a FBX-Export (Add-On) Problem, but also a Object > Animation > Bake Action Problem. ("Bastien Montagne (mont29) moved this task from Backlog to Long Term on the Add-ons (BF-Blender) board.")
wich is very unfortunate, because with this issue, spline IK is only usable with y-scale = original bone scale and nothing else.
Personally i need it for a game engine workflow and didnt expect it to fail at that stage.
I believe we've hit this issue on 3.5 as well, and indeed it seems that heavy use of non-uniform scaling in general triggers this as mentioned above, not just SplineIK.
We were able to get around the issue by setting the bones of the chain to not inherit scale, and then manually baking the action using Blender's built-in baking tools. This resulted in a properly scaled and positioned chain but was not a serviceable workflow for us and relying on the exporter's baking did not work.
Our quick and dirty solution was similar to those mentioned above - we used a non-deforming SplineIK chain and then had free-floating bones the mesh was actually skinned to constrained to the non-deforming chain. We only constrained position and rotation however, and drove scale manually for our needs (therefore ignoring the SplineIK's scaling along the Y axis).
Would be great to have this properly fixed for game pipelines indeed!