Here is the starting point for this setup, 11 spine joints and 3 spine controllers.
Spine Control 1 is snapped to spine joint 1 (freeze transforms)
Spine Control 2 is snapped to spine joint 6 (freeze transforms)
Spine Control 3 is snapped to spine joint 11 (freeze transforms)-
We need to make sure the local orientation axis for the spine controllers matches the local orientation axis for the joints. The joints are oriented to standard local space with x pointing up the bone to the next joint in the chain. Because of how the controllers were created we currently have an unwanted ‘garbage’ rotation value of 90 degrees in Z when the rotation axis matches that of the joints.
We need to keep the actual orientation of the curve like this but have the Z value zeroed out so we need to use a buffer group. These are the steps for matching local orientation and keeping the values on the curve at zero.
• set the z value back to 0, the curve will rotate 90 degrees.
• make sure the curve is snapped to joint 1 and freeze transforms
• group the curve to itself
• snap the pivot of the group to joint 1
• rename the group ‘spine_Control_1_Buffer’
• select joint 1, then control select the spine_Control_1_Buffer group (make sure you have selected the group, not the curve – helps to use the outliner panel)
• apply a parent constraint (no maintain offset)
• now, the group buffer inherits the rotation value but the curve itself has NO GARBAGE VALUES – all rotation values are at zero and it is oriented correctly
• delete the parent constraint– it has served its purpose!
Essentially what we have done is to force the buffer to inherit the rotation values, so that the curve can stay inside its protected universe. The buffer group itself will not ever be animated so it does not matter that it has non-zero rotations.
Rather than repeat that process for the next 2 controllers, I like to just duplicate the ‘spine_Control_1_Buffer’ group.
• Duplicate spine_Control_1_Buffer
• snap it up the the middle joint (joint 6)
• rename it ‘spine_Control_2_Buffer’
• rename the curve inside the group to ‘fk_spine_Control_2′
• open the freeze transformations options
• just select transforms, this gets rid of the translate Y values but does not freeze out the rotation- if we do this the orientation axis will flip again! Freeze transforms.
• repeat the above steps for the 3rd controller, this time snapping to the final joint 11 (rename group to ‘spine_Control_3_Buffer’ and the curve to ‘fk_spine_Control_3’
Now the controllers are all ready to go, we need to set up the weighted constraints. Here are the steps for setting up the constraints. It can be confusing to explain but basically we will set up a system where there are numerous orient constraints from the controllers to the joints with the weighting for each constraint having a reducing influence as it is further away in distance. Here is a diagram showing how to set up the weight for each constraint-
Apply all the orient constraints first, then for each joint set up the weightings in the channel box according to the diagram, so for instance for joint 7 set the weighting for controller 2 to .8 and the weighting for controller 3 to .2
Once all the weights are entered, this completes the setup. As with most FK rig setups, the controllers will only be used for rotations, not translates while in FK mode.