zbw_softDeformer.py 文件源码

python
阅读 24 收藏 0 点赞 0 评论 0

项目:zTools 作者: zethwillie 项目源码 文件源码
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)
评论列表
文章目录


问题


面经


文章

微信
公众号

扫码关注公众号