Advertisement
Jenks

AutoRig_1

May 10th, 2017
26
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 51.00 KB | None | 0 0
  1. import maya.OpenMayaUI as omUi
  2. import maya.cmds as cmds
  3. from functools import partial
  4. import re
  5.  
  6. from shapes import zGlobalControl as crv1
  7. from shapes import zSettingsCog as crv2
  8. from shapes import zCircle as crv3
  9. from shapes import zTriCross as crv4
  10. from shapes import zGlobe as crv5
  11. from shapes import zCrossedCircle as crv6
  12. from shapes import zEyes as crv7
  13. from shapes import zFoot as crv8
  14. from shapes import zPringle as crv9
  15. from shapes import zArrow as crv10
  16. from shapes import zCube as crv11
  17. from shapes import zDualArrow as crv12
  18. from shapes import zFatCross as crv13
  19. from shapes import zFlatPringle as crv14
  20. from shapes import zHand as crv15
  21. from shapes import zLips as crv16
  22. from shapes import zQuadArrow as crv17
  23. from shapes import zThinCross as crv18
  24. from shapes import zMattJenkins as crv19
  25. from shapes import zPin as crv22
  26. from shapes import zGlobe_single as crv23
  27.  
  28. def createGlobalCtrl(prefix):
  29.     ctrlCrv=prefix+'_global'
  30.     globalCtrlName=ctrlCrv+'_CTRL'
  31.     if not cmds.objExists(prefix+'_geometry_GRP'):
  32.         cmds.group(em=True,n=prefix+'_geometry_GRP')
  33.     if not cmds.objExists(prefix+'_controls_GRP'):
  34.         cmds.group(em=True,n=prefix+'_controls_GRP')
  35.     if not cmds.objExists(prefix+'_skeleton_GRP'):
  36.         cmds.group(em=True,n=prefix+'_skeleton_GRP')
  37.     if not cmds.objExists(prefix+'_mechanics_GRP'):
  38.         cmds.group(em=True,n=prefix+'_mechanics_GRP')
  39.     if not cmds.objExists(ctrlCrv+'Ctrl_ROOT'):
  40.         createCtrlShape(ctrlCrv,1,col=31)
  41.         worldLoc=cmds.spaceLocator(n=prefix+'_world_LOC')
  42.         createBuffer(ctrlCrv,1,1,worldLoc)
  43.  
  44.     existingAttr=cmds.listAttr(globalCtrlName)
  45.     newAttr=["visSep","visGeo","visCtrls","visSkel","visMech","mdSep","mdGeo","mdSkel","sep1","credits"]
  46.  
  47.     ## create attributes
  48.     if newAttr[0] not in existingAttr:
  49.         cmds.addAttr(globalCtrlName, ln="visSep",nn="___   Visibilities", at="enum", en="___:", k=True)
  50.     if newAttr[1] not in existingAttr:
  51.         cmds.addAttr(globalCtrlName, ln="visGeo",nn="Geometry", at="enum", en="Hide:Show", k=True, dv=1)
  52.     if newAttr[2] not in existingAttr:
  53.         cmds.addAttr(globalCtrlName, ln="visCtrls",nn="Controls", at="enum", en="Hide:Show", k=True, dv=1)
  54.     if newAttr[3] not in existingAttr:
  55.         cmds.addAttr(globalCtrlName, ln="visSkel",nn="Skeleton", at="enum", en="Hide:Show", k=True, dv=1)
  56.     if newAttr[4] not in existingAttr:
  57.         cmds.addAttr(globalCtrlName, ln="visMech",nn="Mechanics", at="enum", en="Hide:Show", k=True)
  58.     if newAttr[5] not in existingAttr:
  59.         cmds.addAttr(globalCtrlName, ln="mdSep",nn="___   Display Mode", at="enum", en="___:", k=True)
  60.     if newAttr[6] not in existingAttr:
  61.         cmds.addAttr(globalCtrlName, ln="mdGeo",nn="Geometry", at="enum", en="Normal:Template:Reference", k=True, dv=2)
  62.     if newAttr[7] not in existingAttr:
  63.         cmds.addAttr(globalCtrlName, ln="mdSkel",nn="Skeleton", at="enum", en="Normal:Template:Reference", k=True)
  64.     if newAttr[8] not in existingAttr:
  65.         cmds.addAttr(globalCtrlName, ln="sep1",nn="___   ",at="enum",en="___", k=True)
  66.     if newAttr[9] not in existingAttr:
  67.         cmds.addAttr(globalCtrlName, ln="credits",nn="Rig by Matt Jenkins",at="enum",en="___", k=True)
  68.  
  69.     ## connect attributes
  70.     if cmds.listConnections(globalCtrlName+".visGeo") == None:
  71.         cmds.connectAttr(globalCtrlName+".visGeo",prefix+"_geometry_GRP.visibility")
  72.     if cmds.listConnections(globalCtrlName+".visCtrls") == None:
  73.         cmds.connectAttr(globalCtrlName+".visCtrls",prefix+"_controls_GRP.visibility")
  74.     if cmds.listConnections(globalCtrlName+".visSkel") == None:
  75.         cmds.connectAttr(globalCtrlName+".visSkel",prefix+"_skeleton_GRP.visibility")
  76.     if cmds.listConnections(globalCtrlName+".visMech") == None:
  77.         cmds.connectAttr(globalCtrlName+".visMech",prefix+"_mechanics_GRP.visibility")
  78.     cmds.setAttr(prefix+"_geometry_GRP.overrideEnabled",1)
  79.     if cmds.listConnections(globalCtrlName+".mdGeo") == None:
  80.         cmds.connectAttr(globalCtrlName+".mdGeo",prefix+"_geometry_GRP.overrideDisplayType")
  81.     cmds.setAttr(prefix+"_skeleton_GRP.overrideEnabled",1)
  82.     if cmds.listConnections(globalCtrlName+".mdSkel") == None:
  83.         cmds.connectAttr(globalCtrlName+".mdSkel",prefix+"_skeleton_GRP.overrideDisplayType")
  84.  
  85.     if not cmds.objExists(prefix+'__RIG_GRP'):
  86.         cmds.group(em=True,n=prefix+'__RIG_GRP')
  87.     cmds.parent(prefix+'_world_LOC',prefix+'_geometry_GRP',prefix+'_globalCtrl_ROOT',prefix+'__RIG_GRP')
  88.     cmds.parent(prefix+'_controls_GRP',prefix+'_skeleton_GRP',prefix+'_mechanics_GRP',prefix+'_globalConst_GRP')
  89.  
  90. def createLegLocs(prefix,side,mirror=False,mirroredSide='R'):
  91.     name=str(prefix)+'_'+str(side)+'_'
  92.     suff='_posLOC'
  93.  
  94.     ## create Locs
  95.     legLocs=[
  96.         ('hip',0,6,0),
  97.         ('knee',0,3.5,0.2),
  98.         ('ankle',0,1,0),
  99.         ('footHeel',0,0,0),
  100.         ('footBall',0,0,1),
  101.         ('footToes',0,0,2)
  102.     ]
  103.     if cmds.objExists(name+'wholeLeg'+suff) and not mirror:
  104.         for i,x in enumerate(legLocs):
  105.             pos=cmds.xform(name+x[0]+suff,q=True,t=True,ws=True)
  106.             legLocs[i]=(x[0],pos[0],pos[1],pos[2])
  107.         cmds.delete(name+'wholeLeg'+suff)
  108.     elif not cmds.objExists(name+'wholeLeg'+suff):
  109.         mirror=False
  110.  
  111.     if mirror:
  112.         name=str(prefix)+'_'+str(mirroredSide)+'_'
  113.         if cmds.objExists(name+'wholeLeg'+suff):
  114.             cmds.delete(name+'wholeLeg'+suff)
  115.         legLocs=mirrorLocs(legLocs,prefix,side,mirroredSide,suff)
  116.         side=mirroredSide
  117.     else:
  118.         legLocs=createLocs(legLocs,name,suff)
  119.     hipLocPos=cmds.xform(name+'hip'+suff,q=True,t=True,ws=True)
  120.     legName=createParCrv('wholeLeg',legLocs,name,suff,hipLocPos,[1,0,0])
  121.     createPvVis('hip','knee','ankle','legPvVis',name,suff,legName, [3,0,0])
  122.     createIkfkVis('legIKFKVis','ankle',name,suff,side,[0.5,0.25,-0.5])
  123.  
  124.     ## final stuff before returning
  125.     legLocs.remove(name+'footHeel'+suff)
  126.     cmds.select(cl=True)
  127.     return legLocs
  128.  
  129. def createLegSkelMech(locs,prefix,side):
  130.     name=prefix+'_'+side+'_'
  131.     if side == 'L':
  132.         col=16
  133.         altCol=29
  134.         thirdCol=30
  135.     else:
  136.         col=13
  137.         altCol=25
  138.         thirdCol=22
  139.     jnts=createJnts(locs,side=side)
  140.     if cmds.objExists(prefix+'_spine_base_JNT'):
  141.         cmds.parent(name+'hip_JNT',prefix+'_spine_base_JNT')
  142.     createFKIK(jnts,'leg',prefix,side,name+'ankle_JNT')
  143.  
  144.     ## create leg mech
  145.     legIK=createIK(name+'legIK',name+'hip_IK_JNT',name+'ankle_IK_JNT')
  146.     if cmds.objExists(name+'legPVCtrl_ROOT'):
  147.         cmds.delete(name+'legPVCtrl_ROOT')
  148.  
  149.     ## create pv ctrl
  150.     createCtrlShape(name+'legPV',4,scale=[0.3,0.3,0.3],col=col)
  151.     createBuffer(name+'legPV',1,1,name+'legPvVis_posLOC')
  152.     cmds.poleVectorConstraint(name+'legPVConst_GRP',legIK[1])
  153.  
  154.     ## create foot mech
  155.     if cmds.objExists(name+'RF_mech_GRP'):
  156.         cmds.delete(name+'RF_mech_GRP')
  157.     createIK(name+'footBallIK',name+'ankle_IK_JNT',name+'footBall_IK_JNT')
  158.     createIK(name+'footToesIK',name+'footBall_IK_JNT',name+'footToes_IK_JNT')
  159.     rfJnts=createJnts([name+'footHeel_posLOC',name+'footToes_posLOC',name+'footBall_posLOC',name+'ankle_posLOC'],'_RF')
  160.     rfToes=createIK(name+'RF_footToesIK',name+'RF_footHeel_JNT',name+'RF_footToes_JNT')
  161.     rfBall=createIK(name+'RF_footBallIK',name+'RF_footToes_JNT',name+'RF_footBall_JNT')
  162.     rfAnkle=createIK(name+'RF_ankleIK',name+'RF_footBall_JNT',name+'RF_ankle_JNT')
  163.     cmds.parentConstraint(rfJnts[-1],name+'legIK_GRP',mo=True)
  164.     cmds.parentConstraint(rfJnts[-2],name+'footBallIK_GRP',mo=True)
  165.     cmds.parentConstraint(rfJnts[-3],name+'footToesIK_GRP',mo=True)
  166.     cmds.group(rfJnts[0],rfToes[0],rfBall[0],rfAnkle[0],n=name+'RF_mech_GRP')
  167.     footBallPos=cmds.xform(rfJnts[-2],q=True,t=True,ws=True)
  168.     cmds.xform(name+'RF_mech_GRP', piv=footBallPos)
  169.     cmds.group(name+'legIK_GRP',name+'footBallIK_GRP',name+'footToesIK_GRP',name+'RF_mech_GRP',n=name+'footMech_GRP')
  170.     footBallJntPos=cmds.xform(name+'footBall_IK_JNT',q=True,t=True,ws=True)
  171.     cmds.xform(name+'footMech_GRP',piv=footBallJntPos)
  172.     ## create leg IK ctrls
  173.     ##- foot Toes
  174.     createCtrlShape(name+'footToesIK', 9,col=altCol,scale=[0.7,0.35,0.35],rotOffset=[75,15,0],transOffset=[0,0.35,0],side=side)
  175.     createBuffer(name+'footToesIK', 1, 1, name+'footToes_posLOC')
  176.     footBallLoc=cmds.xform(name+'footBall_posLOC',q=True,ws=True,t=True)
  177.     cmds.xform(name+'footToesIK_CTRL',piv=footBallLoc)
  178.     cmds.parentConstraint(name+'footToesIKConst_GRP',name+'RF_footToesIK_GRP',mo=True)
  179.     ##- foot Ball
  180.     createCtrlShape(name+'footBallIK', 9,col=altCol,scale=[0.7,0.5,0.5],transOffset=[0,1,0])
  181.     createBuffer(name+'footBallIK', 1, 1, name+'footBall_posLOC')
  182.     cmds.parentConstraint(name+'footBallIKConst_GRP',name+'RF_footBallIK_GRP',mo=True)
  183.     cmds.parentConstraint(name+'footBallIKConst_GRP',name+'RF_ankleIK_GRP',mo=True)
  184.     ##- foot Heel
  185.     createCtrlShape(name+'footHeelIK', 9,col=altCol,scale=[0.5,0.5,0.5],rotOffset=[-120,0,0])
  186.     createBuffer(name+'footHeelIK', 1, 1, name+'footHeel_posLOC')
  187.     cmds.parentConstraint(name+'footHeelIKConst_GRP',name+'RF_footHeel_JNT',mo=True)
  188.     cmds.parent(name+'footBallIKCtrl_ROOT',name+'footHeelIKConst_GRP')
  189.     cmds.parent(name+'footToesIKCtrl_ROOT',name+'footHeelIKConst_GRP')
  190.     ##- foot
  191.     createCtrlShape(name+'footIK', 8,scale=[1.5,1.5,1.5],col=col,transOffset=[0,0,-0.25])
  192.     createBuffer(name+'footIK', 1, 1, name+'footBall_posLOC')
  193.     cmds.parentConstraint(name+'footIKConst_GRP',name+'legIK_GRP',mo=True)
  194.     cmds.parent(name+'footHeelIKCtrl_ROOT',name+'footIKConst_GRP')
  195.     ## create leg FK ctrls
  196.     createCtrlShape(name+'hipFK', 3,col=col,scale=[0.5,0.5,0.5],rotOffset=[0,0,90])
  197.     createBuffer(name+'hipFK', 1, 1, name+'hip_FK_JNT')
  198.     cmds.orientConstraint(name+'hipFKConst_GRP',name+'hip_FK_JNT',mo=True)
  199.     createCtrlShape(name+'kneeFK', 3,col=altCol,scale=[0.5,0.5,0.5],rotOffset=[0,0,90],transOffset=[0,0,0.7])
  200.     createBuffer(name+'kneeFK', 1, 1, name+'knee_FK_JNT')
  201.     cmds.orientConstraint(name+'kneeFKConst_GRP',name+'knee_FK_JNT',mo=True)
  202.     createCtrlShape(name+'ankleFK', 3,col=col,scale=[0.4,0.4,0.4],rotOffset=[0,0,90])
  203.     createBuffer(name+'ankleFK', 1, 1, name+'ankle_FK_JNT')
  204.     cmds.orientConstraint(name+'ankleFKConst_GRP',name+'ankle_FK_JNT',mo=True)
  205.     createCtrlShape(name+'footBallFK', 3,col=altCol,scale=[0.3,0.3,0.3],rotOffset=[0,0,90])
  206.     createBuffer(name+'footBallFK', 1, 1, name+'footBall_FK_JNT')
  207.     cmds.orientConstraint(name+'footBallFKConst_GRP',name+'footBall_FK_JNT',mo=True)
  208.     cmds.parent(name+'footBallFKCtrl_ROOT',name+'ankleFKConst_GRP')
  209.     cmds.parent(name+'ankleFKCtrl_ROOT',name+'kneeFKConst_GRP')
  210.     cmds.parent(name+'kneeFKCtrl_ROOT',name+'hipFKConst_GRP')
  211.     ## organise shit
  212.     if cmds.objExists(name+'legMech_GRP'):
  213.         cmds.delete(name+'legMech_GRP')
  214.     cmds.group(name+'hip_IK_JNT',name+'hip_FK_JNT',n=name+'legFKIKSkel_GRP')
  215.     if cmds.objExists(prefix+'_spine_base_JNT'):
  216.        cmds.parentConstraint(prefix+'_spine_base_JNT',name+'legFKIKSkel_GRP',mo=True)
  217.     cmds.group(name+'legFKIKSkel_GRP',name+'footMech_GRP',n=name+'legMech_GRP')
  218.     hipJntPos=cmds.xform(name+'hip_IK_JNT',q=True,t=True,ws=True)
  219.     cmds.xform(name+'legMech_GRP',piv=hipJntPos)
  220.     cmds.group(name+'legPVCtrl_ROOT',name+'footIKCtrl_ROOT', n=name+'legIKCtrls_GRP')
  221.     cmds.group(name+'hipFKCtrl_ROOT',n=name+'legFKCtrls_GRP')
  222.     cmds.group(name+'legSettingsCtrl_ROOT',name+'legIKCtrls_GRP',name+'legFKCtrls_GRP',n=name+'legCtrls_GRP')
  223.     ## IKFK ctrl visibilities
  224.     cmds.setDrivenKeyframe(name+'legFKCtrls_GRP', at='visibility',cd=name+'legSettings_CTRL.IKFKSwitch',dv=0.001,v=1)
  225.     cmds.setDrivenKeyframe(name+'legFKCtrls_GRP', at='visibility',cd=name+'legSettings_CTRL.IKFKSwitch',dv=0,v=0)
  226.     cmds.setDrivenKeyframe(name+'legIKCtrls_GRP', at='visibility',cd=name+'legSettings_CTRL.IKFKSwitch',dv=0.999,v=1)
  227.     cmds.setDrivenKeyframe(name+'legIKCtrls_GRP', at='visibility',cd=name+'legSettings_CTRL.IKFKSwitch',dv=1,v=0)
  228.     ## parent to overall rig stuffs
  229.     if cmds.objExists(prefix+'_controls_GRP'):
  230.         cmds.parent(name+'legCtrls_GRP',prefix+'_controls_GRP')
  231.     if cmds.objExists(prefix+'_mechanics_GRP'):
  232.         cmds.parent(name+'legMech_GRP',prefix+'_mechanics_GRP')
  233.     # if cmds.objExists(prefix+'_spine_base_JNT'):
  234.     #     cmds.parent(name+'hip_result_JNT',prefix+'_spine_base_JNT')
  235.     # elif cmds.objExists(prefix+'_skeleton_GRP'):
  236.     #     cmds.parent(name+'hip_result_JNT',prefix+'_skeleton_GRP')
  237.     cmds.select(cl=True)
  238.  
  239. def createArmLocs(prefix,side,mirror=False,mirrorSide='R'):
  240.     name=str(prefix)+'_'+str(side)+'_'
  241.     suff='_posLOC'
  242.  
  243.     ## create Locs
  244.     if side=='L' or 'L_' in side or '_L' in side:
  245.         armLocs=[
  246.             ('clav',0.5,14,0),
  247.             ('shoulder',2,14,-0.5),
  248.             ('elbow',4.5,14,-0.7),
  249.             ('wrist',7,14,-0.5),
  250.             ('handPalm',8,14,-0.5)
  251.         ]
  252.     else:
  253.         armLocs=[
  254.             ('clav',-0.5,14,0),
  255.             ('shoulder',-2,14,-0.5),
  256.             ('elbow',-4.5,14,-0.7),
  257.             ('wrist',-7,14,-0.5),
  258.             ('handPalm',-8,14,-0.5)
  259.         ]
  260.     if cmds.objExists(name+'wholeArm'+suff) and not mirror:
  261.         for i,x in enumerate(armLocs):
  262.             pos=cmds.xform(name+x[0]+suff,q=True,t=True,ws=True)
  263.             armLocs[i]=(x[0],pos[0],pos[1],pos[2])
  264.         cmds.delete(name+'wholeArm'+suff)
  265.     elif not cmds.objExists(name+'wholeArm'+suff):
  266.         mirror=False
  267.  
  268.     if mirror:
  269.         name=str(prefix)+'_'+str(mirrorSide)+'_'
  270.         if cmds.objExists(name+'wholeArm'+suff):
  271.             cmds.delete(name+'wholeArm'+suff)
  272.         armLocs=mirrorLocs(armLocs,prefix,side,mirrorSide,suff)
  273.     else:
  274.         armLocs=createLocs(armLocs,name,suff)
  275.     shoulderLocPos=cmds.xform(name+'shoulder'+suff,q=True,t=True,ws=True)
  276.     armName=createParCrv('wholeArm',armLocs,name,suff,shoulderLocPos,[0,0,1])
  277.     createPvVis('shoulder','elbow','wrist','armPvVis',name,suff,armName, [3,0,0])
  278.     createIkfkVis('armIKFKVis','wrist',name,suff,side,[0.5,0.25,-0.5])
  279.  
  280.     ## final stuff before returning
  281.     cmds.select(cl=True)
  282.     return armLocs
  283.  
  284. def createArmSkelMech(locs,prefix,side,spineArmJnt=None):
  285.     name=prefix+'_'+side+'_'
  286.     if side == 'L':
  287.         col=16
  288.         altCol=29
  289.         thirdCol=30
  290.     else:
  291.         col=13
  292.         altCol=25
  293.         thirdCol=22
  294.     jntLocs=locs
  295.     jntLocs.remove(name+'clav_posLOC')
  296.     jnts=createJnts(jntLocs,side=side)
  297.     clavJnt=createJnts([name+'clav_posLOC'])
  298.     cmds.parent(name+'shoulder_JNT',name+'clav_JNT')
  299.     doOrientJoint(clavJnt, [1,0,0], [0,1,0], [0,1,0], 1)
  300.     createFKIK(jnts,'arm',prefix,side,name+'wrist_JNT')
  301.     ## create arm mech
  302.     armIK=createIK(name+'armIK',name+'shoulder_IK_JNT',name+'wrist_IK_JNT')
  303.     if cmds.objExists(name+'armPVCtrl_ROOT'):
  304.         cmds.delete(name+'armPVCtrl_ROOT')
  305.     createCtrlShape(name+'armPV',4,scale=[0.3,0.3,0.3],col=col)
  306.     createBuffer(name+'armPV',1,1,name+'armPvVis_posLOC')
  307.     cmds.poleVectorConstraint(name+'armPVConst_GRP',armIK[1])
  308.     handPalmIK=createIK(name+'handPalmIK', name+'wrist_IK_JNT',name+'handPalm_IK_JNT')
  309.     cmds.group(name+'handPalmIK_GRP',name+'armIK_GRP',n=name+'handMech_GRP')
  310.     wristJntPos=cmds.xform(name+'wrist_IK_JNT',q=True,t=True,ws=True)
  311.     cmds.xform(name+'handMech_GRP',piv=wristJntPos)
  312.     cmds.duplicate(name+'shoulder_result_JNT',po=True,n=name+'shoulder_end_JNT')
  313.     clavIK=createIK(name+'clavIK', name+'clav_JNT', name+'shoulder_end_JNT')
  314.     ##- create forearm twist
  315.     fArmTwist1=cmds.duplicate(name+'elbow_result_JNT',po=True,n=name+'foreArmTwist01_JNT')
  316.     fArmTwist2=cmds.duplicate(name+'elbow_result_JNT',po=True,n=name+'foreArmTwist02_JNT')
  317.     cmds.parent(fArmTwist1,name+'elbow_result_JNT')
  318.     cmds.parent(fArmTwist2,fArmTwist1)
  319.     cmds.pointConstraint(name+'elbow_result_JNT',fArmTwist1,w=0.666)
  320.     cmds.pointConstraint(name+'wrist_result_JNT',fArmTwist1,w=0.333)
  321.     cmds.pointConstraint(name+'elbow_result_JNT',fArmTwist2,w=0.333)
  322.     cmds.pointConstraint(name+'wrist_result_JNT',fArmTwist2,w=0.666)
  323.     cmds.orientConstraint(name+'elbow_result_JNT',fArmTwist1,w=0.666,sk=['y','z'])
  324.     cmds.orientConstraint(name+'wrist_result_JNT',fArmTwist1,w=0.333,sk=['y','z'])
  325.     cmds.orientConstraint(name+'elbow_result_JNT',fArmTwist2,w=0.333,sk=['y','z'])
  326.     cmds.orientConstraint(name+'wrist_result_JNT',fArmTwist2,w=0.666,sk=['y','z'])
  327.     ## create arm IK ctrls
  328.     ##- hand Palm
  329.     createCtrlShape(name+'handPalmIK', 9,col=altCol,scale=[0.7,0.7,0.7],rotOffset=[0,90,-45],side=side)
  330.     createBuffer(name+'handPalmIK', 1, 1, name+'handPalm_posLOC')
  331.     cmds.parentConstraint(name+'handPalmIKConst_GRP',name+'armIK_GRP',mo=True)
  332.     cmds.parentConstraint(name+'handPalmIKConst_GRP',name+'handPalmIK_GRP',mo=True)
  333.     ##- arm
  334.     createCtrlShape(name+'handIK', 11,scale=[0.5,0.5,0.5],col=col)
  335.     createBuffer(name+'handIK', 1, 1, name+'wrist_IK_JNT')
  336.     if not side == 'L':
  337.         armCtrlRot=cmds.xform(name+'handIKCtrl_PAR',q=True,ro=True)
  338.         armCtrlRot[0]=armCtrlRot[0]-180
  339.         cmds.xform(name+'handIKCtrl_PAR',ro=armCtrlRot)
  340.     cmds.parent(name+'handPalmIKCtrl_ROOT',name+'handIKConst_GRP')
  341.     ##- clav
  342.     createCtrlShape(name+'clav', 9,col=altCol,rotOffset=[0,90,-15],transOffset=[0,0.3,0],side=side)
  343.     createBuffer(name+'clav', 1, 1, clavIK[1])
  344.     cmds.parentConstraint(name+'clavConst_GRP',clavIK[0],mo=True)
  345.     if cmds.objExists(prefix+'_spineIK_end_LOC'):
  346.         cmds.parentConstraint(prefix+'_spineIK_end_LOC',name+'clavCtrl_ROOT',mo=True)
  347.     ## create arm FK ctrls
  348.     createCtrlShape(name+'shoulderFK', 3,col=col,scale=[0.4,0.4,0.4],rotOffset=[0,0,90])
  349.     createBuffer(name+'shoulderFK', 1, 1, name+'shoulder_FK_JNT')
  350.     cmds.orientConstraint(name+'shoulderFKConst_GRP',name+'shoulder_FK_JNT',mo=True)
  351.     createCtrlShape(name+'elbowFK', 3,col=altCol,scale=[0.3,0.3,0.3],rotOffset=[0,0,90],transOffset=[0,0,0.6])
  352.     createBuffer(name+'elbowFK', 1, 1, name+'elbow_FK_JNT')
  353.     cmds.orientConstraint(name+'elbowFKConst_GRP',name+'elbow_FK_JNT',mo=True)
  354.     createCtrlShape(name+'wristFK', 3,col=col,scale=[0.2,0.2,0.2],rotOffset=[0,0,90])
  355.     createBuffer(name+'wristFK', 1, 1, name+'wrist_FK_JNT')
  356.     cmds.orientConstraint(name+'wristFKConst_GRP',name+'wrist_FK_JNT',mo=True)
  357.     cmds.parent(name+'wristFKCtrl_ROOT',name+'elbowFKConst_GRP')
  358.     cmds.parent(name+'elbowFKCtrl_ROOT',name+'shoulderFKConst_GRP')
  359.     ## organise shit
  360.     if cmds.objExists(name+'armMech_GRP'):
  361.         cmds.delete(name+'armMech_GRP')
  362.     cmds.group(name+'shoulder_IK_JNT',name+'shoulder_FK_JNT',n=name+'armFKIKSkel_GRP')
  363.     cmds.parentConstraint(name+'clav_JNT',name+'armFKIKSkel_GRP',mo=True)
  364.     cmds.group(name+'armFKIKSkel_GRP',name+'handMech_GRP',name+'clavIK_GRP',n=name+'armMech_GRP')
  365.     cmds.group(name+'armPVCtrl_ROOT',name+'handIKCtrl_ROOT', n=name+'armIKCtrls_GRP')
  366.     cmds.group(name+'shoulderFKCtrl_ROOT',n=name+'armFKCtrls_GRP')
  367.     cmds.parentConstraint(name+'clav_JNT',name+'armFKCtrls_GRP',mo=True)
  368.     cmds.group(name+'armSettingsCtrl_ROOT',name+'armIKCtrls_GRP',name+'armFKCtrls_GRP',name+'clavCtrl_ROOT',n=name+'armCtrls_GRP')
  369.     ## IKFK ctrl visibilities
  370.     cmds.setDrivenKeyframe(name+'armFKCtrls_GRP', at='visibility',cd=name+'armSettings_CTRL.IKFKSwitch',dv=0.001,v=1)
  371.     cmds.setDrivenKeyframe(name+'armFKCtrls_GRP', at='visibility',cd=name+'armSettings_CTRL.IKFKSwitch',dv=0,v=0)
  372.     cmds.setDrivenKeyframe(name+'armIKCtrls_GRP', at='visibility',cd=name+'armSettings_CTRL.IKFKSwitch',dv=0.999,v=1)
  373.     cmds.setDrivenKeyframe(name+'armIKCtrls_GRP', at='visibility',cd=name+'armSettings_CTRL.IKFKSwitch',dv=1,v=0)
  374.     ## parent to overall rig stuffs
  375.     if cmds.objExists(prefix+'_controls_GRP'):
  376.         cmds.parent(name+'armCtrls_GRP',prefix+'_controls_GRP')
  377.     if cmds.objExists(prefix+'_mechanics_GRP'):
  378.         cmds.parent(name+'armMech_GRP',prefix+'_mechanics_GRP')
  379.     if cmds.objExists(prefix+'_spine_base_JNT') and spineArmJnt:
  380.         cmds.parent(name+'clav_JNT',prefix+'_spine_'+spineArmJnt+'_JNT')
  381.     elif cmds.objExists(prefix+'_skeleton_GRP'):
  382.         cmds.parent(name+'clav_JNT',prefix+'_skeleton_GRP')
  383.     cmds.select(cl=True)
  384.  
  385. def createSpineLocs(prefix):
  386.     name=str(prefix)+'_'
  387.     suff='_posLOC'
  388.     if cmds.objExists(name+'spine_posCRV'):
  389.         knots,cvPoints=_getCrv(name+'spine_posCRV')
  390.         cmds.delete(name+'spine_posCRV')
  391.         spineCrv=cmds.curve(n=name+'spine_posCRV',degree=3,knot=knots,point=cvPoints)
  392.     else:
  393.         spineCrv=cmds.curve(n=name+'spine_posCRV',degree = 3,\
  394.                 knot = [\
  395.                         0, 0, 0, 1, 2, 3, 4, 5, 5, 5\
  396.                 ],\
  397.                 point = [\
  398.                             (0.0, 9.70, -0.70),\
  399.                             (0.0, 10.00, -0.60),\
  400.                             (0.0, 10.80, -0.50),\
  401.                             (0.0, 11.60, -0.50),\
  402.                             (0.0, 12.30, -0.60),\
  403.                             (0.0, 13.50, -1.00),\
  404.                             (0.0, 14.30, -1.00),\
  405.                             (0.0, 14.70, -0.90)\
  406.                 ]\
  407.         )
  408.     headLocs=[
  409.         ('head',0,15.5,-0.6),
  410.         ('headEnd',0,17,-0.4)
  411.     ]
  412.     headAimPos=[0,16.25,10]
  413.     if cmds.objExists(name+'wholeHead'+suff):
  414.         headAimPos=cmds.xform(name+'headAim'+suff,q=True,ws=True,t=True)
  415.         for i,x in enumerate(headLocs):
  416.             pos=cmds.xform(name+x[0]+suff,q=True,t=True,ws=True)
  417.             headLocs[i]=(x[0],pos[0],pos[1],pos[2])
  418.         cmds.delete(name+'wholeHead'+suff)
  419.     headLocs=createLocs(headLocs, name, suff)
  420.     headLocPos=cmds.xform(name+'head'+suff,q=True,t=True,ws=True)
  421.     ## head aim
  422.     createSingleLoc('headAim', name, suff, headAimPos,par=(name+'head'+suff,name+'headEnd'+suff))
  423.     cmds.parent(name+'headAim'+suff,name+'head'+suff)
  424.     headName=createParCrv('wholeHead', headLocs, name, suff, headLocPos)
  425.     cmds.select(cl=True)
  426.     return spineCrv,headLocs
  427.  
  428. def createSpineSkelMech(prefix,jntNum,spineCrv):
  429.     name=str(prefix)+'_'
  430.     suff='_posLOC'
  431.     spineLocs=[]
  432.     ## create jnts on spine crv
  433.     reCrv=cmds.duplicate(spineCrv,n=name+'reCrv')
  434.     cmds.rebuildCurve(reCrv,s=jntNum-1,rpo=True,rt=0,end=1,kr=0,kt=False)
  435.     for i in range(jntNum):
  436.         pos=cmds.xform(reCrv[0]+'.ep['+str(i)+']',q=True,t=True,ws=True)
  437.         if i==0:
  438.             spineNum='base'
  439.         elif i==jntNum-1:
  440.             spineNum='end'
  441.         elif jntNum <10:
  442.             spineNum=str(i).zfill(2)
  443.         elif jntNum <100:
  444.             spineNum=str(i).zfill(3)
  445.         loc=cmds.spaceLocator(n=name+'spine_'+spineNum+suff)
  446.         cmds.xform(loc,t=pos)
  447.         spineLocs.append(loc[0])
  448.     cmds.delete(reCrv)
  449.     allLocs=spineLocs+headLocs
  450.     createJnts(allLocs)
  451.     cmds.delete(spineLocs)
  452.     ## create spine IK
  453.     createSplineIK(name+'spine_base_JNT',name+'spine_end_JNT',name+'spineIK',name+'global_CTRL')
  454.     if cmds.objExists(name+'spineIK_hips_BIND') or cmds.objExists(name+'spineIK_chest_BIND'):
  455.         cmds.delete(name+'spineIK_hips_BIND')
  456.         cmds.delete(name+'spineIK_chest_BIND')
  457.     if jntNum < 10:
  458.         chestJnt=str(jntNum/2).zfill(2)
  459.         spineArmJnt=str(jntNum-2).zfill(2)
  460.     elif jntNum < 100:
  461.         chestJnt=str(jntNum/2).zfill(3)
  462.         spineArmJnt=str(jntNum-2).zfill(3)
  463.     ##- create bind jnts
  464.     cmds.duplicate(name+'spine_base_JNT',n=name+'spineIK_hips_BIND',po=True)
  465.     cmds.duplicate(name+'spine_'+chestJnt+'_JNT',n=name+'spineIK_chest_BIND',po=True)
  466.     cmds.parent(name+'spineIK_chest_BIND',w=True)
  467.     cmds.group(name+'spineIK_hips_BIND',n=name+'spineIK_hipsMech_GRP')
  468.     cmds.group(name+'spineIK_chest_BIND',n=name+'spineIK_chestMech_GRP')
  469.     cmds.group(name+'spineIK_hipsMech_GRP',name+'spineIK_chestMech_GRP',name+'spineIK_GRP',n=name+'spineIKMech_GRP')
  470.     ##- create spine IK end locators
  471.     cmds.spaceLocator(n=name+'spineIK_base_LOC')
  472.     constr=cmds.parentConstraint(name+'spine_base_JNT',name+'spineIK_base_LOC')
  473.     cmds.delete(constr)
  474.     cmds.parent(name+'spineIK_base_LOC',name+'spineIK_hips_BIND')
  475.     cmds.spaceLocator(n=name+'spineIK_end_LOC')
  476.     constr=cmds.parentConstraint(name+'spine_end_JNT',name+'spineIK_end_LOC')
  477.     cmds.delete(constr)
  478.     cmds.parent(name+'spineIK_end_LOC',name+'spineIK_chest_BIND')
  479.     ##- skin bind jnts to crv
  480.     cmds.skinCluster(name+'spineIK_hips_BIND',name+'spineIK_chest_BIND',name+'spineIK_CRV')
  481.     ##- spine IK adv twist
  482.     cmds.setAttr(name+'spineIK_HDL.dTwistControlEnable',1)
  483.     cmds.setAttr(name+'spineIK_HDL.dWorldUpType', 4)
  484.     cmds.connectAttr(name+'spineIK_base_LOC.worldMatrix[0]',name+'spineIK_HDL.dWorldUpMatrix')
  485.     cmds.connectAttr(name+'spineIK_end_LOC.worldMatrix[0]',name+'spineIK_HDL.dWorldUpMatrixEnd')
  486.     ## create head mech
  487.     neckIK=createIK('neckIK', name+'spine_end_JNT', name+'head_JNT')
  488.     headIK=createIK('headIK', name+'head_JNT', name+'headEnd_JNT')
  489.     cmds.group(neckIK[0],headIK[0],n=name+'headMech_GRP')
  490.     ## create ctrls
  491.     ##- hips
  492.     createCtrlShape(name+'hips', 5,col=11)
  493.     createBuffer(name+'hips', 1, 1, name+'spineIK_hipsMech_GRP')
  494.     cmds.parentConstraint(name+'hipsConst_GRP',name+'spineIK_hipsMech_GRP',mo=True)
  495.     cmds.addAttr(name+'hips_CTRL',ln='twist',at='float',k=True)
  496.     cmds.connectAttr(name+'hips_CTRL.twist',name+'spineIK_base_LOC.rotateX')
  497.     ##- chest
  498.     createCtrlShape(name+'chest', 5,col=23)
  499.     createBuffer(name+'chest', 1, 1, name+'spineIK_chestMech_GRP')
  500.     cmds.parentConstraint(name+'chestConst_GRP',name+'spineIK_chestMech_GRP',mo=True)
  501.     cmds.addAttr(name+'chest_CTRL',ln='twist',at='float',k=True)
  502.     cmds.connectAttr(name+'chest_CTRL.twist',name+'spineIK_end_LOC.rotateX')
  503.     ##- body
  504.     createCtrlShape(name+'body', 13,col=23)
  505.     createBuffer(name+'body', 1, 1, name+'spineIK_hipsMech_GRP')
  506.     cmds.parent(name+'hipsCtrl_ROOT',name+'chestCtrl_ROOT',name+'bodyConst_GRP')
  507.     ##- head aim
  508.     createCtrlShape(name+'headAim', 6,col=24,scale=[0.65,0.65,0.65],rotOffset=[90,0,0])
  509.     createBuffer(name+'headAim', 1, 1, name+'headAim_posLOC')
  510.     ##- head
  511.     createCtrlShape(name+'head', 5,col=24,scale=[0.7,0.7,0.7],transOffset=[0,1,0.5])
  512.     createBuffer(name+'head', 1, 1, neckIK[1])
  513.     #cmds.parent(name+'headCtrl_ROOT',name+'headAimConst_GRP')
  514.     cmds.group(name+'headCtrl_ROOT',name+'headAimCtrl_ROOT',n=name+'headCtrls_GRP')
  515.     cmds.parentConstraint(name+'headConst_GRP',name+'headMech_GRP',mo=True)
  516.     cmds.parentConstraint(name+'spineIK_end_LOC',name+'headAimCtrl_ROOT',mo=True)
  517.     cmds.aimConstraint(name+'headAimConst_GRP',name+'headCtrl_ROOT',mo=True)
  518.     cmds.parent(name+'headCtrls_GRP',name+'chestConst_GRP')
  519.     ## clean shit up
  520.     if cmds.objExists(prefix+'_controls_GRP'):
  521.         cmds.parent(name+'bodyCtrl_ROOT',prefix+'_controls_GRP')
  522.     if cmds.objExists(prefix+'_mechanics_GRP'):
  523.         cmds.parent(name+'spineIKMech_GRP',name+'headMech_GRP',prefix+'_mechanics_GRP')
  524.     if cmds.objExists(prefix+'_skeleton_GRP'):
  525.         cmds.parent(name+'spine_base_JNT',prefix+'_skeleton_GRP')
  526.     cmds.select(cl=True)
  527.     return spineArmJnt
  528.  
  529. def mirrorLocs(locInfo,prefix,side,mirSide,suff):
  530.     name=str(prefix)+'_'+str(side)+'_'
  531.     mirName=str(prefix)+'_'+str(mirSide)+'_'
  532.     for i,x in enumerate(locInfo):
  533.         locName=name+x[0]+suff
  534.         mirLocName=mirName+x[0]+suff
  535.         pos=cmds.xform(locName,q=True,t=True,ws=True)
  536.         pos[0]=-pos[0]
  537.         if not cmds.objExists(mirLocName):
  538.             cmds.spaceLocator(n=mirLocName)
  539.             cmds.xform(mirLocName,t=(pos[0],pos[1],pos[2]))
  540.         locInfo[i]=mirLocName
  541.     return locInfo
  542.  
  543. def createLocs(locInfo,name,suff):
  544.     for i,x in enumerate(locInfo):
  545.         locName=name+x[0]+suff
  546.         if not cmds.objExists(locName):
  547.             cmds.spaceLocator(n=locName)
  548.             cmds.xform(locName,t=(x[1],x[2],x[3]))
  549.         locInfo[i]=locName
  550.     return locInfo
  551.  
  552. def createParCrv(crvName,locs,name,suff,xyz=[0,0,0],rotXyz=[0,0,0]):
  553.     parCrvName=name+crvName+suff
  554.     if not cmds.objExists(parCrvName):
  555.         cmds.circle(n=parCrvName,nr=(rotXyz[0],rotXyz[1],rotXyz[2]))
  556.         cmds.xform(parCrvName,t=(xyz[0],xyz[1],xyz[2]))
  557.         cmds.makeIdentity(parCrvName,a=True,t=True)
  558.         for x in locs:
  559.             cmds.parent(x,parCrvName)
  560.     return parCrvName
  561.  
  562. def createPvVis(strtJnt,aimJnt,endJnt,locName,name,suff,parName,xyz=[0,0,0]):
  563.     pvParName=name+locName+'Par'+suff
  564.     if not cmds.objExists(pvParName):
  565.         cmds.spaceLocator(n=pvParName)
  566.         cmds.parent(pvParName,parName)
  567.         cmds.pointConstraint(name+strtJnt+suff,name+endJnt+suff,pvParName)
  568.         cmds.aimConstraint(name+aimJnt+suff,pvParName)
  569.         cmds.setAttr(pvParName+'Shape.localScale',3,0,0)
  570.         cmds.setAttr(pvParName+'.overrideEnabled',1)
  571.         cmds.setAttr(pvParName+'.overrideDisplayType',1)
  572.         ## create moveable PV control loc
  573.     pvName=name+locName+suff
  574.     if not cmds.objExists(pvName):
  575.         cmds.spaceLocator(n=pvName)
  576.         cmds.parent(pvName,parName)
  577.  
  578.         # pvParPos=cmds.xform(pvParName,q=True,t=True)
  579.         # pvParRot=cmds.xform(pvParName,q=True,ro=True)
  580.         # cmds.xform(pvName,t=pvParPos)
  581.         # cmds.xform(pvName,ro=pvParRot)
  582.  
  583.         cmds.parentConstraint(pvParName,pvName)
  584.         cmds.delete(pvName,cn=True)
  585.         cmds.xform(pvName,t=xyz,r=True,os=True)
  586.         cmds.parentConstraint(pvParName,pvName,mo=True)
  587.  
  588.         cmds.setAttr(pvName+'Shape.localScale',0.5,0.5,0.5)
  589.         pvLckAttr=[
  590.             'translateX',
  591.             'translateY',
  592.             'translateZ',
  593.             'rotateX',
  594.             'rotateY',
  595.             'rotateZ'
  596.         ]
  597.         for x in pvLckAttr:
  598.             cmds.setAttr(pvName+'.'+x,l=True,k=False)
  599.         cmds.select(pvName)
  600.         cmds.addAttr(sn='pvDis',nn='Pole Vector Distance', dv=1.0, h=False,k=True)
  601.         cmds.connectAttr(pvName+'.pvDis',pvParName+'.scaleX')
  602.  
  603. def createIkfkVis(crvName,jntPar,name,suff,side,xyz=[0.5,0.25,-0.5]):
  604.     ikfkName=name+crvName+suff
  605.     if not cmds.objExists(ikfkName):
  606.         cmds.spaceLocator(n=ikfkName)
  607.         if side=='L' or 'L_' in side or '_L' in side:
  608.             ikfkXPos=xyz[0]
  609.         else:
  610.             ikfkXPos=-xyz[0]
  611.         cmds.xform(ikfkName,t=(ikfkXPos,xyz[1],xyz[2]))
  612.         cmds.parent(ikfkName,name+jntPar+suff, r=True)
  613.         cmds.setAttr(ikfkName+'Shape.localScale',0.5,0.5,0.5)
  614.  
  615. def createSingleLoc(locName,name,suff,xyz,side=None,par=None):
  616.     locName=name+locName+suff
  617.     if not cmds.objExists(locName):
  618.         cmds.spaceLocator(n=locName)
  619.         if not side == 'L':
  620.             xyz[0]=-xyz[0]
  621.         cmds.xform(locName,t=xyz)
  622.         if par:
  623.             cmds.parentConstraint(par,locName,mo=True)
  624.  
  625. def createJnts(locs,extraName='',side='L',*args):
  626.     jnts=[]
  627.     cmds.select(cl=True)
  628.     for x in locs:
  629.         jntName=x.rpartition('_')
  630.         jntName=jntName[0].rpartition('_')
  631.         jntName=jntName[0]+extraName+'_'+jntName[2]+'_JNT'
  632.         if cmds.objExists(jntName):
  633.             cmds.delete(jntName)
  634.         locPos=cmds.xform(x,q=True,t=True,ws=True)
  635.         cmds.joint(n=jntName,p=locPos)
  636.         jnts.append(jntName)
  637.         cmds.setAttr(jntName+'.radius', 0.2)
  638.     if side == 'L':
  639.         doOrientJoint(jnts, [1,0,0], [0,1,0], [0,1,0], 1)
  640.     else:
  641.         doOrientJoint(jnts, [-1,0,0], [0,1,0], [0,1,0], 1)
  642.     return jnts
  643.  
  644. def createIK(ikName,start,end):
  645.     hdlName=ikName+'_HDL'
  646.     effName=ikName+'_EFF'
  647.     grpName=ikName+'_GRP'
  648.     if cmds.objExists(grpName):
  649.         cmds.delete(grpName)
  650.     ikH,ikE=cmds.ikHandle(n=hdlName,sj=start,ee=end)
  651.     cmds.rename(ikE,effName)
  652.     hdlPos=cmds.xform(ikH,q=True,t=True)
  653.     cmds.group(hdlName,n=grpName,r=True)
  654.     cmds.xform(grpName,piv=hdlPos)
  655.     #cmds.parent(ikH,grpName)
  656.     return grpName,hdlName
  657.  
  658. def createFKIK(joints,limb,prefix,side,parJnt):
  659.     ## Set Suffix Values
  660.     suffixA = '_IK_'
  661.     suffixB = '_FK_'
  662.     curSuffix = '_result_'
  663.     name=str(prefix)+'_'+str(side)+'_'
  664.     ctrlCrv = name+limb+'Settings'
  665.     attrName = 'IKFKSwitch'
  666.  
  667.     createSettingCtrl(ctrlCrv, name+limb+'IKFKVis_posLOC',parJnt,side)
  668.  
  669.     ## Main Code
  670.  
  671.     for x in joints:
  672.         if curSuffix not in x:
  673.             if '_JNT' not in x:
  674.                 cmds.confirmDialog(title='ERROR', message='One or more incorrectly named Joints selected', button=['Ok'])
  675.                 return
  676.  
  677.             ## Rename current Joint
  678.             resultJointName = x.replace('_JNT', curSuffix+'JNT')
  679.             if cmds.objExists(resultJointName):
  680.                 cmds.delete(resultJointName)
  681.  
  682.             cmds.rename(x,resultJointName)
  683.             x=resultJointName
  684.  
  685.         ## Names from current Joint
  686.         blendSuffix = '_'+'IK'+'FK'[:1].upper() + 'FK'[1:]
  687.         ikJointName = x.replace(curSuffix, suffixA)
  688.         fkJointName = x.replace(curSuffix, suffixB)
  689.         blendRName = x.replace(curSuffix+'JNT', blendSuffix+'Rot_BLND')
  690.         blendTName = x.replace(curSuffix+'JNT', blendSuffix+'Trans_BLND')
  691.         blendSName = x.replace(curSuffix+'JNT', blendSuffix+'Scale_BLND')
  692.  
  693.         ## Duplicate Joints
  694.         if cmds.objExists(ikJointName):
  695.             cmds.delete(ikJointName)
  696.         if cmds.objExists(fkJointName):
  697.             cmds.delete(fkJointName)
  698.         ikJoints = cmds.duplicate(x, n=ikJointName, po=True)
  699.         fkJoints = cmds.duplicate(x, n=fkJointName, po=True)
  700.  
  701.         ## Parent Duplicated Joints
  702.         resultParent=cmds.listRelatives(x, p=True, c=False)
  703.         if resultParent:
  704.             for p in resultParent:
  705.                 if curSuffix in p:
  706.                     ikParent=p.replace(curSuffix, suffixA)
  707.                     fkParent=p.replace(curSuffix, suffixB)
  708.                     cmds.parent(ikJointName, ikParent)
  709.                     cmds.parent(fkJointName, fkParent)
  710.  
  711.         ## Create and attach Blends
  712.         cmds.createNode('blendColors', n=blendRName)
  713.         cmds.createNode('blendColors', n=blendTName)
  714.         cmds.createNode('blendColors', n=blendSName)
  715.         ##- Inputs
  716.         cmds.connectAttr(ikJointName + '.rotate', blendRName + '.color2')
  717.         cmds.connectAttr(fkJointName + '.rotate', blendRName + '.color1')
  718.         cmds.connectAttr(ikJointName + '.translate', blendTName + '.color2')
  719.         cmds.connectAttr(fkJointName + '.translate', blendTName + '.color1')
  720.         cmds.connectAttr(ikJointName + '.scale', blendSName + '.color2')
  721.         cmds.connectAttr(fkJointName + '.scale', blendSName + '.color1')
  722.         cmds.connectAttr(ctrlCrv+'_CTRL' + '.' + attrName, blendRName + '.blender')
  723.         cmds.connectAttr(ctrlCrv+'_CTRL' + '.' + attrName, blendTName + '.blender')
  724.         cmds.connectAttr(ctrlCrv+'_CTRL' + '.' + attrName, blendSName + '.blender')
  725.         ##- Outputs
  726.         cmds.connectAttr(blendRName + '.output', x + '.rotate')
  727.         cmds.connectAttr(blendTName + '.output', x + '.translate')
  728.         cmds.connectAttr(blendSName + '.output', x + '.scale')
  729.  
  730. def createSplineIK(start,end,ikName='splineIK',controlName=''):
  731.         ## setup name variables
  732.         hdlName=ikName+'_HDL'
  733.         effName=ikName+'_EFF'
  734.         crvName=ikName+'_CRV'
  735.         grpName=ikName+'_GRP'
  736.         crvInfoName=ikName+'Crv_INFO'
  737.         crvGlobalScaleName=ikName+'CrvGlobalScale_MULT'
  738.         crvStretchName=ikName+'CrvStretch_DIV'
  739.  
  740.         if cmds.objExists(grpName):
  741.             cmds.delete(grpName)
  742.         ## get effected joints
  743.         startJntParents=_getParents(start)
  744.         endJntParents=_getParents(end)
  745.  
  746.         if startJntParents:
  747.             eP = list(set(endJntParents)-set(startJntParents))
  748.         else:
  749.             eP=endJntParents
  750.         effectedJnts=eP
  751.  
  752.         ## create IK
  753.         ikH,ikE,ikC=cmds.ikHandle(n=hdlName, sj=start, ee=end, solver='ikSplineSolver', parentCurve=False, simplifyCurve=False)
  754.         cmds.group(ikH,ikC,n=grpName)
  755.         cmds.rename(ikE,effName)
  756.         cmds.rename(ikC,crvName)
  757.  
  758.         ## create curve info node
  759.         crvInf=cmds.arclen(crvName, ch=True)
  760.         if not cmds.objExists(crvInfoName):
  761.             cmds.rename(crvInf,crvInfoName)
  762.  
  763.         ## create global scale mult node
  764.         crvGlobalScaleNode=cmds.createNode('multDoubleLinear', n=crvGlobalScaleName, ss=True)
  765.         if cmds.objExists(controlName):
  766.             cmds.connectAttr(controlName+'.scaleY',crvGlobalScaleNode+'.input1')
  767.         else:
  768.             cmds.setAttr(crvGlobalScaleNode+'.input1', 1)
  769.         ikCrvLength=cmds.getAttr(crvInfoName+'.arcLength')
  770.         cmds.setAttr(crvGlobalScaleNode+'.input2',ikCrvLength)
  771.  
  772.         ## create curve stretch divide node
  773.         crvStretchNode=cmds.createNode('multiplyDivide', n=crvStretchName)
  774.         cmds.setAttr(crvStretchNode+'.operation', 2) # 1=multiply 2=divide
  775.         cmds.connectAttr(crvGlobalScaleNode+'.output', crvStretchNode+'.input2X')
  776.         cmds.connectAttr(crvInfoName+'.arcLength', crvStretchNode+'.input1X')
  777.  
  778.         ## create stretch mult node for each effected joint
  779.         for sN,lN in effectedJnts:
  780.             jntStretchName=ikName+sN+'Stretch_MULT'
  781.             jntStretchNode=cmds.createNode('multDoubleLinear', n=jntStretchName)
  782.             jointTransX=cmds.getAttr(lN+'.translateX')
  783.             cmds.setAttr(jntStretchNode+'.input1', jointTransX)
  784.             cmds.connectAttr(crvStretchNode+'.outputX', jntStretchNode+'.input2')
  785.             cmds.connectAttr(jntStretchNode+'.output', lN+'.translateX')
  786.  
  787.         ## turn off inherit transforms
  788.         cmds.setAttr(grpName+'.inheritsTransform',0)
  789.  
  790. def createSettingCtrl(ctrlCrv, settingLoc, parJnt,side):
  791.     attrName = 'IKFKSwitch'
  792.     attrNiceName = 'IK / FK Switch'
  793.     if side == 'L':
  794.         col=27
  795.         rot=[-15,30,0]
  796.     else:
  797.         col=32
  798.         rot=[-15,-30,0]
  799.     if cmds.objExists(ctrlCrv+'Ctrl_ROOT'):
  800.         cmds.delete(ctrlCrv+'Ctrl_ROOT')
  801.     createCtrlShape(ctrlCrv,2,col=col,scale=[0.12,0.12,0.12],rotOffset=rot)
  802.     createBuffer(ctrlCrv,1,1,settingLoc)
  803.     if not cmds.attributeQuery(attrName, node=ctrlCrv+'_CTRL', exists=True):
  804.         cmds.addAttr(ctrlCrv+'_CTRL', ln=attrName, nn=attrNiceName, min=0, max=1, at='float', dv=0, k=True)
  805.  
  806.     cmds.parentConstraint(parJnt,ctrlCrv+'Ctrl_ROOT',mo=True)
  807.  
  808. def createCtrlShape(n,s,scale=[1,1,1],col=1,rotOffset=[0,0,0],transOffset=[0,0,0],side=None):
  809.     if not n:
  810.         n='curve'
  811.     ctrlName = n+"_CTRL"
  812.  
  813.     for i in range(len(transOffset)):
  814.         transOffset[i]=-transOffset[i]
  815.  
  816.     #cmds.circle(n=ctrlName)
  817.     curveNum=eval('crv'+str(s))
  818.     crvs=curveNum.create(n,'_CTRL')
  819.     combineCrv(crvs,col)
  820.     if not side == None and not side == 'L':
  821.         rotOffset[1]=-rotOffset[1]
  822.         rotOffset[2]=-rotOffset[2]
  823.     cmds.xform(ctrlName,scale=scale,ro=rotOffset,piv=transOffset)
  824.     cmds.makeIdentity(ctrlName,a=True,s=True,r=True)
  825.  
  826. def combineCrv(crvs,col):
  827.     for i,x in enumerate(crvs):
  828.         shape=cmds.listRelatives(x,s=True)
  829.         if col:
  830.             cmds.setAttr(x+'.overrideEnabled',True)
  831.             cmds.setAttr(x+'.overrideColor',col-1)
  832.         if not i > 0:
  833.             parent=x
  834.         else:
  835.             cmds.parent(shape,parent,s=True,r=True)
  836.             cmds.delete(x)
  837.  
  838. def createBuffer(n,loc,grp,obj,*args):
  839.     if not n:
  840.         n='curve'
  841.  
  842.     rootCtrlName = str(n)+"Ctrl_ROOT"
  843.     ctrlParentName = str(n)+"Ctrl_PAR"
  844.     spareCtrlParentName = str(n)+"CtrlPar#_PAR"
  845.     ctrlName = str(n)+"_CTRL"
  846.     constGrpName = str(n)+"Const_GRP"
  847.  
  848.     sel = cmds.ls(sl=True)
  849.  
  850.     buffers = []
  851.     prevBuff=None
  852.     if grp == 0 and loc == 0:
  853.         cmds.parentConstraint(obj,ctrlName,mo=False)
  854.         cmds.delete(ctrlName+'_parentConstraint1')
  855.         cmds.makeIdentity(ctrlName,a=True,t=True,s=True,r=True)
  856.     else:
  857.         for y in range(grp+loc):
  858.             if y == 0:
  859.                 buffName = rootCtrlName
  860.             elif y ==1:
  861.                 buffName = ctrlParentName
  862.             else:
  863.                 buffName = spareCtrlParentName
  864.             buffName = _swapDigits(buffName,y-2)
  865.             if y < grp:
  866.                 cmds.group(em=True,n=buffName)
  867.             else:
  868.                 cmds.spaceLocator(n=buffName)
  869.                 cmds.setAttr(buffName+'Shape'+'.overrideEnabled', True)
  870.                 cmds.setAttr(buffName+'Shape'+'.overrideVisibility', 0)
  871.                 locPath=zip(cmds.ls(buffName,l=True),buffName)
  872.  
  873.  
  874.             cmds.parentConstraint(obj,buffName,mo=False)
  875.             cmds.delete(buffName+'_parentConstraint1')
  876.             if y == 0:
  877.                 cmds.makeIdentity(buffName,a=True,t=True,s=True,r=True)
  878.             else:
  879.                 cmds.makeIdentity(buffName,a=True,t=True,s=True)
  880.             buffers.append(buffName)
  881.  
  882.         for y in range(len(buffers)):
  883.             if y > 0:
  884.                 cmds.parent(buffers[y],buffers[y-1])
  885.  
  886.         cmds.parentConstraint(buffers[-1],ctrlName,mo=False)
  887.         cmds.delete(ctrlName+'_parentConstraint1')
  888.         cmds.parent(ctrlName,buffers[-1])
  889.         cmds.makeIdentity(ctrlName,a=True,t=True,s=True,r=True)
  890.  
  891.         constGrpPar = ctrlName
  892.  
  893.         cmds.group(em=True,n=constGrpName)
  894.         cmds.parentConstraint(constGrpPar,constGrpName,mo=False)
  895.         cmds.delete(constGrpName+'_parentConstraint1')
  896.         cmds.parent(constGrpName,constGrpPar)
  897.         cmds.makeIdentity(a=True,t=True,s=True,r=True)
  898.  
  899. def _swapDigits(n,i=0,*args):
  900.     minDigitLength=0
  901.     bufferChar=''
  902.     findHashes = re.findall("(#+)", n)
  903.     newN=n
  904.     if findHashes:
  905.         minDigitLength=len(findHashes[0])
  906.         bufferChar=findHashes[0]
  907.         newN=str(i+1).zfill(minDigitLength).join(n.split(bufferChar))
  908.         while cmds.objExists(newN):
  909.             i=i+1
  910.             newN=str(i+1).zfill(minDigitLength).join(n.split(bufferChar))
  911.     return newN
  912.  
  913. def _getParents(joint,*args):
  914.     parents=[]
  915.     sNParents=[]
  916.     curPar=joint
  917.     for i in range(500):
  918.         curPar=cmds.listRelatives(curPar,typ='joint',f=True, p=True)
  919.         if not curPar:
  920.             break
  921.         sN=curPar[0].split('|')
  922.         sNParents.append(sN[-1])
  923.         parents.append(curPar[0])
  924.     parents=zip(sNParents,parents)
  925.     return parents
  926.  
  927. def _getCrv(inCrv):
  928.     crvShapeNodes=cmds.listRelatives(inCrv, c=True)
  929.     for pathCurve in crvShapeNodes:
  930.         cmds.select(pathCurve+'.cv[*]')
  931.         pathCvs=cmds.ls(sl=True,fl=True)
  932.  
  933.         knotNum=0
  934.         cvPoints=[]
  935.         knots=[]
  936.  
  937.         for cv in pathCvs:
  938.             coords=cmds.xform(cv,q=True,t=True)
  939.             coords=(coords[0],coords[1],coords[2])
  940.             cvPoints.append(coords)
  941.  
  942.         3
  943.         noOfPoints=len(cvPoints)
  944.         noOfKnots=noOfPoints + 2
  945.         noOfSpans=noOfPoints - 3
  946.  
  947.         knotValue=1
  948.         for x in range(noOfKnots):
  949.             knots.append(None)
  950.             if x < 3:
  951.                 knots[x]=0
  952.             else:
  953.                 knots[x]=knotValue
  954.                 knotValue=knotValue+1
  955.  
  956.             if x >= (noOfKnots-3):
  957.                 knots[x]=noOfSpans
  958.  
  959.  
  960.     return knots,cvPoints
  961.  
  962. # ====================================================================================================================
  963. #
  964. #   doOrientJoint(jointsToOrient, aimAxis, upAxis, worldUp, guessUp)
  965. #   crossProduct(firstObj, secondObj, thirdObj)
  966. #   freezeJointOrientation(jointToOrient)
  967. #
  968. # AUTHOR:
  969. #   Jose Antonio Martin Martin - JoseAntonioMartinMartin@gmail.com
  970. #                    contact@joseantoniomartinmartin.com
  971. #   http://www.joseantoniomartinmartin.com
  972. #   Copyright 2010 Jose Antonio Martin Martin - All Rights Reserved.
  973. #
  974. # ====================================================================================================================
  975.  
  976. def doOrientJoint(jointsToOrient, aimAxis, upAxis, worldUp, guessUp):
  977.     firstPass = 0
  978.     prevUpVector = [0,0,0]
  979.     for eachJoint in jointsToOrient:
  980.         childJoint = cmds.listRelatives(eachJoint, type="joint", c=True)
  981.         if childJoint != None:
  982.             if len(childJoint) > 0:
  983.  
  984.                 childNewName = cmds.parent(childJoint, w=True)  #Store the name in case when unparented it changes it's name.
  985.  
  986.                 if guessUp == 0:
  987.                     #Not guess Up direction
  988.  
  989.                     cmds.delete(cmds.aimConstraint(childNewName[0], eachJoint, w=1, o=(0,0,0), aim=aimAxis, upVector=upAxis, worldUpVector=worldUp, worldUpType="vector"))
  990.                     freezeJointOrientation(eachJoint)
  991.                     cmds.parent(childNewName, eachJoint)
  992.                 else:
  993.                     if guessUp == 1:
  994.                         #Guess Up direction
  995.  
  996.  
  997.                         parentJoint = cmds.listRelatives(eachJoint, type="joint", p=True)
  998.                         if parentJoint != None :
  999.                             if len(parentJoint) > 0:
  1000.                                 posCurrentJoint = cmds.xform(eachJoint, q=True, ws=True, rp=True)
  1001.                                 posParentJoint = cmds.xform(parentJoint, q=True, ws=True, rp=True)
  1002.                                 tolerance = 0.0001
  1003.  
  1004.                                 if (abs(posCurrentJoint[0] - posParentJoint[0]) <= tolerance and abs(posCurrentJoint[1] - posParentJoint[1]) <= tolerance and abs(posCurrentJoint[2] - posParentJoint[2]) <= tolerance):
  1005.                                     aimChild = cmds.listRelatives(childNewName[0], type="joint", c=True)
  1006.                                     upDirRecalculated = crossProduct(eachJoint, childNewName[0], aimChild[0])
  1007.                                     cmds.delete(cmds.aimConstraint(childNewName[0], eachJoint, w=1, o=(0,0,0), aim=aimAxis, upVector=upAxis, worldUpVector=upDirRecalculated, worldUpType="vector"))
  1008.                                 else:
  1009.                                     upDirRecalculated = crossProduct(parentJoint, eachJoint, childNewName[0])
  1010.                                     cmds.delete(cmds.aimConstraint(childNewName[0], eachJoint, w=1, o=(0,0,0), aim=aimAxis, upVector=upAxis, worldUpVector=upDirRecalculated, worldUpType="vector"))
  1011.                             else:
  1012.                                 aimChild = cmds.listRelatives(childNewName[0], type="joint", c=True)
  1013.                                 upDirRecalculated = crossProduct(eachJoint, childNewName[0], aimChild[0])
  1014.                         else:
  1015.                             aimChild = cmds.listRelatives(childNewName[0], type="joint", c=True)
  1016.                             upDirRecalculated = crossProduct(eachJoint, childNewName[0], aimChild[0])
  1017.                             cmds.delete(cmds.aimConstraint(childNewName[0], eachJoint, w=1, o=(0,0,0), aim=aimAxis, upVector=upAxis, worldUpVector=upDirRecalculated, worldUpType="vector"))
  1018.  
  1019.  
  1020.  
  1021.  
  1022.  
  1023.                     dotProduct = upDirRecalculated[0] * prevUpVector[0] + upDirRecalculated[1] * prevUpVector[1] + upDirRecalculated[2] * prevUpVector[2]
  1024.  
  1025.                     #For the next iteration
  1026.                     prevUpVector = upDirRecalculated
  1027.  
  1028.                     if firstPass > 0 and  dotProduct <= 0.0:
  1029.                         #dotProduct
  1030.                         cmds.xform(eachJoint, r=1, os=1, ra=(aimAxis[0] * 180.0, aimAxis[1] * 180.0, aimAxis[2] * 180.0))
  1031.                         prevUpVector[0] *= -1
  1032.                         prevUpVector[1] *= -1
  1033.                         prevUpVector[2] *= -1
  1034.  
  1035.                     freezeJointOrientation(eachJoint)
  1036.                     cmds.parent(childNewName, eachJoint)
  1037.  
  1038.  
  1039.  
  1040.  
  1041.             else:
  1042.                 #Child joint. Use the same rotation as the parent.
  1043.                 if len(childJoint) == 0:
  1044.                     parentJoint = cmds.listRelatives(eachJoint, type="joint", p=True)
  1045.                     if parentJoint != None :
  1046.                         if len(parentJoint) > 0:
  1047.                             cmds.delete(cmds.orientConstraint(parentJoint[0], eachJoint, w=1, o=(0,0,0)))
  1048.                             freezeJointOrientation(eachJoint)
  1049.         else:
  1050.             #Child joint. Use the same rotation as the parent.
  1051.             parentJoint = cmds.listRelatives(eachJoint, type="joint", p=True)
  1052.             if parentJoint != None :
  1053.                 if len(parentJoint) > 0:
  1054.                     cmds.delete(cmds.orientConstraint(parentJoint[0], eachJoint, w=1, o=(0,0,0)))
  1055.                     freezeJointOrientation(eachJoint)
  1056.  
  1057.  
  1058.  
  1059.         firstPass += 1
  1060.  
  1061. def crossProduct(firstObj, secondObj, thirdObj):
  1062.     #We have 3 points in space so we have to calculate the vectors from
  1063.     #the secondObject (generally the middle joint and the one to orient)
  1064.     #to the firstObject and from the secondObject to the thirdObject.
  1065.  
  1066.     xformFirstObj = cmds.xform(firstObj, q=True, ws=True, rp=True)
  1067.     xformSecondObj = cmds.xform(secondObj, q=True, ws=True, rp=True)
  1068.     xformThirdObj = cmds.xform(thirdObj, q=True, ws=True, rp=True)
  1069.  
  1070.     #B->A so A-B.
  1071.     firstVector = [0,0,0]
  1072.     firstVector[0] = xformFirstObj[0] - xformSecondObj[0];
  1073.     firstVector[1] = xformFirstObj[1] - xformSecondObj[1];
  1074.     firstVector[2] = xformFirstObj[2] - xformSecondObj[2];
  1075.  
  1076.     #B->C so C-B.
  1077.     secondVector = [0,0,0]
  1078.     secondVector[0] = xformThirdObj[0] - xformSecondObj[0];
  1079.     secondVector[1] = xformThirdObj[1] - xformSecondObj[1];
  1080.     secondVector[2] = xformThirdObj[2] - xformSecondObj[2];
  1081.  
  1082.     #THE MORE YOU KNOW - 3D MATH
  1083.     #========================================
  1084.     #Cross Product u x v:
  1085.     #(u2v3-u3v2, u3v1-u1v3, u1v2-u2v1)
  1086.     crossProductResult = [0,0,0]
  1087.     crossProductResult[0] = firstVector[1]*secondVector[2] - firstVector[2]*secondVector[1]
  1088.     crossProductResult[1] = firstVector[2]*secondVector[0] - firstVector[0]*secondVector[2]
  1089.     crossProductResult[2] = firstVector[0]*secondVector[1] - firstVector[1]*secondVector[0]
  1090.  
  1091.     return crossProductResult
  1092.  
  1093. def freezeJointOrientation(jointToOrient):
  1094.     cmds.joint(jointToOrient, e=True, zeroScaleOrient=True)
  1095.     cmds.makeIdentity(jointToOrient, apply=True, t=0, r=1, s=0, n=0)
  1096.  
  1097. ## Biped
  1098. # createGlobalCtrl('test')
  1099.  
  1100. # spineCrv,headLocs=createSpineLocs('test')
  1101. # LlegLocs=createLegLocs('test','L')
  1102. # LarmLocs=createArmLocs('test', 'L')
  1103.  
  1104. # RlegLocs=createLegLocs('test','L',True,'R')
  1105. # RarmLocs=createArmLocs('test', 'L',True,'R')
  1106.  
  1107. # spineArmJnt=createSpineSkelMech('test',8,spineCrv)
  1108. # createLegSkelMech(LlegLocs,'test','L')
  1109. # createArmSkelMech(LarmLocs,'test', 'L',spineArmJnt)
  1110. # createLegSkelMech(RlegLocs,'test','R')
  1111. # createArmSkelMech(RarmLocs,'test', 'R',spineArmJnt)
  1112.  
  1113.  
  1114.     ## Quadriped
  1115. # frntLlegLocs=createLegLocs('test','L_frnt')
  1116. # frntRlegLocs=createLegLocs('test','L_frnt',True,'R_frnt')
  1117. # bckLlegLocs=createLegLocs('test','L_bck')
  1118. # bckRlegLocs=createLegLocs('test','L_bck',True,'R_frnt')
  1119. # createLegSkelMech(frntLlegLocs,'test','L_frnt')
  1120. # createLegSkelMech(frntRlegLocs,'test','R_frnt')
  1121. # createLegSkelMech(bckLlegLocs,'test','L_bck')
  1122. # createLegSkelMech(bckRlegLocs,'test','R_bck')
  1123.  
  1124. def bipedLocs():
  1125.     spineCrv,headLocs=createSpineLocs('test')
  1126.     LlegLocs=createLegLocs('test','L')
  1127.     LarmLocs=createArmLocs('test', 'L')
  1128.  
  1129. def bipedMirror():
  1130.     RlegLocs=createLegLocs('test','L',True,'R')
  1131.     RarmLocs=createArmLocs('test', 'L',True,'R')
  1132.  
  1133. def bipedSkel():
  1134.     createGlobalCtrl('test')
  1135.  
  1136.     spineCrv,headLocs=createSpineLocs('test')
  1137.     LlegLocs=createLegLocs('test','L')
  1138.     LarmLocs=createArmLocs('test', 'L')
  1139.  
  1140.     RlegLocs=createLegLocs('test','L',True,'R')
  1141.     RarmLocs=createArmLocs('test', 'L',True,'R')
  1142.  
  1143.     spineArmJnt=createSpineSkelMech('test',8,spineCrv)
  1144.     createLegSkelMech(LlegLocs,'test','L')
  1145.     createArmSkelMech(LarmLocs,'test', 'L',spineArmJnt)
  1146.     createLegSkelMech(RlegLocs,'test','R')
  1147.     createArmSkelMech(RarmLocs,'test', 'R',spineArmJnt)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement