Basic Character Rigging
What's in a rig?
Rigging a character
Checking the model
Creating Joints
Leg Joints
Arm Joints
Backbone Joints
Head and Neck Joints
Finishing up the Joints
Creating IK Handles
IK for Arms and Legs
IK for Hands and Feet
Setting Up Controls
Leg Controls
Arm Controls
Root and Hip Controls
Torso Control
Shoulder Controls
Neck Control
Finishing up the Controls
Finishing up the rig

What's in a rig?

Sample rig.

Open basic_character_rig.mb, which contains a rigged character. This rig is composed of the following:


These objects form the model of the character, so it's not suprising that they are the only renderable objects in the rig. There's not much skin on this model—only polygonal geometry that resembles a skeleton.

Controls (Cons)

Animators use these to pose and animate the character.

Try to move and rotate them around for yourself. Notice how each of the controls affects a different part of the character. They also come in a variety of shapes. This helps animators (and rigging artists like you) to identify the function of the control. These are the control types we'll encounter in this rig:

Spheres serve as rotate controls. As the shape suggests, their rotate channels are their only channels that are keyable. In this rig, they are used to rotate the pelvis, torso, and neck.

Diamonds serve as translate and rotate controls. Both their translate and rotate chanels are keyable. In this rig, they are used to move and rotate the feet, the hands, and the center of the character.

Cubes serve as translate controls. Only their translate channels are keyable. In this rig, they are used to move the shoulders.

Trapezoids serve as joint controls—essentially translate controls specific to the elbows and knees.

Also notice how some controls affect the position and rotation of other controls. This is because the controls are arranged in a heirarchy. For example, when you manipulate top_con (the highest control in the heirarchy), all the other controls move and rotate with it. In this rig, controls higher up in the heirarchy are larger than those that are lower down.

In a heirarchy of objects, an object directly above another object is called a parent of that other object, while an object directly below another object is called a child of that object.


Don't confuse these with the skeleton-like geometry we saw earlier. One purpose of joints is to define the freedom that the character has in its movement. When the controls are animated, they affect the rotation of the joints, which in turn affect the movement and deformation of the character's geometry. Joints are usually arranged in a heirarchy from the time they are created.

IK Handles

Normally, objects higher up in a heirarchy affect those that are lower down. This is called forward kinematics (FK). However, sometimes it is easier to animate if objects lower down in the heirarchy can be animated independently from those higher up in the heirarchy. Try to put the character into a squating position by moving the body_con towards the ground plane. Notice how, while the joints in the middle of the body move downwards, the hand and foot joints remain close to their controls. Those joints are affected by inverse kinematics (IK). With IK, the hand and foot joints (which are lower in the heirarchy) can be kept stationary without requiring the animator to counter-animate them against the shoulder and hip joints (which are higher up in the heirarchy). In Maya, IK is specified by IK handles—the thin lines at the wrist and heels.

Ideally, controls should be the only part of the rig that animators need to know about. The purpose of the rest of the rig (which includes joints and IK handles) is to enable the controls to affect the movement and deformation of the geometry.

Rigging a character

Model, before being rigged.

Create a new scene and import basic_character_model.mb, which contains the character model.

Checking the model

To make the task of rigging easier, check the model for the following:

Is the model in its neutral pose?

A character's neutral pose is like an average of the poses that the character is in. Having the character be modeled in its neutral pose makes it easier to setup a rig that deforms the geometry well. Most often, the neutral pose is a T pose with the feet pointing forward, the elbows pointing back, and the palms turned downwards. We also want the elbows and knees to be slightly bent. This will help when we set up joints and IK handles.

Is the model to scale?

This is important when a character must be in the same scene as other characters and objects. In general, changing the scale of a character is easier before rigging. If one Maya unit = 1 cm, then this model would be 155 cm, or 5'1".

Is the model centered over the origin?

Model, centered over axes.

Having the model be centered over the axes makes rigging easier (you'll see why shortly). Notice that the model is already centered over the Y and Z axes—the YZ plane. In addition, having the feet of the model align with the ground plane is a matter of convenience for animating and rigging.

Select the group named lowpoly_skeleton and move it up until the feet are above the ground plane.


To select a group without using the Outliner or the Hypergraph, first select an object within the group, then press the ↑ key. For example, to select the group lowpoly_skeleton, select rib_cage, then press ↑. In general, ↑ selects the object immediately up the heirarchy from the one currently selected. Try to find out what ↓, ←, and → do.

Now that the model is ready, it's time to start rigging.

Creating Joints

The first step is creating the joints in the rig.

Settings for Joint Tool.

To begin creating joints, make sure the menus are set for , then open up Skeleton > Joint Tool .... For Degrees of Freedom, leave all boxes checked (we'll change these later for specific joints) and keep Auto Joint Orient set to xyz (the convention we will follow for this rig).

Leg Joints

Use the Joint Tool to create the leg joints by clicking at these places in the side view:

  1. the hip, at the top of the femur (the thigh bone)
  2. the knee, between femur and the lower leg bones
  3. the ankle
  4. the ball of the foot, and
  5. the end of the toe

Be sure to create the joints so that there is a slight bend in the knee joint. This will help with setting up the IK for the legs.

Name these joints hipL, kneeL, ankleL, ballL, and toeL_end.

Before and after aligning hipL.

In the front view, notice how the leg joints you just created are sitting on the YZ plane. We want to line them up with one of the legs—say, the left leg.

Move hipL to the top of character's left femur and rotate it so that the joints align with the left leg.

Returning to the side view, notice how the leg joints are no longer aligned. Some joints were not far enough apart when we created them.

Manipulator pointing down lower leg.

Use the Move Tool in Local mode to move kneeL. Click and drag the X axis on the move manipulator until kneeL is once again aligned with the leg. Do the same to ankleL.

Why Local move mode and why the X axis on the move manipulator? When joints are created, each parent joint points towards its child with one of its rotation axes. In other words, each child joint lies along one of the rotation axes of its parent joint. This is a good property to keep in a rig. Based on the Joint Tool settings we used for this rig, each child joint lies along the X rotation axis of its parent joint. Moving a child joint along the X axis in Local mode keeps this property in the rig.


To see the local rotation axes on the selected object without the move manipulator, toggle Display > Component Display > Local Rotation Axes.

ankleL after being aligned with foot.

Rotate ankleL until the feet joints align with the foot.


There are settings for Rotate Tool, too. When Rotate Mode is set to Local, the rotate manipulator is aligned to the selected object. When Rotate Mode is set to Global, the rotate manipulator is aligned to the world axes. For rotating hipL this doesn't make a big difference, but for ankleL and other joints it may be more intuitive to be in Local rotate mode.

Leg joints and local rotation axes.

The Z rotation axis of kneeL should point towards the side, perpendicular to the leg. To be anatomically correct, kneeL should only be able allowed to bend about this axis. The same should be true about ballL.

If none of the axes points perpendicular to the leg, you may have moved or rotated some joints too much. Try your best to fix this.

Otherwise, continue by limiting kneeL and ballL to only rotate about their Z rotation axis.


kneeL Attributes.

To change the axes that a joint can rotate about, open up the Attribute Editor with that joint selected. For Degrees of Freedom, a check by an axis means that the joint is free to rotate about that axis. If an axis is unchecked, the corresponding Rotate channel will be disabled.

Try rotating kneeL and ballL to see the effects of limiting their rotation (remember to undo).

At this point, the rig has joints that are aligned with the left leg. In a later section, we'll reuse them to create the joints for the right leg.

Arm Joints

Use the Joint Tool to create the arm joints by clicking at these places in the top view:

  1. the side of the back/neck bones
  2. the shoulder, between the rib cage and the humerus (the upper arm bone)
  3. the elbow, between the humerus and the lower arm bones
  4. the wrist,
  5. the end of the palm

Name these joints clavicleL, shoulderL, elbowL, wristL, and palmL_end.

In the front view, notice how the arm joints you just created are sitting on the XZ plane. As we did for the leg joints and the left leg, we want to align the arm joints with the left arm.

After having moved the clavicleL, rotated it, and aligned the other joints to the arm.

Move clavicleL up until the arm joints are at the same level as the left arm. Starting from clavicleL, rotate each joint so that the next joint is aligned with the corresponding place on the arm. It is better in this case to rotate the arm joints using the Rotate Tool in Local mode. Rotating these joints in Local mode seem to keep the Z axis of elbowL more perpendicular to the arm than rotating them in Global mode.

As we did for kneeL, limit elbowL to only rotate about its Z rotation axis.

At this point, the rig has joints that are aligned with the limbs on the left side of the character. We want to mirror these to create joints for the limbs on the right side.


Options for Mirror Joint.

To mirror joints, open up Skeleton > Mirror Joint .... Set Mirror Across to be the plane of symmetry for your character and keep Mirror Function set to Behavior. Mirror Joint can also give sensible names to the joints that it creates. For the joints we're mirroring, set Search for to L and Replace with to R. Select the highest joint of the joint heirarchy that you want mirrored, then click Apply. You may discover that the mirror tool can mirror only one joint heirarchy each time it is applied.

After mirroring hipL and clavicleL.

Mirror the joint chains rooted at hipL and clavicleL over the YZ plane. (This is why we checked for the model being centered over the axes!) Have it replace any L's in the names with R's.

At this point, the rig has joints that are aligned with all the limbs of the character.

Backbone Joints

Unlike the leg and arm joints, we would like to have the local rotation axes of different backbone joints to point in similar directions. This makes setting up the back control easier.

Backbone joints created on grid, then aligned to spine.

Create backbone joints on one of the gridlines. Creating joints in a straight line is one way of making sure that they are oriented in the same direction. Start at the same level as the base of the backbone then stop near the arm level. For this rig, three or four joints would do.


To create joints on a gridline, turn on "Snap to grids" before creating joints (either by toggling or by holding down the x key).

Starting from the joint at the base of the backbone, name the joints something like spine1, spine2, and so on. As done with the arm joints, move spine1 into place then, starting with spine1, rotate each joint so that the next joint is aligned with the backbone. If you need to move the spine joints along the way, use the X axis on the move manipulator in Local mode.

More Rigging:

For a more complicated backbone with many joints, this way of making sure that joints orient in the same direction can be tedious. An alternative is to create the joints in the shape of the backbone then edit their Joint Orient attributes. But editing Joint Orient can be tedious as well. Fortunately, there are tools for re-orienting many joints at once. See the tutorial on orienting joints.

Head and Neck Joints

The head and neck joints can be created in the same way as the joints for the backbone. Since this character has no jaws or other head parts, no joints are necessary between the bottom and top of the head.

Name these joints neck1, neck2, neck3, and head_end.

At this point, the rig has joints that are aligned with the legs, the arms, the backbone, and the head/neck. In the next section, we'll connect them together into one heirarchy of joints.

Finishing up the Joints

Create a joint named pelvis slightly below spine1. This joint allows for movement in the hips of the character.

Apply Connect Joint to parent hipL and hipR under pelvis.


To use Connect Joint to parent a joint under another joint, open up Skeleton > Connect Joint ..., set Mode to Parent Joint, select the child joint followed by the parent joint that you want, then click Apply.

Create a separate joint named root. This joint will be at the root of the joint heirarchy, allowing the pelvis and the torso in this rig to be animated independently.

Apply Connect Joint to parent pelvis and spine1 under root.

Less Rigging:

A simpler way to set up joints for a character is to position pelvis between the hip joints and make it the root of the joint heirarchy. This would limit the torso to follow the hips when animated.

Finally, use Connect Joint again to parent clavicleL, clavicleR, and neck1 under the last spine joint. This makes the shoulders and neck move with the top end of the spine.

More Rigging:

Another way to connect separate heirarchies of joints is to use a combination of Group and Parent.

You've finished creating the joints in this rig. For all except the simplest of characters, directly using joints to animate can be difficult. In the following sections, we'll add functionality to the rig to make the character easier to animate.


If you haven't saved your work already, now is a good time to do so (and backup a copy while you're at it).

Creating IK Handles

The second step is specifying which joints are controlled via IK. In this rig, we want IK controls for the arms and legs. This makes planting the feet and posing the hands easier.

As mentioned earlier, IK in Maya is specified by creating IK handles. To begin creating IK handles, open up Skeleton > IK Handle Tool .... The IK Handle Tool expects you to pick two joints that lie on the same chain of joints: a higher one (the start joint) followed by a lower one (the end joint). The joints between these two joints in the heirarchy will be controlled via IK.

IK for Arms and Legs

For IK affecting the arms and legs, set Current Solver to ikRPsolver. RP refers to rotation plane, which will allow us to create additional controls for the overall twist rotation of the arms and legs.

Use the IK Handle Tool to create a rotation plane IK handle by picking hipL then ankleL. When creating the IK handle, pay close attention to the joints to see if they pop out of place.

If the leg joints pop out of place, it probably means that the kneeL joint was rotated after it was created. To fix this, first undo the creation of the IK handle, then freeze kneeL's rotation.


To freeze the rotation of an object, open up Modify > Freeze Transformation ... and leave only Rotate checked. Select the object whose rotation you want frozen and click Apply. This sets the rotation of the object to zero. For joints, it also keeps its local axes oriented in the same direction.

Name the IK handle legL_ik. Try moving legL_ik to see how it affects the leg (remember to undo).


IK handles are initially positioned at the end joint that it affects; look for them there.

Create rotation plane IK handles from hipR to ankleR, from shoulderL to wristL, and from shoulderR to wristR. As we did when creating legL_ik, you may have to freeze the rotation of the knee and elbow joints before creating the IK handles.

Name these IK handles something like legR_ik, armL_ik, and armR_ik.


Mirroring joints affected by IK also creates a new IK handle in the process.

IK for Hands and Feet

As you move the IK handles, you may have noticed that while we have control over the ankle and wrist positions, there is really no control over the overall orientation of the feet and palm. One way to enable this control is to create additional IK handles.

Unlike IK for the arms and legs, we won't need additional controls for the twist rotation of the hands and feet. When creating IK handles for the hands and feet, single chain IK handles will do. To create single chain IK handles, set Current Solver to ikSCsolver.

Use the IK Handle Tool to create single chain IK handles from each ankle joint and to its "ball of the foot" joint, and from each wrist joint to its "end of the palm" joint.

Name these IK handles something like footL_ik and handL_ik, and so on. Try moving and rotating these IK handles (remember to undo). The hands and feet should rotate towards the IK handles.

You've finished specifying the joints in this rig that are controlled via IK. IK makes animation easier in many cases, but IK handles provide only some of the controls we want for the character. In the next section, we'll set up all the controls of the rig.


If you haven't saved your work already, now is a good time to do so (and backup a copy while you're at it).

Setting Up Controls

The third step is setting up the controls of the rig.

As we set up the controls, it will be easier to see how they work if the joints had more shape to them. With this in mind, parent each piece of geometry to a corresponding joint in the rig.


A quick way to parent multiple objects under a single parent is to select all the children objects first, select the parent object last, then apply Modify > Parent (or press the p key).

When setting up controls in general, have an idea of the controls that an animator would need for animating the various parts of the character (according to what's required by the desired motion). This may come easier with experience using controls for an existing character. We have tried the controls in the sample rig, but our character doesn't have specific requirements in terms of motion. So let's just start with a given set of controls and go from there. Keep in mind that rigging a character for particular animation may take some planning.

Import basic_character_cons.mb, which contains a set of NURBS spline objects that will serve as the controls (or cons) of this rig. NURBS spline objects work well as cons because they aren't renderable.

A finer but equally important part of setting up controls is the positioning the cons. While we set up the cons for each part of the character, we'll be positioning them accordingly.

Leg Controls

The legs are controlled using the foot cons and the knee cons.

Position both the foot cons at the character's heels. Rotate them out towards the same direction as the character's feet. This makes it easier to animate the heels in a walk cycle.

Apply Parent Constraint to constrain legL_ik and footL_ik to footL_con. This acheives the same affect as parenting the IK handles under the con, but it doesn't actually change the heirarchy.


To apply Parent Constraint, select the target object (footL_con) followed by an object to constrain (legL_ik or footL_ik) then apply Constrain > Parent.


When applying any type of constraint, make sure that the target object (usually a con) is selected first, followed by the object to constrain (usually a joint or an IK handle). In addition, only one object can be constrained each time a constraint is applied. Note how applying constraints differs from applying Modify > Parent. For constraints, second follows first, while for applying Modify > Parent, everything follows last.


After applying a constraint, check whether a constraint node was created as the child of the object you wanted to constrain. It should be named something like objectToConstrain_constraintType. In addition, the translate and/or rotate channels of the object to constrain should be highlighted in the Channel Box. The target object, however, should remain unchanged.

Try moving footL_con to see how it affects the leg (remember to undo). Notice how the left foot moves and rotates with the control, stretching/compressing the leg.

Apply Parent Constraint again to constrain legR_ik and footR_ik to footR_con.

Place both the knee cons in front of the knee joints. One way to do this is to first move each knee con onto the pivot point of the corresponding knee joint then move the knee cons forward.


To move an object onto the pivot point of another object, turn on "Snap to points" before using the Move Tool (either by toggling or by holding down the v key).

Apply Pole Vector Constraint to constrain legL_ik to kneeL_con.


To apply Pole Vector Constraint, select the target object (kneeL_con) followed by a rotation plane IK handle to constrain (legL_ik) then apply Constrain > Pole Vector.

Try moving kneeL_con to see how it affects the leg (remember to undo). Notice how the left knee points towards the control. Technically, the control determines the pole vector of the rotation plane IK handle, which in turn determines the orientation of the rotation plane—an imaginary plane that goes through hipL, kneeL, and ankleL.

Apply Pole Vector Constraint again to constrain legR_ik to kneeR_con.

Try rotating the foot cons again (remember to undo). Notice how the knees stay stationary. For some animation, it may be easier for the knees to follow the feet. This is the case for the sample rig.

Assuming that's what the animation needs, parent the knee cons under their corresponding foot cons.

More Rigging:

The leg controls in this rig make it easy to roll the foot about the heel, but what about rolling them about the ball of the foot? See the reverse foot tutorial.

Arm Controls

In this rig, the arms controls work in the same way as the leg controls. The arms are controlled using the hand cons and the elbow cons.

Align both the hand cons with character's wrist joints.

As we did for the legs, apply Parent Constraint to constrain each arm and hand IK handle to the corresponding hand con.

Position both the elbow cons behind the elbow joints.

As we did for the legs, apply Pole Vector Constraint to constrain each arm IK handle to the corresponding elbow con.

Try rotating the hand cons (remember to undo). Notice how the elbows stay stationary. As it is with the knees and feet, for some animation, it may be easier for the elbows to follow the hands. For others, it may be easier for hands and elbows to be animated independently, freeing animators from having to counter-animate the elbows. This is the case in the sample rig.

Besides the elbow/knee difference, the arm controls in this rig are virtually identical to the leg controls. In other rigs, this may not be the case. A single character may require a different controls depending on the shot and the actions/acts that the character has to perform. Let's use the arm controls as an example. Animation with hand interaction may require IK-controlled hands. For animation without hand interaction, the hands (or even entire arms) may be animated via set-driven-keys (see the sections on Torso Control and Neck Control).

More Rigging:

Some models may require rigs that are more anatomically correct than this one. For a more realistic setup of the arm, see the advanced forearm tutorial.

More Rigging:

In a rig with IK-controlled hands, the hand cons require a wide range of rotation in all directions. Because of how rotation works in math, there are limitations on how far objects can rotate in certain directions. Although these limitations affect the hand cons the most, they also apply to all the other controls. To reduce these limitations, see the gimble lock tutorial.

Root and Hip Controls

The character's body position and orientation are controlled using root_con, while the hips are controlled using hip_con.

Position root_con at the character's center of gravity (this may or may not be at the root joint).

Apply Parent Constraint to constrain the root joint to root_con.

Position hip_con somewhere behind the pelvis joint. Since hip_con is purely a rotate control, its position is less a matter of function and more a matter of being easy to select.

Apply Orient Constraint to constrain the pelvis joint to hip_con.


To apply Orient Constraint, select the target object (hip_con) followed by an object to constrain (the pelvis joint) then apply Constrain > Orient.

Try rotating root_con (remember to undo). Notice how the pelvis stay stationary. Since the pelvis does generally move with the body, it may make animation easier if root_con did affect the pelvis.

Parent hip_con under root_con.

Torso Control

In this rig, the torso is controlled via FK, similar to the pelvis. As the pelvis is controlled using hip_con, the torso is controlled using torso_con.

Position torso_con somewhere behind the spine1 joint. Like hip_con, torso_con is also a rotate control whose position doesn't affect the character.

With Maintain Offset checked, apply Orient Constraint, to constrain the spine1 joint to torso_con. We keep Maintain Offset checked because, while the pelvis joint and hip_con are oriented the same, the spine1 joint and torso_con are oriented differently.

As we did for hip_con, parent torso_con under root_con.

The torso has many more joints than the pelvis, requiring additional controls. While adding more cons would solve this, having one con for each joint defeats the purpose of setting up controls. One alternative is to let a con's attributes drive the rotation of multiple joints.

To set up torso_con to drive the spine joints, do the following:

Add a new attribute to the con.

Use Modify > Add Attribute to add an attribute named bendForwardAndBack to torso_con. Leave Data Type set to Float, and set Minimum to -10, Maximum to 10, and Default to 0. Click Add to add the attribute.

Load the spine joints as the driven and the con as the driver.

With spine2 and spine3 selected, open up Animate > Set Driven Key > Set .... Notice how the selected joints are automatically loaded as driven. To choose torso_con as the driver, select torso_con in the Driver panel then click Load Driver. Notice how torso_con appears and becomes selected in the Driver panel. In the Driven panel, make sure that spine2 and spine3 are also selected. Keep the Set Driven Key options window opened for the the remaining steps.

Determine which spine joint attribute is driven by the con attribute.

Which rotate attribute on the spine joints should be driven by bendForwardAndBack? The way to tell is to find the local rotation axis that you would use to bend the joints foward and back. Given the way we have set up the joints, it is probably the Z rotation axis.

With bendForwardAndBack selected in the Driver panel and rotateZ in the Driven panel, click Key. This specifies that, when bendForwardAndBack is 0, the spine joints' rotateZ should be the way they currently are—neutral.

Specify how the con attribute drive the spine joints' rotate attribute.

In the side view, rotate spine2 and spine3 forward to a reasonable extreme, set bendForwardAndBack to one of its extremes—say, its maximum value. Set a driven-key with the same driver and driven attributes as before. Repeat this for the other extremes by rotating the spine joints back, setting bendForwardAndBack to its minimum value, and setting another driven-key.


To see the driven-keys that affect spine2 and spine3, open up the Graph Edtior with the spine joints selected.

Try adjusting the bendForwardAndBack attribute of torso_con to see how its value affects the bending of the torso. When you want to unbend the torso, simply set the bendForwardAndBack attribute to 0.


To freely adjust an attribute on an object, select that object, select the name of that attribute in the Channel Box, hold down the middle mouse button in one of the views, then drag left or right.

Follow the same steps above to add attributes named bendSideToSide (which should drive the joints' rotateY) and twist (which should drive the joints' rotateX).

More Rigging:

The FK controlled torso works for most animation. For an alternate way to control the torso, see the advanced back tutorial.

Shoulder Controls

The shoulders can be controlled using the shoulder cons.

Position shoulderL_con and shoulderR_con at the shoulder joints.

One way to set up shoulder controls is to create single chain IK handles from each clavicle joint to its shoulder joint, then apply Parent Constraint to constrain each IK handle to the corresponding shoulder con. This allows the shoulder cons' placement to determine the rotation of the clavicle joints, which in turn determines the position of the shoulder joints.

Yet another way to set up shoulder controls is to apply Aim Constraint to keep the clavicle joints aimed at the cons. To do this, we only need to constrain two of their axes. With Aim Vector set to point down the clavicle joints, World Up Type set to None, and two of the axes checked as the Constraint Axes, apply Aim Constraint to constrain each clavicle joint to a shoulder con. Given the way we have set up the joints, Aim Vector would be (1, 0, 0) for clavicleL and (-1, 0, 0) for clavicleR, and the Constraint Axes would be the Y and Z axes.


To apply Aim Constraint, open up Constrain > Aim ... and set Aim Vector, World Up Type, and Constraint Axes appropriately. Select the target object (shoulderL_con) followed by an object to constrain (clavicleL) then click Apply.

Try rotating or bending the torso again (remember to undo). Whichever way you set up the shoulder controls, notice how the shoulder cons don't follow the torso.

One way to fix this would be to parent the shoulder cons under the last spine joint. However, the shoulder cons would be difficult to find in the heirarchy if they are hidden under several levels of joints.

Another way to fix this would be to group the shoulder cons together, then apply Parent Constraint to constrain that group to the last spine joint. The constraint allows the torso to affect the shoulder cons, while the group allows the shoulder cons to be animated separately.

More Rigging:

We've set up the shoulders so that each is controlled by one con. For shoulders that can also be controlled from the arm controls, see the advanced shoulder tutorial.

Neck Control

Like the bending of the torso, the neck in this rig is controlled via set-driven-keys.

Position neck_con somewhere behind the neck. Like hip_con and torso_con, neck_con is also a rotate control whose position doesn't affect the character.

Compared to the torso, the neck has a smaller range of motion. While the torso has both an overall rotation and bend/twist attributes, it's probably enough that the neck has only the bend/twist attributes. We can use the rotate attributes on neck_con to drive the rotation of the neck and head joints.

With the neck joints selected, open up the Set Driven Key options window. Make sure that neck_con as the driver and neck1, neck2, and neck3 are loaded the driven.

With neck_con's rotateX attribute selected in the Driver panel and the neck joints' rotateZ attribute in the Driven panel, set a driven-key. Do the same with neck_con's rotateZ driving the neck joints' rotateY, and neck_con's rotateY driving the neck joints' rotateX. This sets driven-keys for the neutral rotation of the neck joints.

Beside for rotating the driver/driven objects and using the Set Driven Key options window, you can also set driven-keys in the Graph Editor (provide that some driven-keys have been set for the driven attributes).

Open the Graph Editor with the neck joints selected. In the Graph Editor's outline area, select the RotateZ curves. Notice that in the graph area, all three driven-keys are on the vertical axis. This means that they were set when the driver attribute (neck_con.rotateX) had a value of 0.

For all of the neck joints' RotateZ curves, use the Add Keys Tool to add driven-keys at around (-360, -120) and (360, 120). This sets driven-keys at the extreme rotations of the neck joints. These keys form approximately linear curves describing neck joints' rotation in terms of neck_con's rotation. Specifically, for every degree that neck_con rotates in rotateX, each of the three neck joints should rotate about a third of a degree in their rotateZ.

Try rotating neck_con around its X axis. Notice how head_end rotates as if it follows the rotation of neck_con.


To add driven-keys (or any type of keys) to curve(s) in the graph editor, select the corresponding attribute(s) in the outline area, select the curve(s) in the graph area by clicking/dragging with the left mouse button, turn on the Add Keys Tool by clicking , then middle mouse click in the graph area where you want the keys to be added.

Use the Add Keys Tool again to add driven-keys for the neck joints' RotateX and RotateY curves.

Technically, any set of evenly sloped curves would enable the neck_con to drive the neck joints. In general, however, the curves should cover a wide enough range of values (in the vertical dimension) so that the character can have a flexible range of motion. According to this range of values, the curves should cover an appropriate domain of values (in the horizontal dimension) so that the controls do something intuitive when used.


If you need the driven-keys for the neutral rotation to all share the same value (to line up vertically in the Graph Editor), freeze the rotation of the joints before setting the driven-keys.

Try rotating or bending the torso again (remember to undo). Like how the shoulder cons were initially, neck_con doesn't follow the torso. However, unlike the shoulder cons, neck_con is not a translate control but a rotate control whose position doesn't affect the character. Moreover, the neck joints remain neutral even though neck_con doesn't follow the torso.

Nevertheless, you may find neck_con easier to select and more intuitive to use if it did follow the torso. If this is the case, parent neck_con under the group of shoulder controls.

Finishing up the Controls

With all these controls, what would be an easy way for an animator to move or rotate the character into place? All the controls of the character can be translated and rotated using top_con.

Position top_con somewhere over the character.

Parent all the parent-less cons under top_con.

You've finished setting up the controls of this rig. Besides for providing animators with a way to animate the character after rigging, having working controls during rigging can help rigging artists check the deformation of their model during the skin-binding step. However, since the model in this rig is composed of nondeformable parts, it will not require skin-binding.

More Rigging:

For a character model with deformable parts, see the skin-binding tutorial.


If you haven't saved your work already, now is a good time to do so (and backup a copy while you're at it).

Finishing up the rig

When trying out the controls during rigging, undo was always an option. What would be an easy way for an animator (or a rigging artist) to bring a character back to its original pose? To enable this, we need a way to distingish the current placement of the cons. An easy way to do this is to freeze the translation of all the cons.

Do this by selecting top_con and freezing only its translation. The first response you'll get from Maya is that you can't freeze the translation of the shoulder cons group.

Delete the parent constraint that constrains the shoulder cons group to the last spine joint. Freeze top_con's translation, then reapply Parent Constraint to constrain the shoulder cons group to the last spine joint.


Don't undo the deletion of a constraint. If you're curious about what would happen, save your work before you try it.

Try selecting some of the cons. Notice how their translate attributes are all set to 0. To bring a character back to its original pose, simply set the cons' translate attributes to 0.


To set multiple attributes of several objects at the same time, select those objects, click and drag over the attribute names in the Channel Box, then type in a value for those attributes.

Notice how the rotate attributes of the hand and foot cons are not 0. You may try freezing their rotation, but you'll find that it causes the hand and foot IK handles to pop out of place. If you absolutely must freeze the rotation of the hand and foot cons, delete those parent constraints then reapply them after freezing.

Controls like root_con are difficult to select. How can they be placed further away from the model while having their pivots remain where they are? One way to do this is to move the NURBS splines that form the shape of the cons.

Go to Control Vertex Mode either by using the right click/drag menu on root_con or by clicking the Select by component type: Points buttons ( : ). In one of the views, select all the control vertices of root_con then move them towards the front of the character.

You've finished rigging a character. Congratulations! You should be proud of yourself!