Here I share a couple of hints and scripts I wrote that helped me considerably speed up facial rigging.
1. Printing a rough expression based on current selection, to aid in connecting facial animator control to some other driver (ex: connecting cluster channels for rivet setup).
//---print expression so can quickly get a control moving something else //result /* dn_lip_anim_loc.tx = dn_lip_anim.tx; dn_lip_anim_loc.ty = dn_lip_anim.ty; dn_lip_anim_loc.tz = dn_lip_anim.tz; r_dnLip_mid_anim_loc.tx = r_dnLip_mid_anim.tx; r_dnLip_mid_anim_loc.ty = r_dnLip_mid_anim.ty; … */ for($arg in `ls -sl`){ string $attr[] = {"tx","ty","tz"}; for($at in $attr){ print($arg+"_loc"+"."+$at+" = "+$arg+"."+$at+";\n"); } }2. Printing a command to be used for constraining two things based on current selection. By copy and pasting command into a text editor and doing search and replaces constraints can be made quickly between two thing based on naming conventions.
//-- print parent constrain with offset command, would need to edit the parent, child in text editor global proc na_printPCwithOffsetCmd(){ string $sel[] = `ls -sl`; string $cmd = ""; for($arg in $sel){ string $parent = $arg; string $child = ($arg+"_anim_grp"); $cmd+= "parentConstraint -mo "+$parent+" "+$child+";"; } print("Run this Command constraint(parent, child) ---\n"); print("eval(\""+$cmd+"\")\n"); } na_printPCwithOffsetCmd();
3. Using Python one line string operations in Mel. In this example I wrote I used a python one liner to get the object and attribute from a setAttr type of command.
//--this will run something like eval(`getAttr object.attr`) but it will not error out if an object is missing //getAttr object.attr --- gives a string of form ex: "setAttr browLeft_anim.visibility 1; setAttr browLeft_anim.translateX 0.1362689445;" global proc na_evalSetAttr(string $obj, string $attr){ string $arg = `getAttr ($obj+"."+$attr)`; string $all[] = stringToStringArray($arg,";"); python("import re"); for($cmd in $all){ string $obj = ""; $obj = python("re.search(re.escape('setAttr')+'(.*)'+re.escape(' '),'"+$cmd+"'.strip() ).group(1)");//ex: browLeft_anim.translateX //print($cmd+"\n"); //print("FOUND<<<"+$obj+"\n"); if(`objExists $obj`){eval($cmd+";");}else{print($obj+" :NOT FOUND--Skipping!!!\n");} } } print("Run:-- na_evalSetAttr(poses transform string, and its pose attribute string ) --ex:\n na_evalSetAttr(\"poses\",\"smile\")\n");
Hope this was helpful,
Cheers,
-Nate
Inspired by John La Rooy's find string between two substrings online python tutorial examples