19 April, 2009

FK controllers - not as simple as I had thought

FK controllers are trickier than they seem to be. They are not simple! Here are some questions and thoughts I encountered while doing an arm setup.

1. How to bind controllers to the joints: Parent shapes? Constraint? Connections? Or combination of all these?
2. Constraint works, but you cannot take advantage of joint's inveseScale attribute directly. Connections have more issues, and it starts getting complicated when you parent stuff. Because the values don't update in channel if you have connected transform values directly using translate and rotate. More complicated connections can be established using worldMatrix and parentInverseMatrix to get proper world space transform value, but it just ends up being more complicated than it has to be. Unless I have a simple node that does this, which is what parentConstraint is.
3. Now this leaves us to parent shape method. It seems that this technique works the best amongst other techniques. The main advantage is that when scaling all child controllers follow with their respective joints. Here are the problems with parent shape method.
  • You cannot use translation values because joints will have some values already in there.
  • If you change rotation order of the controller you are changing the rotation order of the joint itself. This can cause the problem if you are blending between joint chains and you have not used constraints.
  • The main problem is that by parenting a shape you are directly manipulating the joint, which I think is not a good idea.
  • Scaling joints will also scale shapes (This could be good or bad).
So my conclusion is that the best way to make FK controls work with blending and scaling is to use parent constraints, parenting of controls and connections for scaling. I will post this in more detail later.


  1. There is a way to zero all translations on joints, which can solve some of the problems, although off the top of my head I can't remember what the name of the script is.

    Personally, I use a combination of constraints, controllers, connections, and hierarchy for my FK controls, and I've never had any problems. I think it just depends on the rig, and what it will need to do in animation.

    Then again, I rarely scale controllers directly...

  2. Yes I can bring the joints under a group node and then zero out the joint translation values. But then I don't have joints connected with inverseScale attribtues anymore. May be I am just being picky about this.

    How are you doing stretchiness in your FK arm?