Local Space Parent Constraint

So setting up individual local rig controls using direct connections is fairly easy. But it does require a buffer group for each object on the local rig (two groups if the controls are not oriented to the world). And once you started having hierarchies of controls driving hierarchies of joints on the local rig, keeping the orientations straight can become a nightmare.

If only creating a local rig could be as easy as using parent constraints on the global without the need for buffer groups and other nonsense.

Introducing the local space parent constraint! This system uses matrices to make the driver effect the driven like a parent constraint while ignoring all transforms outside of a set hierarchy. Let me show you what that looks like in action:

My original intend for this technique was to get rid of the buffer and orient groups that a local rig usually requires, in the end a node-only approach was a lot less user-friendly than this final method. It's a small trade off to have the parent constraint show up in the outliner.

The "Hack"

Parent Constraints make use of the parent matrix and lots of other attributes on the target to determine the transforms that the driven object should have. In this setup I create a fake parent matrix, what the parent matrix would be if anther transform node higher up in the hierarchy was the world space. This way the "fake parent matrix" ignores all the translate, rotate, and scale attributes that occur higher up in the hierarchy. For example on a local face rig the local control group would be a child of the head control but the matrix would ignore the movement of the head. In order to get this matrix we simply multiply the parent matrix of the control by the world inverse matrix of the local group.

I did a proof of concept for this technique using several steps of multiplication and even some basic quaternion multiplication to account for the joint orientation matrix in cases where the driven object was a joint. It wasn't until I looked at the whole thing in it's final state that I realized that it could be achieved much more easily by using the built in functions of the parent constraint.

Featured Posts
Recent Posts
Search By Tags