Parenting messes up transforms - where is the offset stored? When I parent an object to another object with keep_transforms=True The object stays in place as expected, however I noticed that the location attribute of the child did not change.

If I zero out the location, my child object goes to the center of the world. I would expect that if I parent something with keep transforms, an inverse transform is applied to my location (location would not stay the same), I would also expect if I zero my child location attributes that the resulting position would be the same as the parents location.

There must be an extra transform offset kept somewhere which is trying to preserve the original location coordinates, basically storing the inverse that I feel should be applied to my child location as an offset attribute when I do the parenting. Where can I find info on this invisible attribute/offset?

This behavior is simply bizarre to me.

Steps to reproduce:


In the default scene Add->Empty->Plain Axes
set Empty location to (-2.0, 10.0, 2.0)
Translate the default cube 5 in the X direction
Select Cube then the Empty
Object->Parent->Object->Keep Transforms
Select Cube, notice Location X is still set to 5
Zero out location of Cube, notice Cube goes to world center.
Rotate or move Empty and the cube is no longer at the center, but has 0,0,0 for location.


Where is the extra transform stored and why is it stored at all?? If the parenting took place at world space 0,0,0 for both objects, it works as expected, but that is not convenient and seems ridiculous as a workaround.

Using Blender 2.68
The difference between the parent and child is stored on the child when the parent is set.

It's a matrix that can only be accessed through Python: bpy.types.Object.matrix_parent_inverse