Project 5b: Character Rigging

Goal To rig a simple character.
Prerequisite Exercises
Resources

Character rigging can often be a complex process that also requires a certain amount of indirection. The purpose of character rigging is to give a character the ability to move. This is done by first giving the character a set of joint, which act similarly to the bones in a human skeleton. When these joints are moved, they will deform the mesh of the character. However, animators do not use these joints to animate. Instead, they will using a set of animation controls (called "anims" in this course) to control the bones that will deform the mesh. This may seem convoluted, but it allows a lot of flexibility to give the animator what they need. We will be using the Animation menu set for this project.

This project is split into three parts:

  1. Creating the character skeleton
  2. Creating animation controls (called "anims" in this course)
  3. Creating eye blinks by using blend shapes
  4. Weight-painting the character

Unlike most of what you've done in Maya so far, many of the results of rigging can't be seen in the viewport. You'll have to use a combination of the Outliner and the Hypergraph editor to see what is really going on. So here are a couple of tips:

Below are the rigs that will be used for this assignment:

You will occasionally be using a rigging shelf, called RiggingPlus with scripts created by Jason Scheifer, a superstar of rigging, throughout the assignment. It already comes pre-packaged in the production workspace.


Part 1: Creating the Character's Skeleton

First, we have to design the skeleton that will move the mouse. We will start with the spine.

Now we will set up the skeleton for the tail.

We will need to create a number of joint chains to control the various parts of the head. The mouth and nose chains are the simplest and can be created in the Side view.

Now we will create the ear joint chains.

Our last set of joints will be for controlling the eyes.


Part 2: Creating animation controls

It would be annoying if the animator had to select these control joints every single time they wanted to move the tail or any part of the body. They are hard to reach and more often than not, the animator will probably select the skeleton instead of the control joints. So, we want to separate the animator from using these joints at all. We will give them animation controls to move the character.

Let's look at the idea behind an animation control. It is basically a handle in 3D space, linked to a certain joint on the skeleton, which an animator can easily grab and move to pose the character. As a short hand we refer to these control handles as "anims". Note that this in an in-house term, as on different rigs they can be referred to as "cons", "flags", etc. The overarching concept is the same, however.

For this rig we will be using NURBS curves to create our anims.

Let's start by making an anim for the spine.

These NURBS curves are parented under what is known as a zero group. Think of these zero groups as a shell that will hold all miscellaneous transform (translate, rotate, and scale) values that will occur as you move the controls around to get them in the right spot. This will also allow us to align the rotation of the anim with the joint, making the control more intuitive.

But why is something like this important? It doesn't seem like it would be necessary. We need these zero groups so that we have a zero position for our animation controls. It is often useful for animators to be able to zero out (put 0s in the translation and rotate values) an anim back to its default position. So let's start off with the case where we don't have a zero group. Let's look at the spine joints that we made earlier.

Let's make a NURBS Circle and call it our spine_1_anim and then align it with the direction of the joint. We then constrain the joint to the control so that we can move it.

However, when we align a control to a joint like this, we get values in the anim's tranform channels.

If we try to "zero-out" (put zeros in the translation and rotation channels) we get a result that we don't want.

We see that the root_joint and the spine_1_joint end up on top of each other, and the rotation of the joints are not in that default position that we had defined earlier. This isn't useful. Earlier we learned that freezing transforms would give us the ability to set a new default position for an object so let's try that instead.

As we can see, this does what we kind of want it to do. There are not translation or rotation values in the channel box and the rotation of the joints is still in that default position we decided on earlier. However, if you look at the orientation of the anim, you will see that it had changed. By freezing the transforms of an object, you return its orientation to World Space.

It doesn't seem like it would really matter if a control is aligned with the orient of the joint, so why do we care so much about it? By allowing the control to be aligned arbitrarily with world space, it becomes less intuitive for the animator. An animator wouldn't have a good idea of how the control works and they thus might have to counter animate to get some of the movements that they thought the control had, but didn't.

If the anim is aligned with the joint, it is easier for the animator to do things like move spine_1 up along the angled y-axis. Or if they want to rotate the joint along the z-axis, they can, and they will know the path of that joint. It's a more intuitive set up.

As we can see, aligning an anim along a joint can give the animator insight to how the control can be used and in certain situations may also assist them in their animation if they need the controls to move in a certain way.

That's great! Now, since we know we don't want to freeze transforms on the control, but we want a control that is aligned to the joint, let's see what happens when we add a zero group. We will parent the spine_1_anim to a group called spine_1_zero_grp. We will when move this group and orient it to the joint. In the scene it will look as if nothing has changed. However, when you look at the Channel Box, you will see that spine_1_zero_grp will now have all of the transform information that we had originally had in the anim itself.

If we use zero groups to hold all of these positioning transforms, our anims will be clean. As you can see, there are no transforms on the anim.

Thus when we zero out a control, it will default to the position we determined would be the default.

Now, let's go over how to utilize these zero groups in our rigs.

We will have these anims control the spine through a set of constraints.

We will deal with the mouth, nose, and ears in a similar manner.

To rig the eyes, we will first need to constraint the eye geometry to the eye joints so that we can see if our eye rig is working.

Now when you rotate the eye joints, the eye geometry should follow.

Next up is making the anim controls for the eyes.

Now that we have our basic joints and anims in place for the other parts of the mouse in place, we can start adding more sophisticated control over the tail. It would be a hassle to control each individual joint in the tail and so we will use an IK Spline to control them instead. First, we create the curve that the tail will try to follow:

Now we will create the actual IK Spline to control the joints.

Now we will make anims and zero groups for the tail.

We will now set up the anims to control the IK spline curve we created earlier.



Now we need to reduce the clutter an animator has to deal with.

Now for some clean up and organization.

Create display layes to organize the scene.


Part 3: Creating eye blinks by using blend shapes

Before we bind the skeleton, we are going to create a few Blend Shapes. Blend Shapes are customized deformations that can capture subtle and complex changes that would be difficult to control with joints. In this case we are going to use blend shapes to create a blink.

First we need to create a new shape to blend to.

Let's connect this blend shape up to the original geometry.

Now, make anoher duplicate of the body geometry and make the right eye blink. When you're done, don't create a new blend shape.

If you want to modify your Blend Shapes later, rename the duplicated geometry to something meaningful and hide it. If you like the deformation you can delete the geometry and the Blend Shape will remain.

NOTE: When turning in your assignment, delete the geometry that you duplicated for blendshapes.

Great! Now you have a mouse that can blink.


Part 4: Weight Painting

The last thing that we will do is make it so the mesh deforms as we move the anims around. We do this with the process called Weight Painting. Weight Painting is the process of giving each joint a certain degree of control over parts of the character's mesh so that it deforms in a way that is both expeced and smooth. Weight Painting requires the rigger to think about the range of motion that they and the animator want a character to have and making it possible for the animator to reach the poses that they need.

Let's start by binding the mesh to the skeleton.

Now when you move your joints, the geometry sould deform with them. You will notice however, that the deformation isn't very good.

Before we delve into the process of weight painting, let's look at how weight painting works. We will also look into the tool you will be using to weight paint, the Paint Skin Weights Tool.

When you open the tool for weight painting, you will see that it will turn the entire mesh black and there will be a band of white or grey. This band of white or grey is the area where a certain joint has influence over the mesh. In the below picture, we see the area where spine_1_joint has influence.

Influence can be thought of as the amount of control that each joint has over different vertices on the mesh. Influence can range from 0 to 1. 0 means that a joint does not have influence over a vertex at all and this is represented as black on the mesh. 1 means that the joint has full influence on a vertes and is represented as white on the mesh. Values in between 0 and 1 are represented as shades of grey.

Multiple joints can also have influence over one vertex, but the added value of their influence must equal to 1.

If the gradient from black to white starts to get too ambiguous (such as when you add on a very small weight and you can't tell the difference between light grey and a slightly darker light grey), you can change it to a color ramp by checking Use Color Ramp in the Gradient section of the Paint Skin Weights Tool. In this case, black is still no influence and white is still full influence, but the in between colors range from blue to red. Blue has little influence and red has more influence.

You can select joints to paint influence for in the list hat shows up in the Influece tab. The mode you will be using is Paint and you'll mostly be using the Add operation. Additionally, you'll be adjusting the Value to change the strength of your brush.

The best way to approach weight painting is to do it in a systematic manner. We will start by blocking out the weights for each joint and then blending between the joints to get a nice and smooth deformation. The process is iterative so sometimes you will have to go back and fix weights if they aren't deforming in the way that you want.

So let's start by blocking out the weights for the spine. With your brush opacity set to 1, give each spine joint full influence over the mesh closest to it. For now, we want to give the head_joint full control of that area. Later we will go through and split it up so that the other joints in the head have influence.

Next we are going to start posing our mouse. Let's start with spine_1. Grab the anim for spine_1 and key it (pressing down on s on the keyboard. This will make a red mark show up on the timeline at the bottom of the screen). Now move your time slider to 10 and rotate the apine_1_anim to rotateZ = 15, then key it. Now go to 20 on the timeline and move the spine_1_anim to equal rotateZ = 20. Why do we do this? By setting small animations like this we can find problem areas in our weights. As we can see, the spine_1 weights aren't all that great. There is a problem area in the back of the mouse where its collasping in on itself.

Let's try to fix this problem.

Turn the Value for your brush down to something really low, like 0.10. Now in the area with the bad deformations, try to smooth it out a bit and make it more gradual. You can switch between the root_joint and the spine_1_joint to try and get a nice gradient. It's looking a little better, right? Focus all of your work on one side of the mouse. We can mirror them over later.

You will want to continue this process for all of the other joints in the body until you get something that you think deforms nicely. Key some poses as you go so that you know that the mouse will deform in a nice way when the animator uses it. There is only one area where we are going to deviate from this technique. That area is the tail.

Grab the tail_mid_anim and move it up in the Translate Y direction. As we can see, the weights in the tail aren't terrible. They have the general movement that we want. So instead of getting rid of these default weights, let's use them to our advantage. We'll work to smooth out these weights so that the transitions are nicer, like below.

Continue to test your weights are you finish painting certain parts of the body. When you are happy with the weights, it's time to mirror them over. Make sure that all of your anims are zeroed out. Then go to Skin → Mirror Skin Weights (Options). You want to mirror over the YZ plane, Surface Association should be Closest point on surface. And Influence Association should be Closest Joint, then press Mirror.

The last step is to test the rig. Make sure everything works correctly and touch up any weight painting that needs work.

Turn In You will be graded on the following: Turn the following into Collect-It on Catalyst: