Skinning lips using Projective Skinning
Painting weights sucks. It's a process that hasn't changed for the past decade, so here we are going to explain a technique that allows you to minimize or sometimes completely avoid painting weights. I call this technique "Projective Skinning"
Our goal
The goal of this tutorial is to successfully skin the lips of a high resolution mesh with very minimal painting of weights. The lips are notoriously a tough area to skin especially when you have limitation such as max influence per vertex. Also, the lips are an area that needs to deform very softly and this makes it much harder to properly skin using the traditional painting techniques.
The main steps
These are the main steps we will take to properly skin the lips using Projection Skinning. Some of you might be able to apply this techniques by just looking at this list
Make sure your high res face has good weights at the jaw.
Place your lips joints the way you usually do it
Create a proxy version of the lips mesh
Select all joints that are currently influencing the lips area
Skin the proxy mesh to these joints
Copy weights from the high res mesh to the proxy
Add your lips joints as influences to your proxy mesh
Set the weights on the proxy
Copy the weights back to the high res mesh
Let's dive in
Initial weights
Before you start, make sure your head is only skinned to the head joint and the jaw joint. At this stage it's very important that you are happy with how the jaw deforms, usually you want for the jaw to deform very smoothly from the cheeks all the way up to the eye sockets.
Joints Placement
Let's create our lips joints. This very much depends on your workflow. I like to place 7 joints on the upper lips and 7 joints on the bottom lips. I think this give me a good balance.
After you created your joints, hide them. We will use them in a little bit.
Proxy mesh creation
Duplicate the high res mesh and hide the original (rigged) mesh. From the duplicate, select the faces in the lips area and then invert the selection and then hit delete.
After that, you can reduce the proxy mesh using the maya poly reduce functionality or any other reduction tool you may want to use. At this point you should have something like this:
Proxy mesh edge loops (IMPORTANT!)
At this stage I want to change the configuration of the proxy edge loops, in order for me to do the least amount of paint weights possible.
These are the steps to do here:
Have the vertical edge loops align with the joints and have 1 vertical edge loop per joint
Reduce the horizontal edge loops as much as possible. Try to maintain the volume of the original shape as much as possible.
The vertical edge loops
Align the vertical edge loops to the joints and have 1 vertical edge loop per joint.
Let's now add back the vertical edge loop, specifically add 1 loop in between the joints. Important: this steps can be a little different if you have more joints.
The horizontal edge loops
Let's now delete the horizontal loops we don't need, but keeping the ones that keep the volume of our lips somewhat close to the original mesh.
Transfer weights from the original mesh
It's time to skin our proxy mesh, so make sure the mesh is clean of any history and the transformation are frozen.
Select the joints that are currently deforming your face. In my case is just the head and the jaw.
Shift select the proxy mesh and click on Skin>Bind Skin (keep the skin options at their default)
After that, select the high-res mesh, shift select the proxy mesh and click on Skin>Copy Skin Weights
At this point the proxy mesh should deform exactly like the high-res mesh
Skin the proxy mesh
First of all let's add the lips joints as influences to the proxymesh, so select all of the lips joints, then shift select the proxy mesh and click on Skin>Edit Influences>Add Influences and make sure the options look like this:
Notice the circled area, make sure the Weight locking is checked ON and the default weight is set to 0.000
Select 1 vertical edge loop that sits on top of a joint, turn the selection to vertices and let's deselect the last vertex. Deselecting the last vertex is very important to minimize the amount of paint weights.
Now go in the paint skin weights tool and select the joint in the image above from the influence list and and add a value of 1, so those vertices will be influenced 100% but this joint.
Repeat this last step for all of the vertical edge loops that sit on top of a joint.
With that done, you can now select the vertical edge loops in between the joints (except the border vertices) and use the Hammer Weights tool. (Skin > Hammer Skin Weights)
If you have done only the left side of the lips, you can now mirror the weights and all you have to do is to project the weights back to the main surface.
Final Step: Projecting the weights
At this stage you should massage the weights on the proxy so that the deformation is nice and smooth. After you do that, you can project the weight back to the original mesh.
Select all the vertices of the proxy mesh and add them to a set: Create>Sets>Quick Selection Sets and call this set "Lips_src", now select the corresponding vertices on the high res mesh and add those vertices to another set called "Lips_dest".
Next, if you haven' t done it already, add the lips joints as influences to the high res mesh.
Then run this command:
import maya.cmds as cmds
cmds.select("Lips_src", r=1)
cmds.select("Lips_dest", add=1)
The above commands select all the vertices in the set, first we selected all the vertices in the proxy geo and then the ones on the high res mesh.
What is left to do is to copy the weights:
Skin>Copy Skin Weights
You should have ow the highres geo deforming great!