Today we’re kicking off a new two part tutorial that will teach you how to construct a complex, complete human facial rig in Maya. This tutorial is a companion piece to author Soni Kumari's previous premium series covering the creation of a complete human character rig.
Building a face rig suitable for animation is one of the more challenging aspects of character creation, this series will walk you through the entire process from start to finish and give you a detailed, in-depth lesson on what it takes to build a intuitive and animation friendly facial rig from scratch!
Also available in this series:
- Building A Complete Human Facial Rig In Maya, Part 1
- Building A Complete Human Facial Rig In Maya, Part 2
- Building A Complete Human Facial Rig In Maya, Part 3
In the first part of the tutorial, we will learn how to setup a basic interface for facial rigging and also learn how to create joints and controls for a natural face deformation. Let’s start Maya and open the Face Rig Start.mb file which has been provided with the tutorial. When you open the file, you will notice this is a pre-built face model with temporary skin textures applied and looks more like a cartoon. Now before starting facial rigging, we first have to set up the interface so we can quickly reach the required tools.
Now we will start making a custom shelf for easy access to the tools needed for rigging. Click on the ‘Shelf Modify’ arrow button at the sheer left side of the screen and then click on the ‘New Shelf’ command.
This opens the ‘Create New Shelf’ dialog box. Enter the new shelf name as FaceRigTools, and then click on the OK button to close the dialog box.
You will notice a new blank Shelf has been created in the menu with the name ‘FaceRigTools’. Now we will add commands to this menu for the face rig.
If you are not already in Animation mode, then switch to Animation mode by clicking on mode menu command.
To add commands into the Shelf menu, always hold down the Shift + Ctrl keys and click on the desired menu command which you want to add. So hold down Shift + Ctrl and click on the Edit menu, click on ‘Delete by Type’ and then click on the History command. Now you can see the result in the Shelf menu.
You can now see the History command in the shelf.
Just like this, to insert the Freeze Transformation command, hold down Shift + Ctrl and click on the Modify menu and then click on the Freeze Transformations command.
So this is how you create a custom shelf. We can add more commands as per requirement.
Now let’s start making the face rig. So go to the Side view and click on Template mode (T) in the layer editor. This displays the face model as shown in the image below.
Now, we have to create joints for the face mesh. So click on the Skeleton menu in the main menu bar, and then select the Joint Tool command.
Start by creating three joints from the neck to the tip of the head. Also rename these as Neck_joint, Head_joint and HeadTip_joint using the Outliner.
Again draw two more joints for the Jaw as shown in the figure below, and also rename them as Jaw_joint and JawTip_joint.
Now, first select the Jaw_joint then select the Head_joint and press the P key. This makes the Jaw joint a the child of the Head joint (It should look like the image below.)
To create controls, we have to use the IK Handle Tool. So click on the Skeleton menu and then click on the IK Handle Tool command.
With the IK Handle Tool selected, first click on the Neck_joint and then click on the Head_joint. You will see the IK handle is now created. Also rename it as Head_IK.
Now let’s create the Head control. For that go to the Create menu, NURBS Primitives and select Circle. And then drag to create a Circle on the grid.
To align the Head control, zoom in and focus on the Head_joint. Select the Circle with the Move tool on (press the W key), press and hold the V key and drag the Middle Mouse button onto the Head_joint.
Now let’s arrange the circle control properly. Rotate the circle a bit according to the image, and press the F8 key to convert it into component mode. Select all vertices and scale them accordingly (if needed.) Press F8 key again to return to Object mode.
After positioning the circle curve, rename it as Head_Control.
With the Head_Control selected, click on both the Delete History and Freeze Transformation commands one by one in the newly created FaceRigTool shelf.
Now we will apply a Constraint. Select the Head_Control first and then Head_IK, and click on the Constrain menu and then select the Point command to apply a Point Constraint.
Point constraints work with move transform only, not rotation. Here we need a constraint for rotation also. So again first select the Head_Control and then select the Head_joint, and click on the Constrain menu and select the Orient constraint options box.
In the Orient Constraint Options box, check on the Maintain offset option and then click on the Add button to apply and close the Orient Constrain Options box.
Now you can check the rotation of the Head control using the Rotate tool. It works fine. So reset the transform value with the undo command.
Now we will create a locator for global head control. So click on the Create menu and select the Locator command to create the locator.
Snap the locator to the Neck_joint while pressing and holding the V key. Rename the locator as Global_Head_Control. Also don’t forget to apply the Freeze Transformation and Delete History Commands on the Global_Head_Control.
Select the Global_Head_Control and then select Neck_joint and apply a Parent Constraint.
Again select the Head_Control first and then select the Global_Head_Control and press the P key, to make the Global_Head_Control the parent.
Create one more Circle curve in the front view and place it as shown in the image below.
You can change the circle curve into Component mode to deform it accordingly. Don’t forget to change it back into Object mode once you are done!
Again jump into the Front view and duplicate the curve twice and arrange them as shown in the image below.
Then jump into the Perspective view, and select all the newly created curves and apply both the Delete History and Freeze Transformation commands.
Rename the curves now. Rename the bigger circle as Both_Eyes_Control, and the small curves as L_Eye_Control and R_Eye_Control.
First select L_Eye_Control & R_Eye_Control and then select Both_Eyes_Control and press the P key. The bigger curve (Both_Eyes_Control) now becomes the parent of both the left and right eye controls.
Now, we'll do some special parenting for the parts inside the mouth and eyes. Make sure that the Face Mesh layer is in hidden mode. The TeethTongueEye should be visible and in selective mode.
Now, first select both eye balls and while pressing and holding the Shift key, select the Head_joint. Then press the P key to make the Head joint the parent. This means wherever the Head joint moves, the eye balls will follow.
This time with the upper teeth and inner throat parts selected. Hold Shift and select the Head_joint again, and press the P key. Now The Head joint becomes the parent of these parts too.
It's always good to keep the objects in wireframe mode for easy selection purposes. Now for the parenting of the Lower teeth object. First select the lower teeth object mesh, then select the JawTip_joint, finally press the P key.
Again change back to "Smooth Shade All" mode. Now first select the L_Eye_Control, and then select the left eye ball.
With the L_Eye_Control and left eye ball selected. Go to the Constrain menu, and click on the Aim command options box.
In the Aim constraint options setting box, check on the Maintain offset option and then click on the Add button, to apply the Aim constraint.
Now apply the same Aim constraint for the right side control as well. Select the R_Eye_Control, then select the right eye ball and apply the Aim constraint.
Now first select Head_joint, and then select Both_Eyes_Controls and then apply the Patent Constraint.
Now we have to make one custom Attribute to lock and unlock the Both_Eyes_Control. So with the Head_Control selected, go to the Modify menu and click on Add Attribute to open the Add Attribute settings box. If you want to use the Add Attribute command frequently, you can keep this command in the Shelf.
In the Add Attribute settings box, write LockEyesControl as the attribute name in the Long name box. Put the values as follows: Minimum 0, Maximum 1 and Default 0. Finally click on the OK button.
Now you can see the LockEyesControl attribute under the Head_Control channel. And also open the Outliner window for the selection of the constrain group which is applied.
Open the Set Driven Key dialog by pressing the Set button in the Shelf tab. With the Head_Control selected, click on the Load Driver button in the Set Driven Key settings box.
Now, in the Outliner window, select Both_Eyes_Control_parentConstraint1, and then click on the Load Driven button in the Set Driven Key settings box. You will notice Both_Eyes_Control_parentConstraint1 is now selected in the Driven group.
Select LockEyesControl in the Driver group, and select Head joint W0 in the Driven group. Then click on the Key button for initial driven key.
Now select Head_Control in the opened set driven key box, and enter a value of 1 for the LockEyesControl attribute in the channel box.
Again select Both_Eyes_Control_parentConstraint1 in the Driven group, and then enter a value of 0 in the Head joint W0 fill box. Then click on the Key button in the Set Driven Key box.
Now, we'll create joints for the tongue mesh object. Jump into the side view and turn on the template (T) mode of the TeathTongueEye layer.
With the Joint tool selected, start by creating 5 joints in sequence inside the tongue mesh object, as shown in the image below.
Also rename all the created joints for the tongue as: Tongue_joint1, Tongue_joint2, Tongue_joint3, Tongue_joint4 and Tongue_jointTip.
Now, Select Tongue_joint1, then select the Jaw_joint and press the P key for parenting.
Click on Skeleton menu and then the IK Spline Handle Tool.
With the IK Spline Handle Tool selected, first click on Tongue_joint1, and then select Tongue_jointTip. You’ll see the Spline Ik handle is applied to the joints.
Zoom in properly to see the Spline Ik curve inside the joints, and select it.
With the Spline ik curve selected, jump into Surface mode and then go to Edit Curves > Selection. Finally click on the Cluster Curve command.
Rename all Clusters as: cluster_Tongue1, cluster_Tongue2, cluster_Tongue3, and cluster_Tongue4.
Now to apply Smooth Skin to the tongue mesh and the tongue joints, first keep the TeethTongueEye layer as normal, then switch on Wireframe mode and first select the Tongue mesh, and then select Tongue_joint1.
With both the tongue mesh and Tongue_joint1 selected. Switch the application to Animation mode and then click on Skin > Bind Skin, and select the Smooth Bind command.
Open the Outliner window and select cluster_Tongue1, then select the Jaw_joint and press the P key.
Select cluster_Tongue2, and then select the Jaw joint and press the P key. Do same thing with the rest of the clusters and apply parenting to them as well.
After parenting all the tongue clusters, switch to "smooth shade mode". With the Rotate tool selected, rotate the Head_Control to test whether all the linking has been done properly or not.
Now, select the tongue mesh object. And in the panel menu, click on Show, then select Isolate Selection and check on the View Selected command, to view only the selected object. This way you have only the tongue mesh object visible in the viewport.
With the tongue mesh object selected, click on Skin > Edit Smooth Skin and then select the Paint Skin Weights Tool.
In the Paint Skin Weights Tool, select the Tongue_joint1 and click on the Add radio button. While keeping the Opacity and Value settings set to 1, drag the brush on the tongue mesh as shown in the image. You will have to paint the weights properly.
Do same thing with the rest of the tongue joints also.
Now let’s check the clusters. Select each cluster and move it. It should behave like a tongue. Once you've checked tem, go into "smooth shaded mode". Next we will add the attribute control for the Jaw.
Select the Head_Control again to add Attributes. And open the Add Attribute box from the Shelf. In the Add Attribute settings box. Enter JawX for the Long name, and click on the Add button. Similarly add two more JawY and JawZ Attributes.
You can now see these three Attributes listed under the Head_Control.
Now, for connecting the Attributes and Jaw joint rotation. Select the Head_Control, then go to Window > General Editors and select the Connection Editor.
Select the Jaw_joint and click on Reload Right. Slide down and fix the rotation for both sides. First select JawX (left side) then select rotateX (right side). Do same connection for both JawY to rotateY, and JawZ to rotateZ. Finally close the Connection Editor.
Let’s connect the JawTip joint with the inside jaw mesh object. So with the inside jaw mesh object selected, press the F8 key to keep it in components mode. And select the lower vertices as shown in image below.
With the vertices selected, go to the Create Deformers menu and select the Cluster command (to apply a cluster to the selected Vertices.) Again press the F8 key to return to object mode.
For parenting, first select the newly created cluster and then open the Attribute Editor by pressing Ctrl+A. Under the Cluster Attributes rollout, check on the Relative option button.
Now with the cluster selected, hold down the D and V keys and snap the pivot to the JawTip_joint.
Again with the cluster selected, press Ctrl+G to make a group of the selected objects, and rename it as GumclusterGrp.
Now, with the GumclusterGrp and Head_joint selected, press P to parent.
Now first select the JawTip_joint and then select the Cluster, and go to the Constrain > Point Constrain.
Finally check all the connectivity of the controllers we've created. So first switch the view to shaded mode, then select the Head_control and rotate and change the values of created attributes (this is for checking purposes only.) Once checked, reset all the controls to get back to the initial position. And save the file as "Complete Jaw control.mb."
And that completes part 1!