Tutorial for Arm Solution with Isolated Wrist Setup
For information on the concept of isolated motion see this thread in Jason's forum and buy his second DVD


You may want to download some of my scripts to speed up certain steps. I'd recommend you take the all in one package. You'll get a shelf with it. Whenever I refer to a button, it's most certainly one of my shelf buttons.

You should have a skeleton with joints oriented correctly with Jason's script jsOrientJointUI.mel (website) and two control curves. One for the wrist (e.g. DPK_ctrlMoveRotate) and one for the elbow (e.g. DPK_ctrlMove).



Name the moveCtrl "elbowCtrl".

Create three empty transforms. Call them "doNotTouch", "controls", and "skeleton". Parent the skeleton under the skeleton group.

Now duplicate the wrist joint and unparent it from the hierarchy (press shift-"P"). Delete all of it's children. Name it "wristCtrl".

Select the moveRotateCtrl (the curve for the wrist) and press the down arrow to select it's shape node. Shift-select (in the outliner Ctrl-select) the wristCtrl and type "parent -r -s;". This will parent the curve's shape to the joint we'll use as the wrist control. Now delete the remaining transform.



Add a float attribute "local" to the wristCtrl with a max of 1 and a min of 0. Here is the mel command:
addAttr -ln "local" -at "float" -min 0 -hnv 1 -max 1 -hxv 1 -k 1 "wristCtrl";

Do NOT freeze transform it! Rather select the wristCtrl and press the grp button. Parent the new group under the controls transform.

Now the elbowCtrl. Parent it to the elbow joint (or lower arm etc.) and set the translate and rotate attrs to 000. Unparent with shift-"P" and, with it selected, press the grp button. Parent the new group to the controls transform.



Create an ik (rp) handle from the up arm (humerus, shoulder or whatever you call it) to the wrist. Do it through the outliner with ctrl-selecting the second joint. Name the ik handle "arm_ikHandle".

Polevector constrain the arm_ikHandle to the elbowCtrl. Parent the arm_ikHandle to the wristCtrl. Don't worry if your joints flip... just move the elbowCtrl a little and set it back to 000 translates (seems to be a bug in 4.5). Now set the "visibility" attr of the arm_ikHandle to 0 and lock it.



Duplicate the wristCtrl and name the duplicate "wristCtrl_orient". Delete all it's children (including the shape).

Select the wristCtrl_orient, press the const button, and choose "orient". Parent the new node under the elbow joint (the one above the wrist joint).



With the connection editor connect the three rotates of the wristCtrl_orient to the three jointOrient attrs of the wristCtrl. That's why we used a joint as the wrist control and not a simple curve.



Set the "visibility" attr of the wristCtrl_orient to 0 and lock it.

Select the wrist joint, press the const button, and choose "orient". Parent the new transform under the wristCtrl.

Now the setup should already be working!

To get the "local" attr to work, just select the wristCtrl_orient again, press the const button, and choose "orient". Parent the new transform under the doNotTouch group. Now select this new transform again and press the grp button.

Create a reverse node (createNode reverse;) and connect the "local" attr of the wristCtrl to inputX.

Connect the outputX of the reverse node to the second weight attr of the orientConstraint node from the wristCtrl_orient (W1). Connect the local attr from the wristCtrl to the first (W0).



Now you're finished. Just make unnecessary attrs unkeyable and lock them, clean up the scene etc..


You can download a starting scene here and a finished one here.


Hope that helps.

Daniel