import maya.cmds as cmds
#先选择曲面执行一次下面代码(设置曲面uv值)
mesh = cmds.ls(sl = True)
mesh_u = 2;
mesh_v = 14;
#再选择骨骼执行以下代码
jnt = cmds.ls(sl = True)
mesh_shape = cmds.listRelatives(mesh,shapes = 1)
fol_grp = cmds.createNode('transform',n = 'follic_grp')
loc_grp = cmds.createNode('transform',n = 'locator_grp')
Locator = []
for i in jnt:
Loca = cmds.spaceLocator()
Loca_shape = cmds.listRelatives(Loca,shapes = 1)
cmds.matchTransform(Loca,i)
foli = cmds.createNode('follicle')
foli_trans = cmds.listRelatives(foli,ap = 1)
cmds.connectAttr(foli + '.outRotate',foli_trans[0] + '.rotate')
cmds.connectAttr(foli + '.outTranslate',foli_trans[0] + '.translate')
cmds.connectAttr(mesh_shape[0] + '.worldMatrix[0]',foli + '.inputWorldMatrix')
cmds.connectAttr(mesh_shape[0] + '.local',foli + '.inputSurface')
cpon = cmds.createNode('closestPointOnSurface')
cmds.connectAttr(Loca_shape[0] + '.worldPosition[0]',cpon + '.inPosition')
cmds.connectAttr(mesh_shape[0] + '.worldSpace[0]',cpon + '.inputSurface')
mult_V = cmds.createNode('multiplyDivide')
mult_U = cmds.createNode('multiplyDivide')
cmds.setAttr(mult_V + '.input2X',mesh_v)
cmds.setAttr(mult_V + '.operation',2)
cmds.setAttr(mult_U + '.input2X',mesh_u)
cmds.setAttr(mult_U + '.operation',2)
cmds.connectAttr(cpon + '.parameterU',mult_U + '.input1X')
cmds.connectAttr(cpon + '.parameterV',mult_V + '.input1X')
cmds.connectAttr(mult_U + '.outputX',foli + '.parameterU')
cmds.connectAttr(mult_V + '.outputX',foli + '.parameterV')
cmds.parent(Loca,loc_grp)
cmds.parent(foli,fol_grp)
创建好之后可以根据控制定位器位置调整毛囊位置
如果不需要调整毛囊位置的话可以在for循环里面加
cmds.disconnectAttr(mult_U + '.outputX',foli + '.parameterU')
cmds.disconnectAttr(mult_V + '.outputX',foli + '.parameterV')
cmds.delete(mult_V)
cmds.delete(mult_V)
cmds.delete(loc_grp)