Adding the twist joints
To create the twist joints, first select l_upperArm_jnt by hitting Ctrl+D and then un-parent it from the shoulder by hitting Shift+P. Then select l_shoulder_jnt and hit Ctrl+H to hide it. To split the joints, I will be using a script that you can download from CreativeCrash
. Open up the script in a MEL tab in the Script Editor, highlight all the text (Ctrl+A) and then hit Enter on the number pad on your keyboard to Execute it, or Command > Execute. Quickly go in and rename the duplicated joint chain for the arm so the naming does not clash with other joints in the scene. Now select the root joint in the chain and hit Select Start Joint on the Joint Splitter tool. Set the Jnt Qty to 3 and hit Split Joints. Select the lower arm joint and also split that joint with the same settings.
Adding the twist joints using the Joint Splitter tool
The arm chain now consists of 9 joints altogether. We only need to keep the 3 joints between the arm root and the elbow and the 3 joints between the elbow and the end of the arm. So, select the second joint in the chain and hit Shift+P. Delete the joint that is now floating on its own. Then select the joint that was the elbow joints and hit Shift+P. Now, select the next joint down from the elbow and hit Shift+P and then delete the free-floating elbow joint. Lastly, delete the end joint from the forearm portion. You should now have 2 chains, both being made up of 3 joints.
Now, unhide l_shoulder_jnt by selecting it in the Outliner and hitting Shift+H. Select all 3 twist joints for the upper arm and then parent all 3 under l_upperArm_jnt. Then, select all the twist joints for the lower arm and parent them under l_lowerArm_jnt. Rename the joints from top to bottom; l_upperArmTwistA_jnt, l_upperArmTwistB_jnt, l_upperArmTwistC_jnt, l_lowerArmTwistA_jnt, l_lowerArmTwistB_jnt, and l_lowerArmTwistC_jnt. To make the lower arm joints twist correctly with the rotate Y of the wrist (we'll do this with an expression), select l_armEnd_jnt, go Skeleton > Orient Joint Tool (Options). Turn on Orient Joint to World and hit Apply.
Parenting the twist joints to the relevant driving joints
Driving the twist joints
To drive the upper and lower arm twists, we will use an expression. Go Window > Animation Editors > Expression Editor and create the following expression:
l_upperArmTwistA_jnt.rotateY = l_lowerArm_jnt.rotateY * 0.25;
l_upperArmTwistB_jnt.rotateY = l_lowerArm_jnt.rotateY * 0.5;
l_upperArmTwistC_jnt.rotateY = l_lowerArm_jnt.rotateY * 0.75;
l_lowerArmTwistA_jnt.rotateY = l_armEnd_jnt.rotateY *0.25;
l_lowerArmTwistB_jnt.rotateY = l_armEnd_jnt.rotateY *0.5;
l_lowerArmTwistC_jnt.rotateY = l_armEnd_jnt.rotateY *0.75;
Rename the expression l_armTwist_expr. Once we parent the geometry to the arm, the effects of this will be more noticeable.
Using an expression to drive the twist joints
Creating the low-res mesh
We now need to chop up the mesh and parent it to the relevant joints. I won't go into detail here, as it is the same process I employed to create the low-res mesh for the torso, the neck and the head. Do make sure to rename the chopped up geometry using the same naming convention that we used for the torso and the neck and head geometry.
Chopping up the model and parenting it under the relevant joint
Creating the FK and IK joints
Select l_upperArm_jnt, hit Ctrl+D to duplicate it and then Shift+P to bring it out of the hierarchy. In the Outliner, open up the joint chain and delete all the twist joints and the duplicated geometry that came along. You should be left with 3 joints which you should then rename from root to tip: l_upperArm_FK_jnt, l_lowerArm_FK_jnt and l_armEnd_FK_jnt. Now select l_upperArm_FK_jnt and hit Ctrl+D. Rename the new joint chain to end with _IK for all the joints instead of _FK.
Duplicating the original arm chain for the FK and the IK joint chains
Now we will constrain the joints that will drive the mesh to both the FK and the IK joint chains. In the Outliner, select in this order: l_upperArm_FK_jnt, l_upperArm_IK_jnt and then l_upperArm_jnt and go Constrain > Orient. Then select in this order: l_lowerArm_FK_jnt, l_lowerArm_IK_jnta and then l_lowerArm_jnt and go Constrain > Orient. You can also do the same for l_armEnd so we can see the results of the forearm twist. Later on, I will break the constraint to l_armEnd_jnt as I will use a control to drive the forearm twisting.
Using Orient Constraints to drive the main arm chain