Keywords: Animation, Maya Rigging, Spine IK system, Spine FK system

Maya Rigging series of articles:

Prerequisites

We had created FK controllers for limbs in previous article: [Maya]Rigging 08 - IK FK Switch.
But there are a few key points to note, check if they have been addressed:

  1. Match Pivots for FK controller. (Match Pivots must be done before Optimizing the Offset Parent Matrix, because Match Pivots causes transformation modification.)
  2. Optimize the Offset Parent Matrix for controllers.
  3. Optimize the Offset Parent Matrix for IK joints and FK joints.
  4. Optimize the Offset Parent Matrix for groups of joints (IK and FK).
  5. Pivot orientation between limb controller and group of IK joints and FK joints should be matched.
  6. The rotation axis order of joint and concontroller should be matched.
Limbs FK system

1, Create root controller for limbs.

2, Match Pivots of limbs root controller to FK controller.

3, Setup the hirearchy for limb root controllers.

4, Optimize the Offset Parent Matrix of ctrl_arm_root_l.

5, Disconnect the relationship between FK controller and IK FK joint group (grp_arm_l), because we will drive the FK joints directly from FK controller afterward.

Then unparent the IK FK joints from grp_arm_l.
Then reset the Offset Parent Matrix of grp_arm_l.
Then Move the IK FK joints into group again.

6, Optimize the Offset Parent Matrix of IK FK joints.

7, Delete the Scaling connection between FK joints, because we will modify the scale of joint in another way in subsequent flow.

8, Build the driven relationship between FK controllers and FK joints for arms.

Now we can drive the arm FK joints using FK controllers.

9, Now we want to drive arm FK controller using ctrl_arm_root_l, but there is an deformation issue while building the driven relationship.

This is because we modified the pivot orientation before.
Now we need to address this issue.
First move ctrl_arm_root_l to the axis origin. (to be safe unparent the *ctrl_arm_root_l* from parent node before moving.)
Then Freeze Transformations of ctrl_arm_root_l.
Then Match Translation of ctrl_arm_root_l to arm FK controller.
At last, Match Pivots of ctrl_arm_root_l to arm FK controller.
Now the pivot orientation between ctrl_arm_root_l and arm FK controller is matched.
We connect the driven relationship between ctrl_arm_root_l and arm FK controller again, now it works right.
Don’t forget to optimize the Offset Parent Matrix of ctrl_arm_root_l.
Now we can driven the arm using ctrl_arm_root_l.

10, But when rotate the root controller, the left arm doesn’t move as expected.

This is because we haven’t blend the transformation of root controller into left arm yet.
Add an new MultMatrix node, and connect the ctrl_arm_root_l.WorldMatrix into it.
If can’t see Matrix In[0], you can add it manually.
The whole driven process diagram from ctrl_root.
The left arm now moves correctly following the root controller.

11, Switch for Rotation Orientation.

From this step, we will add a new feature for left arm: add a switch for rotation orientation between world space and local space.

Add an empty group named arm_root_l_wspace, we will use it as anchor for left arm rotation.
Then Match Transformations from arm_root_l_wspace to ctrl_arm_root_l.
Then build driven process for arm_root_l_wspace.
Turn off the switch for BlendMatrix node, we will drive this attribute using controller later.
Testing for switch.

12, Add a new attribute named World Orient in ctrl_arm_l.

Then drive the switch of BlendMatrix node using this attribute.
Now we can tweak the switch from ctrl_arm_l.

13, Move arm_root_l_wspace into the group of IK FK joints.

Don’t forget to optimize the Offset Parent Matrix.

14, Continue discussing the switch for rotation orientation: when move the spine FK controller, the arm doesn’t move correctly following spine controller.

This is because we haven’t blend the rotation of shoulder into the arm rotation.
First, add two empty groups as anchors for shoulders.

15, Match Transformations from shoulder world space anchor to ctrl_arm_root_l.

16, Parent (hotkey: P) anchors to the shoulder IK controller and shoulder FK controller.

17, Build the driven process for shoulder_l_ik_wspace and shoulder_l_fk_wspace.

Don’t forget the turn off the Translate Weight of BlendMatrix node.

Finally, we can switch the rotation orientation of left arm when it moving follow with shoulder.

18, But when spine switch to IK system, the World Orient of left arm doesn’t work.

This is because we need to switch order of blending matrix.
Now World Orient of left arm works fine in both spine IK and spine FK.

19, The last problem: when rotating root controller, the translation of left arm is messed.

To address this issue, we need to blend the rotation of root controller into ctrl_arm_root_l.
Result:
The whole diagram of left arm driven process.(open this image in new browser tab to zoom in it)

20, Create world space anchors for legs.

Match Transformations for left leg.
Match Transformations for right leg.

21, Set up hierarchy for leg root world space.

22, Set up hierarchy for IK world space.

Set up hierarchy for FK world space.
Don’t forget to optimize the Offset Parent Matrix of world space.

23, Then build the drive process for right arm and legs follow the steps that left arm shown above. Effect after all limbs FK system setup finished:

References

Realtime Creature Rigging Workshop (12 / 19) : FK limbs
https://www.youtube.com/watch?v=tlgjDv2oj-Y


战国战争史:晋阳之战
晋阳之战,又称三家灭知、三家灭智,是发生于周贞定王十四年(晋出公二十年)(前455年)到十六年(晋出公二十二年)(前453年),晋国四大世族大夫,智伯瑶(知伯瑶)、赵襄子、韩康子、魏桓子之间在围绕晋阳城(今山西省太原市)爆发的一场战争。最后智伯瑶被后三者围剿而死。