So, It’s been a very long hard day and now after a long bath and let my mind slow to a crawl I can add some more to this blog. Transforms affect everything in rigging, there the staple food for a TD and to know them as they say, is to love them.

What is a transform? well essentially a rotation about an axis (the origin) and an offset from the origin (its position). Rotations dont really exist, they’re just how an objects orientation is defined via an axis. Scale is defined by the lengths of these axis, all in one would be universal. On there own would be non-uniform. Sheering is cause by the axis’ not being orthogonalized or perpendicular to each other.

Every object in max and most other 3d packages has a transform space, this is the space the object inhabits. For example for us our transform space is Earth, with the Sun being the Earths. When an object gets created in max, it exists in root or world space, it has no parent and so both its local and world space’s are the same.

When an about gets transformed ‘into’ anothers space, be it from matrix transformations, controllers or simple parenting it gets a relative local space, but still has a world space.  For example if have ‘A’ at [10,0,0] and ‘B’ at [20,0,0] with B parented to A, B has both a local value and a world. Its local value would be [10,0,0] because now its relative to A, and it has a world space value of [30,0,0]. If I put B back to [10,0,0] it would be [0,0,0] in local space, but [10,0,0]  in world.

Transform spaces are crucial in controlling objects especially if they have no parent, or cant have a parent. One way to make an object relative to another is to transform it. In max we have two systems, a left handed system to the user and an internal right-handed system. What happens behind the scenes is every position/rotation/scale you do is transform into the right space system. So all you need to do is force transform an objects space from its current one to a targets space:

(object.transform * inverse target.transform) –  this simple function will get the transform of any object relative to a targets space. Now if you want to transform with the target you have to multiple by it, for example.

Tm = (a.transform * inverse b.transform)

a.transform = (Tm*b.transform)