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
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)
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)
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)