The Bowler character’s head and face were solely made so that I could try out different methods, techniques and workflows to set up a complete joint driven facial rig and I would understand what is needed from a face mesh to be fit for purpose.
It was also a way for me to try out different methods, techniques and workflows to set up a complete joint driven facial rig.
The eyelids, the upper and lower, have one joint each that is directed so that the eyes could be closed properly along the edge of the lid and in both corners. This was solved with an attribute for wink. However, each joint, both the upper and lower, needed to be oriented unevenly much in two different axes,
so I tweaked this with a value, set from -1 to 5, coming from the attribute with multiply/divide-nodes. In this manner and with skinning, I managed to close the eyelids from eye corner to the other, without getting overlapping meshes.
In the workflow of a joint driven face rig it is essential to gradually add influence and edit the paint weight of the skinning. By starting with the head joint and adding to the jaw, continuing with the eyelids and adding to the head and so on,
you get smoother transitions and motions of the facial expressions. While new joints and controls are added, the weight paint in the skinning process is alternated between interactive/post/add and replace/smooth.
Set driven keys
To facilitate for an animator, there might be a point, as a rigger, in directing how much a certain control should affect the skin. This can be done with set driven keys, i.e. adjusting or limiting a joint in rotations and translations,
that is how much a certain motion should go, by using a driver control that affects another set of controls, placed in null groups (set driven key groups). By such means a lot of different joints can interact to reinforce the facial expression you want to achieve.
Having tried point on poly constraints on control groups coming from the paint weight influence of the skin, to have controls following the mesh while manipulating it with another control, and failed this because of a cycle effect, I managed to get the middle control groups on the lips follow a group of locators,
that was aim constrained to the controls on each side of it, using a point constraint.
Also the mouth corner control group was parent constrained (with offset) by on one hand, a locator, with rotations and translations from the jaw joint and then placed under the head joint in the joint hierarchy, and on the other hand the head joint itself. This makes the mouth corner control interpolating just in between the head joint and the jaw locator and getting along with the jaw opening and closing.