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...
|