Exemplo n.º 1
0
def create_control(flc, name='control'):
    """
    The function creates a single vks control, as well as the necessary groups and attributes for further connection
    Args:
            flc: A follicle
    Returns:
            pctr,rctr,ctr: tuple new objects in the order of hierarchy, from top to bottom
    """
    ctr = cmds.circle(name='%s#' % name, nr=(1, 0, 0), ch=0)[0]
    ctr_s = cmds.listRelatives(ctr, s=1)[0]
    cmds.setAttr("%s.overrideEnabled" % ctr_s, 1)
    cmds.setAttr("%s.overrideColor" % ctr_s, 14)

    rctr = cmds.group(name='%s_reverse_grp' % ctr)
    pctr = cmds.group(name='%s_parent_grp' % ctr)
    vPos = cmds.getAttr('%s.parameterV' % flc)

    flc_tr = cmds.listRelatives(flc, p=1)[0]
    cmds.pointConstraint(flc_tr, pctr, mo=0)
    cmds.orientConstraint(flc_tr, pctr, mo=1)
    mtp_r = cmds.createNode('multiplyDivide', n='multiplyReverce_%s' % ctr)
    cmds.connectAttr('%s.rotate' % ctr, '%s.input1' % mtp_r)
    cmds.connectAttr('%s.output' % mtp_r, '%s.rotate' % rctr)
    [cmds.setAttr('%s.input2%s' % (mtp_r, a), -1) for a in ('X', 'Y', 'Z')]

    cmds.addAttr(ctr, ln="falloff", at='double', min=0.0001, max=10, dv=2)
    cmds.addAttr(ctr, ln="position", at='double', min=0, max=10, dv=vPos * 10)
    cmds.addAttr(ctr, ln="minPos", at='double', min=0, max=1)
    cmds.addAttr(ctr, ln="maxPos", at='double', min=0, max=1)
    cmds.setAttr('%s.position' % ctr, k=True)
    cmds.setAttr('%s.falloff' % ctr, k=True)

    ucn_p = setup.onetenthNode(ctr, 'position')
    ucn_f = setup.onetenthNode(ctr, 'falloff')

    ppf = cmds.createNode('plusMinusAverage', n='PplusF_%s' % ctr)
    cmds.setAttr("%s.operation" % ppf, 1)
    cmds.connectAttr('%s.output' % ucn_p, '%s.input1D[0]' % ppf)
    cmds.connectAttr('%s.output' % ucn_f, '%s.input1D[1]' % ppf)

    pmf = cmds.createNode('plusMinusAverage', n='PminusF_%s' % ctr)
    cmds.setAttr("%s.operation" % pmf, 2)
    cmds.connectAttr('%s.output' % ucn_p, '%s.input1D[0]' % pmf)
    cmds.connectAttr('%s.output' % ucn_f, '%s.input1D[1]' % pmf)

    cmds.connectAttr('%s.output1D' % pmf, '%s.minPos' % ctr)
    cmds.connectAttr('%s.output1D' % ppf, '%s.maxPos' % ctr)

    cmds.connectAttr('%s.output' % ucn_p, '%s.parameterV' % flc)
    return pctr, rctr, ctr
Exemplo n.º 2
0
def create_control(flc, name='control'):
    """
    The function creates a single vks control, as well as the necessary groups and attributes for further connection
    Args:
            flc: A follicle
    Returns:
            pctr,rctr,ctr: tuple new objects in the order of hierarchy, from top to bottom
    """
    ctr = cmds.circle(name='%s#' % name, nr=(1, 0, 0), ch=0)[0]
    ctr_s = cmds.listRelatives(ctr, s=1)[0]
    cmds.setAttr("%s.overrideEnabled" % ctr_s, 1)
    cmds.setAttr("%s.overrideColor" % ctr_s, 14)

    rctr = cmds.group(name='%s_reverse_grp' % ctr)
    pctr = cmds.group(name='%s_parent_grp' % ctr)
    vPos = cmds.getAttr('%s.parameterV' % flc)

    flc_tr = cmds.listRelatives(flc, p=1)[0]
    cmds.pointConstraint(flc_tr, pctr, mo=0)
    cmds.orientConstraint(flc_tr, pctr, mo=1)
    mtp_r = cmds.createNode('multiplyDivide', n='multiplyReverce_%s' % ctr)
    cmds.connectAttr('%s.rotate' % ctr, '%s.input1' % mtp_r)
    cmds.connectAttr('%s.output' % mtp_r, '%s.rotate' % rctr)
    [cmds.setAttr('%s.input2%s' % (mtp_r, a), -1) for a in ('X', 'Y', 'Z')]

    cmds.addAttr(ctr, ln="falloff", at='double', min=0.0001, max=10, dv=2)
    cmds.addAttr(ctr, ln="position", at='double', min=0, max=10, dv=vPos * 10)
    cmds.addAttr(ctr, ln="minPos", at='double', min=0, max=1)
    cmds.addAttr(ctr, ln="maxPos", at='double', min=0, max=1)
    cmds.setAttr('%s.position' % ctr, k=True)
    cmds.setAttr('%s.falloff' % ctr, k=True)

    ucn_p = setup.onetenthNode(ctr, 'position')
    ucn_f = setup.onetenthNode(ctr, 'falloff')

    ppf = cmds.createNode('plusMinusAverage', n='PplusF_%s' % ctr)
    cmds.setAttr("%s.operation" % ppf, 1)
    cmds.connectAttr('%s.output' % ucn_p, '%s.input1D[0]' % ppf)
    cmds.connectAttr('%s.output' % ucn_f, '%s.input1D[1]' % ppf)

    pmf = cmds.createNode('plusMinusAverage', n='PminusF_%s' % ctr)
    cmds.setAttr("%s.operation" % pmf, 2)
    cmds.connectAttr('%s.output' % ucn_p, '%s.input1D[0]' % pmf)
    cmds.connectAttr('%s.output' % ucn_f, '%s.input1D[1]' % pmf)

    cmds.connectAttr('%s.output1D' % pmf, '%s.minPos' % ctr)
    cmds.connectAttr('%s.output1D' % ppf, '%s.maxPos' % ctr)

    cmds.connectAttr('%s.output' % ucn_p, '%s.parameterV' % flc)
    return pctr, rctr, ctr
Exemplo n.º 3
0
def connection(vks, jt, jgroup):
    """
    Establishes a connection between the vks control and one of the joints in the chain
    """
    ucn_p = setup.onetenthNode(vks, 'position')

    linstepA = cmds.createNode('setRange', n='setRangeA_%s' % jt)
    cmds.setAttr('%s.minX' % linstepA, 1)
    cmds.connectAttr('%s.parameter' % jt, '%s.valueX' % linstepA)
    cmds.connectAttr('%s.maxPos' % vks, '%s.oldMaxX' % linstepA)
    cmds.connectAttr('%s.output' % ucn_p, '%s.oldMinX' % linstepA)

    linstepB = cmds.createNode('setRange', n='setRangeB_%s' % jt)
    cmds.setAttr('%s.maxX' % linstepB, 1)
    cmds.connectAttr('%s.parameter' % jt, '%s.valueX' % linstepB)
    cmds.connectAttr('%s.minPos' % vks, '%s.oldMinX' % linstepB)
    cmds.connectAttr('%s.output' % ucn_p, '%s.oldMaxX' % linstepB)

    cond = cmds.createNode('condition', n='condition_%s' % jt)
    cmds.setAttr('%s.operation' % cond, 2)
    cmds.connectAttr('%s.parameter' % jt, '%s.firstTerm' % cond)
    cmds.connectAttr('%s.output' % ucn_p, '%s.secondTerm' % cond)
    cmds.connectAttr('%s.outValueX' % linstepA, '%s.colorIfTrueR' % cond)
    cmds.connectAttr('%s.outValueX' % linstepB, '%s.colorIfFalseR' % cond)

    mtp_r = cmds.createNode('multiplyDivide', n='multiplyRotate_%s' % jt)
    cmds.connectAttr('%s.rotate' % vks, '%s.input1' % mtp_r)
    cmds.connectAttr('%s.outColorR' % cond, '%s.input2X' % mtp_r)
    cmds.connectAttr('%s.outColorR' % cond, '%s.input2Y' % mtp_r)
    cmds.connectAttr('%s.outColorR' % cond, '%s.input2Z' % mtp_r)
    cmds.connectAttr('%s.output' % mtp_r, '%s.rotate' % jgroup)
Exemplo n.º 4
0
def connection(vks, jt, jgroup):
    """
    Establishes a connection between the vks control and one of the joints in the chain
    """
    ucn_p = setup.onetenthNode(vks, 'position')

    linstepA = cmds.createNode('setRange', n='setRangeA_%s' % jt)
    cmds.setAttr('%s.minX' % linstepA, 1)
    cmds.connectAttr('%s.parameter' % jt, '%s.valueX' % linstepA)
    cmds.connectAttr('%s.maxPos' % vks, '%s.oldMaxX' % linstepA)
    cmds.connectAttr('%s.output' % ucn_p, '%s.oldMinX' % linstepA)

    linstepB = cmds.createNode('setRange', n='setRangeB_%s' % jt)
    cmds.setAttr('%s.maxX' % linstepB, 1)
    cmds.connectAttr('%s.parameter' % jt, '%s.valueX' % linstepB)
    cmds.connectAttr('%s.minPos' % vks, '%s.oldMinX' % linstepB)
    cmds.connectAttr('%s.output' % ucn_p, '%s.oldMaxX' % linstepB)

    cond = cmds.createNode('condition', n='condition_%s' % jt)
    cmds.setAttr('%s.operation' % cond, 2)
    cmds.connectAttr('%s.parameter' % jt, '%s.firstTerm' % cond)
    cmds.connectAttr('%s.output' % ucn_p, '%s.secondTerm' % cond)
    cmds.connectAttr('%s.outValueX' % linstepA, '%s.colorIfTrueR' % cond)
    cmds.connectAttr('%s.outValueX' % linstepB, '%s.colorIfFalseR' % cond)

    mtp_r = cmds.createNode('multiplyDivide', n='multiplyRotate_%s' % jt)
    cmds.connectAttr('%s.rotate' % vks, '%s.input1' % mtp_r)
    cmds.connectAttr('%s.outColorR' % cond, '%s.input2X' % mtp_r)
    cmds.connectAttr('%s.outColorR' % cond, '%s.input2Y' % mtp_r)
    cmds.connectAttr('%s.outColorR' % cond, '%s.input2Z' % mtp_r)
    cmds.connectAttr('%s.output' % mtp_r, '%s.rotate' % jgroup)
Exemplo n.º 5
0
def VK_system(num_ctr=1, num_jt=20, fk=True):
    """
    final assembly of the entire system
    """
    fk_hide_attr = lambda node, b: [cmds.setAttr('%s.%s' % (node, a), l=b, k=not b) for a in 'tx,ty,tz,sx,sy,sz,v'.split(',')]
    ik_hide_attr = lambda node, b: [cmds.setAttr('%s.%s' % (node, a), l=b, k=not b) for a in 'tx,ty,tz,ry,rz,sx,sy,sz,v'.split(',')]
    ctrl_hide_attr = lambda node, b: [cmds.setAttr('%s.%s' % (node, a), l=b, k=not b) for a in 'rx,ry,rz,sx,sy,sz,v'.split(',')]

    orig_cu = setup.get_curve()[0]
    cu = cmds.duplicate(orig_cu, n='vks_curve#')[0]
    jts = setup.chain(cu, num_jt, 'vks_orig_joint')
    d_jts = setup.chain(cu, num_jt, 'vks_skin_joint')
    cmds.toggle(d_jts, localAxis=True)
    parameter_attr(jts)
    # loft,skin
    surf = create_loft(jts, 'vks_lofted_mesh')
    surf_s = cmds.listRelatives(surf, c=1)[0]
    # hierarchical groups
    vks_grp = cmds.group(surf, name='VariableKinematicsSystem#')
    mov_grp = cmds.group(em=True, parent=vks_grp, name='vks_move_grp#')
    rig_grp = cmds.group(em=True, parent=vks_grp, name='vks_rig_grp#')
    flc_grp = cmds.group(em=True, parent=rig_grp, name='vks_follice_grp#')
    setup.lock_attr(flc_grp, 1)
    setup.off_vis(rig_grp)

    # create vks controls
    vks_ctr = []
    vks_ctr_grp = []
    for i in range(num_ctr):
        # create follice
        vPos = setup.linstep(0., num_ctr - 1, i)
        flc = setup.create_follicle(surf_s, 0.5, vPos, 'vks_follice')
        flc_tr = cmds.listRelatives(flc, p=1)[0]
        cmds.parent(flc_tr, flc_grp)
        # create control
        vkss = create_control(flc, 'vks_parametric')
        vks_ctr_grp.append(vkss[0])
        vks_ctr.append(vkss[-1])
    # ikspline
    ikhnd = cmds.ikHandle(sj=jts[0], ee=jts[-1], c=cu, ccv=False, sol='ikSplineSolver')
    # create joint orig group
    org_grp = cmds.group(jts[0], parent=rig_grp, n='vks_orig_grp#')
    rot = cmds.xform(jts[0], q=True, ws=True, ro=True)
    cmds.xform(org_grp, ws=True, ro=(rot[0], rot[1], rot[2]), piv=(0, 0, 0))
    cmds.parent(cu, ikhnd[0], rig_grp)

    # building explicit control
    m_ctr = setup.ctrl_cube('vks_explicit#', sz=2)
    cmds.parent(m_ctr, vks_grp)
    tr = cmds.xform(jts[0], q=True, ws=True, t=True)
    cmds.xform(m_ctr, ws=True, t=tr)
    cmds.makeIdentity(m_ctr, apply=1, t=1, r=1, s=1, n=0)
    cmds.parent(vks_ctr_grp, m_ctr)

    cmds.parentConstraint(m_ctr, org_grp, mo=1)
    cmds.parentConstraint(m_ctr, mov_grp, mo=1)
    cmds.scaleConstraint(m_ctr, mov_grp)

    if fk:  # FK module
        for c in vks_ctr:
            fk_hide_attr(c, 1)
            for j in jts:
                jgroup = cmds.group(j, n='%s_%s' % (j, c))
                piv = cmds.xform(j, q=True, ws=True, piv=True)
                cmds.xform(jgroup, ws=True, piv=(piv[0], piv[1], piv[2]))
                connection(c, j, jgroup)

        for n, j in enumerate(jts):
            cmds.parentConstraint(j, d_jts[n])
        # fk length
        cmds.addAttr(m_ctr, ln='length', at='double', k=1, min=0, max=10, dv=1)
        v_tx = cmds.getAttr('%s.tx' % jts[1])
        pma = cmds.createNode('plusMinusAverage', n='vfk_lengthConversion_%s' % m_ctr)
        cmds.setAttr("%s.input1D[0]" % pma, -1)
        cmds.setAttr("%s.input1D[1]" % pma, v_tx)
        cmds.connectAttr('%s.length' % m_ctr, '%s.input1D[2]' % pma)
        for j in jts[1:-1]:
            cmds.connectAttr('%s.output1D' % pma, '%s.tx' % j)

        cmds.scaleConstraint(m_ctr, org_grp)
        cmds.parent(d_jts[0], mov_grp)
        cmds.delete(ikhnd)
    if not fk:  # IK module
        jj = [j for j in jts]
        for c in vks_ctr:
            ik_hide_attr(c, 1)
            for n, j in enumerate(jts):
                jgroup = cmds.group(em=True, n='%s_%s' % (j, c), parent=jj[n])
                jj[n] = jgroup
                connection(c, j, jgroup)
        for n in range(num_jt):
            cmds.parentConstraint(jj[n], d_jts[n])
        # ik stretch
        cu_sc = ik_stretch(ikhnd[0])
        cmds.addAttr(m_ctr, ln="stretch", at='double', k=1, min=0, max=10, dv=10)
        ucn = setup.onetenthNode(m_ctr, 'stretch')
        cmds.connectAttr('%s.output' % ucn, '%s.ik_stretch' % ikhnd[0])

        cls_grp = cmds.group(em=True, name='vks_cluster_grp#')
        setup.off_vis(cls_grp)
        ik_cls = cluster_on_curve(cu)
        for ik_cl in ik_cls:
            l_ctrl, l_null = setup.local_cluster_control2(ik_cl)
            ctrl_hide_attr(l_ctrl, 1)
            cmds.parent(l_ctrl, m_ctr)
            cmds.parent(ik_cl, l_null, cls_grp)
        cmds.parent(d_jts[0], cls_grp, cu_sc, mov_grp)

    cmds.select(cl=True)
Exemplo n.º 6
0
def VK_system(num_ctr=1, num_jt=20, fk=True):
    """
    final assembly of the entire system
    """
    fk_hide_attr = lambda node, b: [
        cmds.setAttr('%s.%s' % (node, a), l=b, k=not b)
        for a in 'tx,ty,tz,sx,sy,sz,v'.split(',')
    ]
    ik_hide_attr = lambda node, b: [
        cmds.setAttr('%s.%s' % (node, a), l=b, k=not b)
        for a in 'tx,ty,tz,ry,rz,sx,sy,sz,v'.split(',')
    ]
    ctrl_hide_attr = lambda node, b: [
        cmds.setAttr('%s.%s' % (node, a), l=b, k=not b)
        for a in 'rx,ry,rz,sx,sy,sz,v'.split(',')
    ]

    orig_cu = setup.get_curve()[0]
    cu = cmds.duplicate(orig_cu, n='vks_curve#')[0]
    jts = setup.chain(cu, num_jt, 'vks_orig_joint')
    d_jts = setup.chain(cu, num_jt, 'vks_skin_joint')
    cmds.toggle(d_jts, localAxis=True)
    parameter_attr(jts)
    # loft,skin
    surf = create_loft(jts, 'vks_lofted_mesh')
    surf_s = cmds.listRelatives(surf, c=1)[0]
    # hierarchical groups
    vks_grp = cmds.group(surf, name='VariableKinematicsSystem#')
    mov_grp = cmds.group(em=True, parent=vks_grp, name='vks_move_grp#')
    rig_grp = cmds.group(em=True, parent=vks_grp, name='vks_rig_grp#')
    flc_grp = cmds.group(em=True, parent=rig_grp, name='vks_follice_grp#')
    setup.lock_attr(flc_grp, 1)
    setup.off_vis(rig_grp)

    # create vks controls
    vks_ctr = []
    vks_ctr_grp = []
    for i in range(num_ctr):
        # create follice
        vPos = setup.linstep(0., num_ctr - 1, i)
        flc = setup.create_follicle(surf_s, 0.5, vPos, 'vks_follice')
        flc_tr = cmds.listRelatives(flc, p=1)[0]
        cmds.parent(flc_tr, flc_grp)
        # create control
        vkss = create_control(flc, 'vks_parametric')
        vks_ctr_grp.append(vkss[0])
        vks_ctr.append(vkss[-1])
    # ikspline
    ikhnd = cmds.ikHandle(sj=jts[0],
                          ee=jts[-1],
                          c=cu,
                          ccv=False,
                          sol='ikSplineSolver')
    # create joint orig group
    org_grp = cmds.group(jts[0], parent=rig_grp, n='vks_orig_grp#')
    rot = cmds.xform(jts[0], q=True, ws=True, ro=True)
    cmds.xform(org_grp, ws=True, ro=(rot[0], rot[1], rot[2]), piv=(0, 0, 0))
    cmds.parent(cu, ikhnd[0], rig_grp)

    # building explicit control
    m_ctr = setup.ctrl_cube('vks_explicit#', sz=2)
    cmds.parent(m_ctr, vks_grp)
    tr = cmds.xform(jts[0], q=True, ws=True, t=True)
    cmds.xform(m_ctr, ws=True, t=tr)
    cmds.makeIdentity(m_ctr, apply=1, t=1, r=1, s=1, n=0)
    cmds.parent(vks_ctr_grp, m_ctr)

    cmds.parentConstraint(m_ctr, org_grp, mo=1)
    cmds.parentConstraint(m_ctr, mov_grp, mo=1)
    cmds.scaleConstraint(m_ctr, mov_grp)

    if fk:  # FK module
        for c in vks_ctr:
            fk_hide_attr(c, 1)
            for j in jts:
                jgroup = cmds.group(j, n='%s_%s' % (j, c))
                piv = cmds.xform(j, q=True, ws=True, piv=True)
                cmds.xform(jgroup, ws=True, piv=(piv[0], piv[1], piv[2]))
                connection(c, j, jgroup)

        for n, j in enumerate(jts):
            cmds.parentConstraint(j, d_jts[n])
        # fk length
        cmds.addAttr(m_ctr, ln='length', at='double', k=1, min=0, max=10, dv=1)
        v_tx = cmds.getAttr('%s.tx' % jts[1])
        pma = cmds.createNode('plusMinusAverage',
                              n='vfk_lengthConversion_%s' % m_ctr)
        cmds.setAttr("%s.input1D[0]" % pma, -1)
        cmds.setAttr("%s.input1D[1]" % pma, v_tx)
        cmds.connectAttr('%s.length' % m_ctr, '%s.input1D[2]' % pma)
        for j in jts[1:-1]:
            cmds.connectAttr('%s.output1D' % pma, '%s.tx' % j)

        cmds.scaleConstraint(m_ctr, org_grp)
        cmds.parent(d_jts[0], mov_grp)
        cmds.delete(ikhnd)
    if not fk:  # IK module
        jj = [j for j in jts]
        for c in vks_ctr:
            ik_hide_attr(c, 1)
            for n, j in enumerate(jts):
                jgroup = cmds.group(em=True, n='%s_%s' % (j, c), parent=jj[n])
                jj[n] = jgroup
                connection(c, j, jgroup)
        for n in range(num_jt):
            cmds.parentConstraint(jj[n], d_jts[n])
        # ik stretch
        cu_sc = ik_stretch(ikhnd[0])
        cmds.addAttr(m_ctr,
                     ln="stretch",
                     at='double',
                     k=1,
                     min=0,
                     max=10,
                     dv=10)
        ucn = setup.onetenthNode(m_ctr, 'stretch')
        cmds.connectAttr('%s.output' % ucn, '%s.ik_stretch' % ikhnd[0])

        cls_grp = cmds.group(em=True, name='vks_cluster_grp#')
        setup.off_vis(cls_grp)
        ik_cls = cluster_on_curve(cu)
        for ik_cl in ik_cls:
            l_ctrl, l_null = setup.local_cluster_control2(ik_cl)
            ctrl_hide_attr(l_ctrl, 1)
            cmds.parent(l_ctrl, m_ctr)
            cmds.parent(ik_cl, l_null, cls_grp)
        cmds.parent(d_jts[0], cls_grp, cu_sc, mov_grp)

    cmds.select(cl=True)