It's a part of Spine that no one has asked about before. I like that you are curious about how it works! 🤓
When constraints modify the local transform, the result is what we call the "applied local transform" or just "applied transform" for short (it's always local).
When constraints modify the world transform, a new applied transform is computed backward from the world transform. This way a bone always has an applied transform.
The local transform has no constraints applied. The applied transform is the local transform that one or more constraints have modified. If no constraints have been applied then there is still an applied transform, it's just identical to the local transform.
A bone's world transform is computed using its applied transform and all its parent applied transforms.
The reason we separate the local transform from the applied transform is so the changes constraints make don't permanently modify the local transform. We'll need that local transform again later (like the next game frame render) to apply constraints again.
So, those are the pieces involved. Next is about what numbers Spine currently displays in the main toolbar. It shows:
- The local transform: no constraints applied.
- The parent transform: the local transform converted to parent coordinates (where it makes sense), so no constraints applied.
- The world transform: constraints applied and converted to world coordinates.
The local transform is shown because that is what is keyed, as Misaki mentioned. Even if you have it display Parent
or World
, when you set keys you are actually storing the local values in the keys. When you click a dopesheet key, the only way to see what values are keyed are to look at the main toolbar (or use the graph).
The world transform is shown with constraints applied because if you note the pieces involved above, there isn't actually a world transform computed with no constraints applied. We could compute that of course, but I'm not sure when it would be useful.
I agree it is slightly strange that world values update while parent and local values do not. I don't think it's particularly problematic though and it's based on what values are most useful for people to see.
We don't show the applied transform at all. We could, and possibly there are cases where it would be useful, such as when correlating applied transform values with runtime values. I don't think it should be the default though, as most of the time you care about the keyed values.