Blender shows the wrong transformation values of child object

Hi, I started using Blender about a week ago, but I find the rotation tool wierd, specifically how it handles the pivot point of an object. If I parent a cube to another cube and I rotate the parent cube 35° on its Y axis using the world space as reference, the child object’s orientation value should also be 0° 35° 0°, but Blender shows it as 0° 0° 0° if I select it. These values are wrong, because the rotation tool is set to global, not to the object’s local pivot point.

Tha same is true to the move tool. It doesn’t matter if I select world space, Blender will always show the local transformation values of the child object.

Do I need to change something in the settings to make the transformation tools work properly, or is there a plugin that fixes this issue?

1 Like

Hello Nico_The_Freak!

Do the objects move wierd in your opinion, or is is just, how blender displays the transformation parameters (like rotation angles and xyz of translation)?

The pivot point used when actually rotating or scaling objects is independent of how blender stores and displays the object transformation. You can alter the pivot point by the drop down menus in the middle of the tool bar of 3d view.

On the other hand: each object has a transformation matrix representing its position and rotation in the world. Thus it allows some basic shifting, turning and scaling without changing the mesh. For positioning children blender applies the transformations of the parents as well. So the values shown for children represents the position relative to their parent.

In that sense the described behaviour is what I expect or at least one of two equally valid possibilites. Unfortunately I didn’t find a way to switch to global coordinates view.

Addendum, please ignore :-):
There are some wierd things happening with child transformations, because blender can store an additional hidden “parent inverse” matrix. So the values shown do not actually represent the relation to the parent. But are somehow relative to the position before parenting. Read about “parent inverse” in the docu if you want to know more about it.
Anyway, even with a filled “parent inverse” matrix the behaviour is like you described.

Blender is not only displaying the wrong numbers, but if I’m changing the transformation values by typing in the exact numbers I want, the rotation and position won’t be correct.

Heres how it should work (using 3ds Max as an example):

I created two cubes (red and blue) and linked (parented) the blue cube to the red one. I rotated the red cube 30° on it’s Y axis. If I change the rotation value of the blue cube to 40° in World mode by typing in 40, it will only rotate +10°. This make sense, since I’m using the World as the reference coordinate system.

But if I change from World to Local mode, and then type in 40, the cube will rotate +40° and the absolute rotation value will be 70°. Again, this make sense, because now I’m rotating the cube +40° on its local axis, and not changing its absolute rotation value, which is related to the world (aka world mode).

In Blender however, it doesn’t matter if I’m in Local or World (Global) mode, if I type in 40° as the Y rotation value, the blue child cube will alway rotate +40°, making its actual rotation value 70°. The result is the same, regardless of whether I’m in Local or Global mode:

The short answer is:

  • There is not such thing like “world mode” in blender. (But see next postS)
  • “Global mode” and “Local mode” are related to something different in blender.
  • There is a child-of-constraint, not sure if that helps.

From what I understand in world mode 3Ds Max shows the absolute position and rotation of a (child) object and you can enter a new absolute world position and rotation. I don’t find this behaviour possible in blender. the coordinates shown in the side pane are always relative to its parent, and you cannot change, in which coordinate system the child’s coordinates are represented.
grafik
I would agree that this might be useful, but I cannot find any discussion related to it. perhaps a feature request?

There might be a communication error: What do you mean by “global mode” and “local mode” and what do you do to change them? Is it the drop down menu in the top center?
grafik
These relate to, how the standard transformations available via [R], [S], and [G]. or via the gizmo works. To visualize their effect activate the gizmo.
grafik
These settings become particular apparent when applying “bounded” transformations like [R-X] or [G-Y]. Still: it has nothing to do, how blender stores or shows the coordinates of child objects.
If you mean something different by “global”, please let me know.

There is a child-of constraint in blender. Not sure whether it helps and it is certainly not a good idea to replace blenders parenting system with lots of constraints. but might be worth checking out or read about it: https://docs.blender.org/manual/en/latest/animation/constraints/relationship/child_of.html.

Finally there are mutliple ways to define a parent relation some of them are considered buggy or surprising by some. :slight_smile:

Here is some literature to keep you busy :grinning::

1 Like

Although you cannot enter absolute coordinates. you can move or rotate object using global axes esp when using the mentioned axis-locking: https://docs.blender.org/manual/en/dev/scene_layout/object/editing/transform/control/index.html
So to move exaxtly +10 in x direction, set the transform orientation to “global” and hit [G X 10]. rotation analog. These are still relative numbers but anyway.

Ok, so I thought selecting “Global” as Transformation Orientation in the toolbar is the same as selecting “World” as the Reference Coordinate System in Max.

I actually came across this problem when I tried to animate a chain of parented objects. Each object had a random rotation value and I wanted to rotate the bottom of the chain (tha last child) to 0, but couldn’t because its rotation value was already 0. Subtracting 30 from 40 and just typing in +10 is fine, but what if I have 4 parents in a chain with uneven rotation values like 23.5017 and 17.1234 and so on. I really don’t want to do math :frowning:

Maybe an IK chain would work, but I’m not at that level in Blender yet :smiley:

Anyway, thanks for your help.

Hi Tachtian,
so, is there a way to get the actual (world) transforms of a child object in Blender? Obviously, I always get zeros for the child objects and it’s a big problem if one uses a lot of drivers. Thanks.

Through copy transforms constraints or with matrices and mathutils for decomposition

import bpy
import mathutils

ob = bpy.data.objects['Cube']
mat = ob.matrix_world
decomposed_mat = mat.decompose()

print(mat, decomposed_mat)

https://docs.blender.org/api/current/bpy.types.Object.html?highlight=world%20matrix#bpy.types.Object.matrix_world
and
https://docs.blender.org/api/current/mathutils.html

Although mat.decompose() outputs a quaternion rotation, I guess there’s a utility somewhere to make it into an euler.
Also if you’re using drivers they support world space transforms, it’s in the dropdown in the graph editor

2 Likes

thanks a lot Hadricus, that’s a good start, matrix_world looks good, I’ll give it a try. In regard to drivers - yes, they support world transforms, but for not parented objects only. If it’s a child, you get zeros.

1 Like

Didn’t know that ! They do output world transforms for bones, I’m almost sure of that. It’s weird that this doesn’t work with objects…