Maya: create hair follicules with MEL script
How to cleanly create hair follicules on mesh or nurbs. - 09/2023 - #Jumble
When rigging we often use hairfollicules because they are fixed to uv coordinates of a surface, and that's handy in many situations. However, this is probably a legacy way of doing this, since we now have UV pin constraints introduced in Maya 2020. They can probably do the job as well.
Anyhow here is some code to create a single hairfollicule without having to create a whole hair system.
global proc string get_transform(string $shape) { string $transfo; if ( "transform" != `nodeType $shape` ) { string $parents[] = `listRelatives -fullPath -parent $shape`; if( size($parents) > 0) $transfo = $parents[0]; }else{ // If given node is already a transform, just pass on through $transfo = $shape; } return $transfo; } global proc string get_shape( string $xform ) { string $shape; if ( "transform" == `nodeType $xform` ) { string $parents[] = `listRelatives -fullPath -shapes $xform`; if( size($parents) > 0) { $shape = $parents[0]; } } else { // Assume it's already a shape; $shape = $xform; } return $shape; } // Create a single follicule on some surface at (U,V) coordinates // @param $surface : mesh name or nurb name // @return follicule transform name global proc string createHairFollicule(string $surface, float $U, float $V) { $surface = get_shape($surface); string $shapeType = `nodeType $surface`; string $folliculeShape = `createNode follicle`; string $follicule = get_transform($folliculeShape); // Connect Objects if($shapeType == "mesh") connectAttr -f ($surface+".outMesh") ($folliculeShape+".inputMesh"); else /* assume: $shapeType == "nurbsSurface" */ connectAttr -f ($surface+".local") ($folliculeShape+".inputSurface"); connectAttr -f ($surface+".worldMatrix[0]") ($folliculeShape+".inputWorldMatrix"); connectAttr -f ($folliculeShape+".outRotate") ($follicule+".rotate"); connectAttr -f ($folliculeShape+".outTranslate") ($follicule+".translate"); // center Object On Plane setAttr ($folliculeShape+".parameterU") $U; setAttr ($folliculeShape+".parameterV") $V; return $follicule; } string $follicules[]; $follicules[size($follicules)] = createHairFollicule($nurbs, 0.0, 0.5); $follicules[size($follicules)] = createHairFollicule($nurbs, 0.5, 0.5); $follicules[size($follicules)] = createHairFollicule($nurbs, 1.0, 0.5); group -name "follicules" $follicules;
No comments