Here are some Face Rig workflow Tips that may be helpful. I'm not a senior level facial rigger yet, but these steps were very useful to me. Hope they are helpful.
--try to pose cartoon face to fit a real face expression reference
(a technique that is helpful to remember poses is to write a function that prints something like
"setAttr eye_anim.tx 1;setAttr nose_anim.tx 1; ..." ). Then save the string onto some transform .. ex. group named "poses", attribute "smile". Then can run something like eval(`getAttr poses.smile`) and it sets the pose.
--take notes on technical steps so they don't have to be remembered.
(things like what do i need to select to run it, any pictures to help with running this ...)
--write scripts that make your work easier not harder… the less dependencies they have or the easier it is to install them / use them the better.
Something I learned from watching Daniel Williams' online tutorials (pointpuster dot com) was to try out a solution, it doesn't have to be the best solution. Then try to look at it and evaluate it/critique it to make it better.
Cheers,
-Nate
Great facial expression reference:
Mark Simon's Facial Expressions (A Visual Reference for Artists)
Here's an example script I wrote to help with quickly remembered face rig pose.
/**@file na_getPose.mel
*
*Prints command to set Pose should work on faces or bodies.(Tested Maya 2008)
*
*@author Nathaniel O. Anozie (ogbonnawork at gmail dot com)
*@note date created: June 10, 2013
*@note How to Install
*@note source na_getPose.mel
*@defgroup anim Animation Posing
*@{
*save pose syntax, gives a string we can call with eval to set face to current pose
*would need to copy pose to text editor before reusing
*
*@note Modify at your own risk
*/
//-------assumes all animator controls selected on scene
global proc string na_getPose(){
print("[na_getPose] Start Computing Pose….\n");
string $cmd = "";
string $sel[] = `ls -sl`;
if(size($sel)==0){error("Requires Animator Controls Selected First !!!\n");}
string $attr[] = {};
for($obj in $sel){
$attr = {};
$attr = `listAttr -k -u $obj`;
//attr
//visibility translateX translateZ
//visibility translateX translateZ
//visibility translateX translateY translateZ rotateX rotateY rotateZ scaleX scaleY scaleZ
//rotateX rotateY rotateZ mouthUp
//…
//print( stringArrayToString($attr," ") );
$cmd += ""+na_getSinglePose($obj, stringArrayToString($attr," ") );
//print("\n");
}
print("\n");
print("[na_getPose] Completed Computing Pose !!!\n");
print $cmd;
//-------
return $cmd;
}
//---------
//result ex: "setAttr jaw_anim.rotateX 0; setAttr jaw_anim.rotateY 0; setAttr jaw_anim.rotateZ -11.81234478"
//obj -- the object ex: "jaw_anim"
//attr -- the attributes space separated ex: "rotateX rotateY rotateZ"
global proc string na_getSinglePose(string $obj, string $attr){
//print("[na_getSinglePose] Computing current pose ….\n");
//string $obj = "jaw_anim";
//string $attr = "rotateX rotateY rotateZ";
string $result = "";
string $attrAr[] = stringToStringArray($attr," ");
string $cmdAr[] = {};
for($attr in $attrAr)
{
$cmd = "";
float $arg;
$arg = getAttr ($obj + "." + $attr);
$cmd = "setAttr "+($obj + "." + $attr) + " "+$arg;
$cmdAr[size($cmdAr)] = $cmd;
}
//print(stringArrayToString($cmdAr,"; "));
$result = stringArrayToString($cmdAr,"; ");
$result += ";";
return $result;
}
//-----------