Facial rig with custom shader

Demonstration of the facial rig, more information below!
Jacob Vaknin
Upper right cheek ribbon

Ribbon rig

Ribbon rigs were used consistently throughout this rig, creating surfaces that matched the edgeflow of the geometry and creating ribbon setups using follicles. The nHair system was used for creating a number of follicles on the ribbon surface, to which the skinning joints were parented to. The last step was to create joints on the each end of the surface as well as joints inbetween that were later then skinned to the surface. That way the follicles and the skinning joints were automatically moved, driving the skinned mesh when moving a driving joint.


Blendshape rig

This project started out as a blendshape based rig. The pre production started out researching about FACS (facial action coding system) for a thorough understanding of which muscles constitutes facial expressions. Through the procsess I sculpted 16 different expressions which in combination was the underlying foundation for the system. However, in the process I realized that a lot of work would be going in to creating the shapes rather than technical solutions.

I decided to go for a joint based rig instead and continue the work, this way, I could utilize my knowledge of scripting and automate procedures.

Jacob Vaknin
Pucker/Dimpler Expression
Jacob Vaknin
Shader Nodes

Custom Shader

For the shader I needed masks for the wrinkles and bloodflow textures. The first decision I had to make was how many texture maps I was going to use. With RGBA and inverting the remaining space gave a total of five masks, which actually provided ten textures through mirroring around the centerpoint of the face.

For optimizing purposes, this could have been handled differently, but I decided to go with two texture maps. This way I could fit six wrinkle masks and two bloodflow masks and together with a smooth step operation I could mask both sides of the face. By multiplying float values and then adding them together to work as a lerp-value, switching between the normal map and the wrinkle map, I could control where to blend in wrinkles. The float values were exposed and controlled through calculations in the node editor.

Node network

The exposed float values were driven mostly by measurement calculations. By constraining a transform node to a driving joint, and placing another locator in the desired area, measuring the distance between the two.
Jacob Vaknin
Node network
Jacob Vaknin
+46 768 013 678
jacob.vaknin@hotmail.com
© Jacob Vaknin. All rights reserved.
Made with Portfoliobox create your portfolio