Reevaluating Worldspace and Localspace Treatment (need some dev triage)

Hey folks.

TL;DR: no, this is not a bug, it is intentional behaviour. As such, it cannot be “fixed”, because it is not considered “broken”.

The manual section on Parenting Objects explains how this works. In short, there is a matrix called the Parent Inverse matrix. It is this matrix that sits between the parent & child transforms, and it is what makes it possible to (un)parent a child without moving it. By using this matrix it’s possible to even parent an already-animated object, without having to update the animation data.

I agree that Parent Inverse is not the most descriptive name. The fact that this matrix is hidden in the user interface (apart from a few cryptic mentions in some menus) doesn’t help either. The functionality that it offers isn’t going away any time soon, though.

I hope this helps to shed some light on the situation,
Sybren

1 Like

Hi @sybren, thanks for answering. I’m aware that is not a bug, and it’s intended.

My Request (And I believe not only mine, I’ll list all places I could find where users seem to agree with my opinion) is that the intended behavior should be different because the current behavior (at least from my experience) doesn’t seem to be the best it can be, the values displayed are certainly correct, but not useful.

I’m not asking to change the internal behavior but just change how coordinates are presented (and manipulated). I’m not a developer of course and I’m not assuming that It’s simple.
Anyway Literally every other 3d software displays children’s coordinates relative to the parent in the same way (At least as far as I know)And they still give users the possibility to un-parent a child without moving it. .
Only Blender seem to have this way of showing the coordinates that seem to have no advantages.

I’m a professional blender user since 2014, and I’m aware that most of peculiar blender’s ways of doing things are for a reason, Like RMB select ecc, and I actually like them! But in this case, I can’t really see a reason for the coordinates to be displayed like that.

What’s the feedback of blender studio staff about this? @JulienKaspar or @Hjalti (the first two that came to my mind)

I know that I should not show other software but If necessary to better show what I mean, let me know and I’ll better explain the expected behavior with an example in H***** , But I can tell for sure that M***a works the same, and in both DCCs If you un-parent an object it stays in place (or you have the option to disable this feature)

Here are some topics where a lot of other users talk about this issue (Two of them are basically duplicate requests on RCS and one on BA is from 2011!):

Thank you very much for your attention!

2 Likes

I think that to get some traction on this issue, that it needs to be brought up and discussed at one the animation and rigging meetings. Not sure if you want to do that yourself or to get someone like @Orestiskon or Jason Schleifer who were at the last meeting and who have used packages other than Blender.

I think that the main devs (who have possibly only ever used Blender for 3d) don’t really understand where we are coming from on this issue, and it needs to be hashed out in a discussion.

I have the same impression… I don’t know who the guys you mentioned are, but if they can help in convincing Devs that this is a basic , yet very important quirk to fix, they are welcome to join the discussion!

I’m with everyone here regarding this issue but I understand that the current way of Blender displaying coordinates and dealing with hierarchies is a bit different and lacking compared to other 3D apps, so I propose a middle ground that would be to at least to address this issue at the UI level:

  1. Expose the inverse transform matrix in the interface (and allow users to change if needed);
  2. Display the world/global transformation (important to actually see what is the actual world transform of a child object in an hierarchy;
  3. Rename the current transform to Local transform in the UI (this is basically what it is now, just not explicit).

I believe that by doing this, nothing would change fundamentally in how internally Blender works, while, making things more clear to the user specially those accustomed to work on other 3D packages.

Just my two cents

4 Likes

This is not the issue, at least when I talk about myself (I can’t speak for other devs). I fully understand that how things are now is confusing, and that there are both simple-but-already-nice and more-complex-but-even-nicer solutions out there.

What we do need is:

  1. A proposal on what to fix, and how to fix it. This should includes some alternatives to choose from, or a list of alternatives considered & discarded (and for what reason). Basically what’s described in Ingredients of a Patch; these are nice to have even when there is no single line of code yet.
  2. Discussion of the proposal. The forthnightly module meetings are the perfect place for this, and I certainly invite people to come and join. If you want to discuss something at the meeting, either pop over to #animation-module on Blender Chat, or wait until the meeting agenda is published in the Animation & Rigging section here on DevTalk and add a comment in which you propose to discuss this topic. That way the people attending the meeting will be aware of the topic before the meeting starts, streamlining the process.
  3. And last but not least, a developer who can implement the changes and stick around to maintain the code after it’s been accepted in Blender.

@NunoConceicao I think you have some nice ideas. Do you have some Python programming skills? If not, may I (tongue-in-cheek) recommend Scripting for Artists? :stuck_out_tongue:

Joking aside, maybe my Transform Helper add-on could be used as a basis for the proposal. It’s always easier to talk about features when they can be demo’d, as then everybody is looking at the same thing.

3 Likes

Thank you Sybren, I do have some Python skills and I already did your course of Scripting for Artists to help me get into how python works in Blender. Regarding the course, in the last Blender conference back in 2019 I spoke to you in person to praise your course and ask you for more, but probably you dont remember that conversation, I’m sure you spoke with a lot of people, but I surely didn’t forget :wink:

1 Like

Thanks, I appreciate your reply. Would be great if you could bring this up with @Orestiskon at your next meeting, as I have heard him mention it, and I think he usually attends the meetings. I don’t have enough of a technical background to put together a proposal for this, but there are plenty of people on this thread that would be capable of it.

Some of the other seasoned rigging td’s such as Jason Schleifer who attend the meetings would no doubt have an opinion on this topic and could be consulted.

2 Likes

Hi Sybren
Following up what you mentioned about proposals, here is an addon that Ondrej Brinkel made after my RCS proposal.
So far this is as close to what was suggested and I think this also serves as a good proposal base imo.
It still has some limitations that I’m not sure that can be addressed by just creating an addon, in my limited python skills view.
I invite anyone in this thread to install and have a look at it.

1 Like

I am currently about to publish an addon for that, one of its main usages is to solve the whole handling of worldspace and localspace discussed here. I put quite some time into it to offer a complete and intuitive treatment with visual feedback for blenders transform spaces. Currently testing that everything works fine with 3.0.

2 Likes

Cool, looking forward to try it!
If you need testers ill gladly help with that

1 Like

image

Oh my, this is so handy even as is!

I miss being able to either animate in Local of World with Local or World keyframes sets, but this helps at least to position numerically in this case.

Agree, it is a good starting point and base to develop upon, I guess, once it gets rotation, scale and the possibility to animate in local space would be great. Although as far as I understood, Blender animation works in local space, the difference is that once it gets parented the object doest shift because there is that hidden inverse transform of the parent that prevents it.
I understand this is how Blender works, but I dont see any reason to not improve this a bit further, specially at the interface level, to make this clearer (what are local coordinates and what are the world coordinates) and also expose that hidden transform matrix

3 Likes

So nobody is looking at & giving feedback on the add-ons that I already made? Here are some screenshots:

Transform Helper:
Transform Helper panel

Copy Real Pose (I didn’t link this before, but I think it’s a nice one to have anyway):
Copy Real Pose panel

The documentation just says:

This addon for Blender 2.80 and up adds local and world location editing for objects.

It doesn’t tell me anything details about what it does, how it manages to do that, and most importantly, it doesn’t tell me which of the things it does are so important for the people here. There is a link to its wiki, but that just leads to a “404 file not found” error.

I circle back to the points I made in an earlier comment: this needs a clear proposal. Just pointing at something and saying “do something like that” isn’t going to help.

1 Like

This was discussed in yesterday’s Animation & Rigging meeting. The conclusions can be found in the meeting notes.

2 Likes

Hi @sybren

First of all, thanks for giving attention to this thread and bringing the discussion in the meeting,
I was personally extremely busy and couldn’t follow the discussion as much as I wished.

I’m not familiar with the matrix math behind the parenting system, so the best I can do is try to explain the desired outcome in a sort of proposal as soon as I can. But on the point of the proposal of “how to fix it”, Unfortunately, as I said, I’m not familiar enough with the math to include that in a proposal.

I’ll be back as soon as I can and try to be as clear as I can!

Again, thanks a lot! It’s great that this is in the discussion in the meeting!!

Gave it a quick whirl, the GUI could use some love, for consistent sliders and display from the other transform panels, also integrations to the typical transform panels.

image

Quick GUI entries suggestions:

Properties Editor > Object Tab > Subtabs

  • Dynamic label + icon (optional) to show if current LocRotScale panel are parented transforms or not (global)
  • Loc/Rot/Scale
  • Delta Loc/Rot/Scale (collapsable)
  • Local Loc/Rot/Scale (collapsable)

3D View > Property Shelf > Item panel

  • Dynamic label + icon (optional) to show if parented transforms or not
  • Loc/Rot/Scale
  • Local Loc/Rot/Scale (collapsable)

image

This GUI feedback of what these matrices are the first milestone. The reason to have a dynamic label is for the UX that there should be a notice to show what mode the transform panel is in, if it’s global absolute space, or if parented and relative to local. Or just split the two transform systems and don’t switch spaces without user notice.

Second milestone… option to keyframe what is local and what is global, or know what is inverse or what is global when animating and being able to see both types of transform Fcurves in the animation editors - but this would be a lot more harder to implement with the current API.

Basically, universal nomeclature is Global and Local. Local is parented matrices. If there is no parent, it would just be the “local” axis of the object and it’s movement in it’s local axis, ei… transfrom in Local mode instead of Global mode using the widget. Origin is it’s world center. With parent, origin is the parent inverse relationship ground zero. That’s about it. In animation, you can either animate globally, or locally. Armature bones are animated in local. Objects in Global. Knowing when and in what case in the GUI is important, atleast being able to see when and why and how with sub-panels or panel notice is enough to begin.

2 Likes

This is the first problem – what those panels are showing is not a matrix. It’s a decomposition of the matrix into transform/rotate/scale, and that decomposition does not capture the entire matrix. It cannot include sheer, which means that the global transform of an object cannot be fully shown in these fields. It also means that you cannot edit those fields, because editing them means that the transform matrix has to be reconstructible from those fields, which is not possible.

1 Like

So the current transform panels reconstructs the matrix? Shear is currently not exposed in the UI already, I don’t see the need to also expose those in any other transform space. The idea of reconstructing the object matrix is exactly why we need the GUI, breaking down the hidden 4x3 matrix to 3x3 vector GUI entry groups. If the current transform panels do set the matrix, then showing the internal matrix or relative matrix, or “transform, rotation, scale, shear (hidden anyway)” with the other internal matrix systems should be able to be coded. The transform panel GUI already does this, in both spaces depending on the mode and object type- meaning a simple solution is showing the user what space it’s using when it’s using it and showing vectors or extra panels with the extra vectors to help understand globale vs local/inverse parenting matrices and animate/rig properly, and then later add the ability to work the user input from the panels should be able to be coded in as well as the current transform panel, since that panel are made from vectors driving a matrix…

Again…which matrix are we working? We don’t know. How? We also don’t know. Only intuitively can we figure it out. GUI control to the matrix spaces is exactly what we’re looking for in the tranform GUI.

Eg.

  1. Slide Transform X in current transform panel, this is global.
  2. Object matrix 2m in the X transform vector group moves the object in the X axis in global.
  3. Parent keep transform object to null. Current transform panel remains in Global (or the panel space shows a space switch notice). Cube is globally at 2m X. Local is at 0m X, relative to parent.
  4. Local object rotate 90 degrees X then transform in X 3m. Now Global updates to Y 3m and X remains at 2m in the global panel. The local panel only shows X 3m and X rot 90 degrees. Same slider prop type, which is taking the global and local axis, and doing subtract math on location and trig on the the rotation axis to then “get” world matrix and parent inverse roots for local, and to get local axis from the origin, then write values to the slider (like in the transform panel), where the slider then can “add” any local transform and “Set” local position, which is a new global position really. Global position would update, because ultimately everything is in global space first.

As a user, I can see the transforms and move the values from the slider props or widgets, expected to work just like the current transform panels. It is breaking down object matrices in the GUI, trig should be able to get the other matrices without a problem.

It looks like it might be a loop based logic, which the local GUI entries addon mentioned earlier in this thread has had issues with when it comes to Armature posing - but essentially it’s not. I get that it sounds impossible with the current api, but that is because now Armatures move in pose mode are local, instead of global, then it loops when trying to confront that. The panel shows local rotation of bones, not global rotation. No warning on the space switch.

“Global” stores everything, the matrix data. The transform panel gets it and sets it. The origin of the object is the un-looped anchor to store local matrix data, it’s local origin, so trig is able to add or subtract any local transform data from the global matrix data by the object origin and parent origin. Another anchor is the parent matrix redefining the local offset. And working both gets and manages local vs global transform space without looping. You don’t have to read and write to and from local or global matrices seperately referencing one to the other creating issues with looping, but essentially work only global and run the math from the local origin and parent origins. The 3D Widget already does this with it’s Global and Local orientation to a degree and shows expected behaviour, just… it needs a GUI readout and slider props to re-produce the widget transform behaviour. The props read and write of its matrix data should be able to do the same based on that.

If the widget can transform in Local, a panel should be able to show and write the “local transform” space of the selection and be manipulated locally, like we already can - but with GUI readouts and write abilities. If it’s partly done somewhere, it must be possible.

Imagine this:

  1. I move a cube in global X2 and Y3.
  2. I switch to Local Widget mode. I rotate the object 90 degrees on X up.
  3. I then move the local Widget X3. But this time, I use exact numbers in the local transform panel to the right in the sub panel. I write 2.95m in the local X sllder instead of using the widget.
  4. Now the global updates to Y5.95 and X2, and Local is now X2.95 and Xrotation 90 degrees.
  5. I now need to duplicate the cube, and move it up another x1.15m. I can do that.
  6. Now when I move the parent, the local transforms remains fixed… and I can then align the parent to where I’m working, and I can still duplicate child, move precisely in local X from the transform panel and add in another exact measurement.

The widget in its space updates the correct space in current use, just there is no GUI readout of the changes, no origin local offset memory - and I can not have numeric additive control of the transforms relative to local. If we had this, we don’t have to now do trig in the head to understand what we’re doing, or use exclusive local space widgets or hotkey chaining in “local space” to get the values I want to model or layout precisely - even then as is, there is no relative to original local origin transform memory.

And it sounds huge, because you have to think of all object types, all modes, and all secondary modes of special objects (pose in armature). Many don’t have consolidated transform spaces, ei… the edit mode is vastly different from the armature pose mode. So… it would require cleaning up house, then adding the features. Monumental… and … well starting small could help.

  1. Get Local read into GUI with all objects and modes into a sub panel. No user input, but the math to see and understand local vs global matrix is now split and readable in the interface. Data only stored in Global Matrix, exception Armature local pose space. Make individual tasks per mode/object type for the GUI. I’m not sure how you guys manage projects in the tracker, but the smaller the task or prototype, the better. So when I use widget or transform mode in “local” I can see those spaces updating correctly. Keep it minimal, same as the transform panel in layout and design, in a sub panel.

  2. OR create a quick user notice in the Transform Panel to show why and how the transform space is changing, like a label with an icon explaining that the transform panel is now exclusively in “Parent Inverse” mode and not “Global Mode”. Do the same to clarify what space the other transform panels are in. Let the user know how Blender works first from the GUI. It’s a smaller task, and might point out how to consolidate the transform readouts and user control.

Addon feedback:
Your addon with the Transform Helper works alright as a readout, though not a fan of the wide layout and lack of labeling on the axis - they were cut off on default, maybe stacked vector groups like the transform panel will help. The parent inverse group readout also doesn’t seem to update when moving the object in local widget or transform space, even in local transform mode I am moving things in global. Evaluated transform looks like it’s “Global” so might need better labeling there. But I like the initial idea of it. It’s exposing the hidden matrices so it’s understood.

1 Like