Using Wiring and Spinners to control the fingers.
 

Step 1
Whatever you can do to make animating your character easier is worth doing. Using sliders or spinners to control the rotations of some bones is one of the things that makes animating easier. The way this helps when animating fingers is that you don't have to zoom up on the hand and select each individual bone every time you want to pose the hand. All you have to do is click on the control object for the arm, which you would probably have selected anyway if you're in the middle of posing the arm, and move the spinners or sliders that we're going to build into that object.

The first thing you should know is that this is a tedious process, but it's worth it in the end. But there is a custom script written by Michael Comet that makes this process much quicker. I haven't recommended using any third party scripts in these tutorials because I think you should know how to create these rigs without having to rely on tools outside of Max. But I'll make this one exception because the script still isn't doing the work for you, it just speeds things up a lot. I'll go into more detail when we get to the point in the tutorial where we can use it.

So we'll start with the simple hand rig from the last tutorial. The first thing we'll do is add a Point helper to the scene. This would be the IK Goal or Helper object you would normally attach the hand to when you're setting up your arm.

Step 2
Align the helper to the base of the palm.

Step 3
With the helper still selected we'll add all the Custom Attributes (CA's) that will ultimately control the fingers. Bring up the Custom Attribute window.

Step 4
We'll use the same settings, except the names, for all the CA's. Look below to see how to set up the first one. You can use Spinner or Slider, I prefer Spinners personally, but it doesn't affect how it works. We'll name the first one Index Curl and give it a range from 0 to 10. This one will of course control the curling of the index finger. Click the Add button at the bottom of the window when you're done setting the parameters, but don't close it.

Step 5
Add the other CA's the same way. The names and the final layout are shown below. Don't forget to click Add after each one. Close the window when you're done. When you're done you'll be able to find all the spinners in the Modify tab of the helper object.

Step 6
It's always a good idea to rename your bones to something you can recognize as you're working. Below is the list of bones in the scene and how I've named them. Bone 01 is the one closest to the knuckle, and bone 03 is the one at the tip. It should be pretty self explanatory.

Step 7
Now comes the tedious part of the process. We need a List Controller on the Z Rotation Axis of each of the bones of the four fingers, but not the thumb. Go into the Motion tab, expand the Rotation Controller, highlight the Z Axis, click on the Assign Controller button, and choose Float List. The reason for this is that we're going to have two different Spinners controlling the Z rotation of each joint, the Curl spinner and the Fist spinner. If we don't add the List Controller then when we wire the connection to the second spinner it will disconnect the first one, making it useless.

Step 8
Okay, here's where Michael Comet's WireConnect script comes in handy. Click on the link to download it. I recommend downloading the entire script pack and reading the instructions on how to install them.

What this script does is let us do all the wiring in one window without having to right-click on each object and go through all those sub-menus for each bone. This saves a lot of time. There's a couple things to be aware of, though, when using this script. First, be careful when selecting items in the MASTER and SLAVE windows. The wiring connection is completed as soon as you select both the MASTER and SLAVE. So if accidentally click x_rotation when you meant to click y_rotation then you're Master will automatically be connected to the x_rotation and you'll have to manually disconnect it the old fashioned way. So just be careful what you're clicking on. The second thing is that you have to hit the Tab key on the keyboard in order for changes to the wiring expression to take affect.

Now, what you do is click on the MASTER button and then select the Point Helper in the scene. Then click on the SLAVE button and select the bone you want to wire the Point Helper to. We'll start with the root bone of the index finger, which I named BoneIndex01. Scroll down the list on the MASTER side until you see the category ( OBJECT_POINT_HELPER: CUSTOM_ATTRIBUTES ). Under that is a list of all the CA's we created earlier. Select Index_Curl. Now find the ( Z_ROTATION ) heading in the SLAVE window, and select bezier_float. You can also see the available item under the bezier_float, which was created when we added the List Controller earlier. We'll use the Available item later. In the expressions section overwrite what's there with -(degtorad(index_curl)*9); (make sure you put the minus sign in front so that the bone rotates down instead of up) and then hit the Tab key on the keyboard to update the wiring. At this point you should be able to change the numbers in the Index Curl CA spinner we created earlier and see the first bone of the index finger rotate down and up.

Now follow the same steps for every one of the other finger bones. Don't worry about the thumb yet, we'll get to that later. Here's a list of how to wire the different finger bones:

Point01 --> index_curl --> BoneIndex01 --> Z_ROTATION --> bezier_float --> -(degtorad(index_curl)*9);
Point01 --> index_curl --> BoneIndex02 --> Z_ROTATION --> bezier_float --> -(degtorad(index_curl)*11);
Point01 --> index_curl --> BoneIndex03 --> Z_ROTATION --> bezier_float --> -(degtorad(index_curl)*7);
Point01 --> middle_curl --> BoneMiddle01 --> Z_ROTATION --> bezier_float --> -(degtorad(middle_curl)*9);
Point01 --> middle_curl --> BoneMiddle02 --> Z_ROTATION --> bezier_float --> -(degtorad(middle_curl)*11);
Point01 --> middle_curl --> BoneMiddle03 --> Z_ROTATION --> bezier_float --> -(degtorad(middle_curl)*7);
Point01 --> ring_curl --> BoneRing01 --> Z_ROTATION --> bezier_float --> -(degtorad(ring_curl)*9);
Point01 --> ring_curl --> BoneRing02 --> Z_ROTATION --> bezier_float --> -(degtorad(ring_curl)*11);
Point01 --> ring_curl --> BoneRing03 --> Z_ROTATION --> bezier_float --> -(degtorad(ring_curl)*7);
Point01 --> pinky_curl --> BonePinky01 --> Z_ROTATION --> bezier_float --> -(degtorad(pinky_curl)*9);
Point01 --> pinky_curl --> BonePinky02 --> Z_ROTATION --> bezier_float --> -(degtorad(pinky_curl)*11);
Point01 --> pinky_curl --> BonePinky03 --> Z_ROTATION --> bezier_float --> -(degtorad(pinky_curl)*7);

Step 9
That wasn't so bad was it? Actually, it's a pain, I know. But if you did everything right then the Curl spinners should be working and can bend the fingers up and down.

Now for the thumb. We have to make one adjustment to it first. If you look at your thumb you can see that it's rotated along its length compared to the fingers. So we need to rotate the root bone of the thumb also so that it behaves more realistically. Rotate it about -60 degrees along its local X axis.

Step 10
Follow the same steps you did with the fingers. Here's the breakdown:

Point01 --> thumb_curl --> BoneThumb01 --> z_rotation --> -(degtorad(thumb_curl)*4);
Point01 --> thumb_curl --> BoneThumb02 --> z_rotation --> -(degtorad(thumb_curl)*4);
Point01 --> thumb_curl --> BoneThumb03 --> z_rotation --> -(degtorad(thumb_curl)*4);

Step 11
So now all the fingers and the thumb should be working with the spinners properly. You don't even have to touch the bones themselves at this point to pose the hand in almost any way you want. Now we'll add another set of wires to make it even easier. There are many times when you might want to move all the fingers at once, so we'll hook up the Fist spinner to do just that.

Here's the breakdown for that:

Point01 --> fist --> BoneIndex01 --> Z_ROTATION --> available --> -(degtorad(fist)*9);
Point01 --> fist --> BoneIndex02 --> Z_ROTATION --> available --> -(degtorad(fist)*11);
Point01 --> fist --> BoneIndex03 --> Z_ROTATION --> available --> -(degtorad(fist)*7);
Point01 --> fist --> BoneMiddle01 --> Z_ROTATION --> available --> -(degtorad(fist)*9);
Point01 --> fist --> BoneMiddle02 --> Z_ROTATION --> available --> -(degtorad(fist)*11);
Point01 --> fist --> BoneMiddle03 --> Z_ROTATION --> available --> -(degtorad(fist)*7);
Point01 --> fist --> BoneRing01 --> Z_ROTATION --> available --> -(degtorad(fist)*9);
Point01 --> fist --> BoneRing02 --> Z_ROTATION --> available --> -(degtorad(fist)*11);
Point01 --> fist --> BoneRing03 --> Z_ROTATION --> available --> -(degtorad(fist)*7);
Point01 --> fist --> BonePinky01 --> Z_ROTATION --> available --> -(degtorad(fist)*9);
Point01 --> fist --> BonePinky02 --> Z_ROTATION --> available --> -(degtorad(fist)*11);
Point01 --> fist --> BonePinky03 --> Z_ROTATION --> available --> -(degtorad(fist)*7);

Step 12
One more spinner left to hook up. This one is for the Spread spinner and it used to spread the fingers out a bit, which comes in handy.

Here's the breakdown:

Point01 --> finger_spread --> BoneIndex01 --> y_rotation --> (degtorad(finger_spread)*1);
Point01 --> finger_spread --> BoneMiddle01 --> y_rotation --> (degtorad(finger_spread)*.5);
Point01 --> finger_spread --> BoneRing01 --> y_rotation --> -(degtorad(finger_spread)*.5);
Point01 --> finger_spread --> BonePinky01 --> y_rotation --> -(degtorad(finger_spread)*1);
Point01 --> finger_spread --> BoneThumb01 --> y_rotation --> (degtorad(finger_spread)*3);

Step 13
So now it's set up and ready for animating.

There are a couple things I need to point out here. First off, the numbers I used as multipliers, like the 9, 11, 7, etc., are fairly arbitrary. These are the numbers that I thought looked good for my rig. You can change these to anything you want to make it work better for you. Other things are changeable too. Like whether you use spinners or sliders, the range of numbers you use, the width of the spinner or slider, etc. The good thing about this setup is that it's completely customizable. Play around the settings and see what works best for you.

Another thing you can do is add a Bezier Float controller in the Available slot of the Z Rotation of each finger joint so that you can still manually pose the fingers if you need to. Go back to Step 7 for a refresher on how to add a controller. Once you add the Bezier Float controller you need to set it as active, otherwise nothing will happen when you try to rotate the bone manually. To do this right-click on the main Z Rotation item of the controller tree and select Properties. Now click on the Bezier Float in the list and then click the Set Active button. The arrow will move next to the Bezier Float to show that it's active.

If you want to go crazy with this you could even set up more CA's to control just the top two segments of the finger. That way you could rotate them independently from the bottom segment for even more automatic control. Try bending your own finger and see how many different ways you can bend it. Then try and set up your controls to emulate what you can do with your real finger.

Click here to go to the next technique...

Click here to go back to the "Hand" page...