def soft_selection_to_joint(*args):
"""
takes a soft selection of verts and creates a joint to bind & wieght them in that proportion
:param args:
:return: string - name of the soft sel joint we've created
"""
# TODO - check for selection of verts!
selVtx = cmds.ls(sl=True, fl=True) # to get center for joint
vtxs, wts = rig.get_soft_selection() # to get weights for jnt
tform = vtxs[0].partition(".")[0]
mesh = cmds.listRelatives(tform, s=True)[0]
ptOnSurface = cmds.checkBoxGrp(widgets["jntCPOMCBG"], q=True, v1=True)
auto = cmds.checkBoxGrp(widgets["jntAutoCBG"], q=True, v1=True)
jntName = cmds.textFieldGrp(widgets["jntNameTFG"], q=True, tx=True)
rotOnSurface = cmds.checkBoxGrp(widgets["jntRotCBG"], q=True, v1=True)
cls = mel.eval("findRelatedSkinCluster " + tform)
if not cls:
if auto:
baseJnt, cls = rig.new_joint_bind_at_center(tform)
else:
cmds.warning("There isn't an initial bind on this geometry. Either create one or check 'auto'")
return()
center = rig.average_point_positions(selVtx)
rot = (0,0,0)
if ptOnSurface:
center = rig.closest_pt_on_mesh_position(center, mesh)
if rotOnSurface:
rot = rig.closest_pt_on_mesh_rotation(center, mesh)
cmds.select(cl=True)
jnt = cmds.joint(name = jntName)
cmds.xform(jnt, ws=True, t=center)
cmds.xform(jnt, ws=True, ro=rot)
# add influence to skin Cluster
cmds.select(tform, r=True)
cmds.skinCluster(e=True, ai=jnt, wt=0)
# apply weights to that joint
for v in range(len(vtxs)):
cmds.skinPercent(cls, vtxs[v], transformValue=[jnt, wts[v]])
newName = rig.increment_name(jntName)
cmds.textFieldGrp(widgets["jntNameTFG"], tx=newName, e=True)
return(jnt)
评论列表
文章目录