videos

    scripts

    life drawing

This section is mainly to show how I work. Most these scripts are used as elements of larger rig scripts.
"""
this is the rig for the kingsley character(a biped, the one seen on my reel)
at the bottom of this file is just scratch work from the actual development process
    in maya. I like to save that stuff here incase there is something valuable I can 
    maybe use later. 
"""
import maya.cmds as cmds
import dwRiggingUtilities as ru
import dwSpine as sp
import dwHandRig as hr
import dwForearmRig as fr
import dwAutoClav as ac
import dwArmRig as ar
reload(ac)
def kinRig():
    
    print "hello kingsley"
    
    #############################
    ##Left and Right Side Setup##
    #############################
    sideList = ["_L_", "_R_"]
    for side in sideList:
        #joints
        armJnts = ["kin"+side+"arm01_jnt", "kin"+side+"arm02_jntBnd", "kin"+side+"arm03_jntBnd"]
        acArmJnts = ["kin"+side+"acArm01_jnt", "kin"+side+"acArm02_jnt", "kin"+side+"acArm03_jnt"]
        clavJnts = ["kin"+side+"clav01_jntBnd", "kin"+side+"clav02_jntBnd", "kin"+side+"clav03_jnt"]
        footJnts = ["kin"+side+"leg03_jntBnd", "kin"+side+"foot01_jntBnd", "kin"+side+"foot02_jntBnd"]
        revFootJnts = ["kin"+side+"revFoot01_jnt", "kin"+side+"revFoot02_jnt", "kin"+side+"revFoot03_jnt", "kin"+side+"revFoot04_jnt",] 
        finJnts = ["kin"+side+"thumb01_jntBnd", "kin"+side+"fingerA01_jntBnd", "kin"+side+"fingerB01_jntBnd", "kin"+side+"fingerC01_jntBnd", "kin"+side+"fingerD01_jntBnd"]
        legJnts = ["kin"+side+"leg01_jntBnd", "kin"+side+"leg02_jntBnd", "kin"+side+"leg03_jntBnd"]
        upperLegJnts = ["kin"+side+"upperLeg_revRot_jnt", "kin"+side+"upperLeg1_jntBnd", "kin"+side+"upperLeg2_jntBnd", "kin"+side+"upperLeg3_jntBnd"]
        lowerLegJnts = ["kin"+side+"lowerLeg1_jntBnd", "kin"+side+"lowerLeg2_jntBnd", "kin"+side+"lowerLeg3_jntBnd"]
        upperArmJnts = ["kin"+side+"upperArm_revRot_jnt", "kin"+side+"upperArm1_jntBnd", "kin"+side+"upperArm2_jntBnd", "kin"+side+"upperArm3_jntBnd"]
        forearmJnts = ["kin"+side+"forearm1_jntBnd", "kin"+side+"forearm2_jntBnd", "kin"+side+"forearm3_jntBnd"] 
    
        #ctrls
        ikArmCtrls = ["kin"+side+"ikArm_ctrl", "dra"+side+"arm_pv_ctrl"]
        fkArmCtrls = ["kin"+side+"fkArm01_ctrl", "kin"+side+"fkArm02_ctrl", "kin"+side+"fkArm03_ctrl"]
        shoulderCtrl = "kin"+side+"shoulder_ctrl"
        fkikArmSwitchCtrl ="kin"+side+"arm_switch_ctrl"
        legCtrls = ["kin"+side+"foot_ctrl", "dra"+side+"leg_pv_ctrl"]
        finCtrls = ["kin"+side+"thumb_ctrl", "kin"+side+"fingerA_ctrl", "kin"+side+"fingerB_ctrl", "kin"+side+"fingerC_ctrl", "kin"+side+"fingerD_ctrl"]
        mainHandCtrl = "kin"+side+"hand_ctrl"
        
        #arm, clav, hand
        ar.fkikArm(armJnts, fkArmCtrls, ikArmCtrls, fkikArmSwitchCtrl, "kin"+side+"arm")
        cmds.pointConstraint(clavJnts[2], fkArmCtrls[0], n="kin"+side+"arm_fkPC")
        if side == "_R_": opp = 1
        else: opp = 0
        ac.autoClav(armJnts, clavJnts, acArmJnts, ikArmCtrls, shoulderCtrl, "kin_C_spine_6_jntBnd", fkArmCtrls, fkikArmSwitchCtrl, "kin"+side+"ac", opp)
        hr.handRigProc(finJnts, finCtrls, mainHandCtrl, 1, "kin"+side+"hand_")
        legRes = ar.stretchyLeg(legJnts, legCtrls, "kin"+side+"leg")
        #parent some controls to the spine jnt
        cmds.parentConstraint("kin_C_spine_6_jntBnd", fkArmCtrls[0].replace("ctrl", "grp"), mo=1, n="kin"+side+"armParC")
        cmds.parentConstraint("kin_C_spine_6_jntBnd", shoulderCtrl.replace("ctrl", "grp"), mo=1, n="kin"+side+"shoulderParC")
        #parent finger ctrls
        i=0
        for fj in finJnts:
            cmds.parentConstraint(fj, finCtrls[i].replace("ctrl", "grp"), mo=1, n="kin"+side+"finger_PC"+str(i))
            i+=1
        cmds.parentConstraint("kin"+side+"hand_jntBnd", mainHandCtrl.replace("ctrl", "grp"), mo=1, n="kin"+side+"hand_PC")
            
        
        
        #set up arm and leg rotation distribution 
        fr.forearm(forearmJnts, armJnts[2], "kin"+side+"forearm")
        fr.upperArm(armJnts[0], upperArmJnts, "kin"+side+"upperArm")
        fr.forearm(lowerLegJnts, legJnts[2], "kin"+side+"lowerLeg")
        fr.upperArm(legJnts[0], upperLegJnts, "kin"+side+"upperLeg")
        
        #setup foot roll
        cmds.delete(legRes[1])
        cmds.parent(legRes[0][0], revFootJnts[3])
        newJnt = ru.addJntLayer(revFootJnts[0], "jnt")
        ikh = cmds.ikHandle(sj=footJnts[0], ee=footJnts[1], n="kin"+side+"foot1_ikh")
        cmds.rename(ikh[1], "kin"+side+"foot1_eff")
        cmds.parent(ikh[0], revFootJnts[2])
        ikh = cmds.ikHandle(sj=footJnts[1], ee=footJnts[2], n="kin"+side+"foot2_ikh")
        cmds.rename(ikh[1], "kin"+side+"foot2_eff")
        cmds.parent(ikh[0], revFootJnts[1])
        cmds.addAttr(legCtrls[0], ln="ball", at="double", dv=0)
        cmds.setAttr(legCtrls[0]+".ball", k=1)
        cmds.addAttr(legCtrls[0], ln="toe", at="double", dv=0)
        cmds.setAttr(legCtrls[0]+".toe", k=1)
        cmds.addAttr(legCtrls[0], ln="heel", at="double", dv=0)
        cmds.setAttr(legCtrls[0]+".heel", k=1)
        cmds.addAttr(legCtrls[0], ln="pivot", at="double", dv=0)
        cmds.setAttr(legCtrls[0]+".pivot", k=1)
        cmds.connectAttr(legCtrls[0]+".ball", revFootJnts[2]+".rz")
        cmds.connectAttr(legCtrls[0]+".toe", revFootJnts[1]+".rz")
        cmds.connectAttr(legCtrls[0]+".heel", revFootJnts[0]+".rz")
        cmds.connectAttr(legCtrls[0]+".pivot", revFootJnts[1]+".ry")
        cmds.parentConstraint(legCtrls[0], newJnt, mo=1, n="kin"+side+"leg_OC")
    
        
    ################
    ##Center Setup##
    ################
    #jnts
    neckChestJnts = ["kin_C_neckChest01_jnt", "kin_C_neckChest02_jntBnd", "kin_C_neckChest03_jntBnd"]
    sternumJnt = "kin_C_sternum01_jntBnd"
    #ctrls
    neckCtrl = "kin_C_neck_ctrl"
    cusSpineFKctrl = ["fkCtrl", "fkCtrl", "fkCtrl"]
    cusSpineIKctrl = ["ikCtrl", "ikCtrl", "ikCtrl"]
    #spine
    sp.spine("kin_C_spine__Ribbon", 3, "kin_C_spine", cusSpineIKctrl, cusSpineFKctrl)
    cmds.parent("kin_C_spine_FK1_grp", "kin_C_spine_IK1_grp", "kin_C_root_ctrl")
    #pelvis:
    cmds.orientConstraint("kin_C_pelvis_ctrl", "kin_C_pelvis_jntBnd", mo=1, n="kin_C_pelvis_OC")
    #set up the sternum to dampen downward neck movement
    md = cmds.createNode("multiplyDivide", n="kin_C_sternum_MD")
    cond = cmds.createNode("condition", n="kin_C_sternum_cond")
    cmds.connectAttr(neckChestJnts[0]+".ry", cond+".firstTerm")
    cmds.setAttr(cond+".operation", 3)
    cmds.connectAttr(neckChestJnts[0]+".ry", md+".input1Y")
    cmds.setAttr(md+".input2Y", -.5)
    cmds.connectAttr(md+".outputY", cond+".colorIfTrueR")
    cmds.connectAttr(cond+".outColorR", sternumJnt+".ry")
    
    #set up neck/chest dampens
    md2 = cmds.createNode("multiplyDivide", n="kin_C_neckChest_MD1")
    md3 = cmds.createNode("multiplyDivide", n="kin_C_neckChest_MD2")
    cmds.setAttr(md2+".input2X", .2)
    cmds.setAttr(md2+".input2Y", .5)
    cmds.setAttr(md2+".input2Z", 0)
    cmds.connectAttr(neckCtrl+".rx", md2+".input1X")
    cmds.connectAttr(neckCtrl+".ry", md2+".input1Y")
    cmds.connectAttr(neckCtrl+".rz", md2+".input1Z")
    cmds.setAttr(md3+".input2X", .3)
    cmds.setAttr(md3+".input2Y", .3)
    cmds.setAttr(md3+".input2Y", .3)
    cmds.connectAttr(neckCtrl+".rx", md3+".input1X")
    cmds.connectAttr(neckCtrl+".ry", md3+".input1Y")
    cmds.connectAttr(neckCtrl+".rz", md3+".input1Z")
    
    cmds.connectAttr(md2+".outputX", neckChestJnts[0]+".rx")
    cmds.connectAttr(md2+".outputY", neckChestJnts[0]+".ry")
    cmds.connectAttr(md2+".outputZ", neckChestJnts[0]+".rz")
    
    cmds.connectAttr(md3+".outputX", neckChestJnts[1]+".rx")
    cmds.connectAttr(md3+".outputY", neckChestJnts[1]+".ry")
    cmds.connectAttr(md3+".outputZ", neckChestJnts[1]+".rz")
    cmds.connectAttr(md3+".outputX", neckChestJnts[2]+".rx")
    cmds.connectAttr(md3+".outputY", neckChestJnts[2]+".ry")
    cmds.connectAttr(md3+".outputZ", neckChestJnts[2]+".rz")
    
    #parent/pointconstrain the neck ctrl
    cmds.parent("kin_C_neck_grp", "kin_C_spine_FK3_ctrl")
    cmds.pointConstraint("kin_C_neckChest03_jntBnd", "kin_C_neck_grp", mo=1, n="kin_C_neckPC")
    
    #more parenting
    cmds.parentConstraint("kin_C_root_ctrl", "kin_C_root_jntbnd", mo=1, n="kin_C_root_ParC")
    

   
def measureChain(jnts, name="char"):
    """
    creats a distanceBetween node between each item in the passed list and puts them all into a plusminus node
    essentially it creates a chain of measured links, and adds them all together
    """
    i=0
    pm = cmds.createNode("plusMinusAverage", n=name+"_PM")
    for j in jnts:
        if i == 0:
            locStart = cmds.spaceLocator(n=name+str(i+1)+"_loc")[0]
            cmds.pointConstraint(j, locStart, n=name+str(i+1)+"_PC", mo=0)
        if not i == len(jnts)-1:
            locEnd = cmds.spaceLocator(n=name+str(i+2)+"_loc")[0]
            cmds.pointConstraint(jnts[i+1], locEnd, n=name+str(i+2)+"_PC", mo=0)
            dis = cmds.createNode("distanceBetween", n=name+str(i+1)+"dis")
            cmds.connectAttr(locStart+".translate", dis+".point1")
            cmds.connectAttr(locEnd+".translate", dis+".point2")
            cmds.connectAttr(dis+".distance", pm+".input1D["+str(i)+"]")
            locStart = locEnd
        i+=1
    return pm
           


"""
##############  
##SCRATCH#####
##############
#working iwth blendshapes
#import re
w = cmds.blendShape("blendShape1", q=1, g=1)
print w 
w = cmds.getAttr("blendShape1.it[0].itg[0].tw[100]")
print w
		
midVerts = cmds.ls(sl=1, fl=1)
print midVerts

pattern = re.compile('(\[).*(\])')
for v in midVerts:
 match = pattern.search(v)
 vertNum = match.group(0)
 cmds.setAttr("blendShape1.it[0].itg[0].tw"+vertNum, .5)
 
 #working iwth blendshapes
import re
import pickle
verts = {"left":leftVerts, "right":rightVerts, "mid":midVerts}

fName = "kinHeadVerts.dat"
fPath = "../data/"
f=open(fPath+fName, "w")
pickle.dump(verts, f, 2)
f.close()

#load left verts
fName = "kinHeadVerts.dat"
fPath = "../data/"
f=open(fPath+fName, "r")
test= pickle.load(f)
f.close()
print test
for t in test:
 cmds.select(test[t], add=1)

cmds.select(rightVerts, midVerts, leftVerts)

pattern = re.compile('(\[).*(\])')
for v in midVerts:
 match = pattern.search(v)
 vertNum = match.group(0)
 cmds.setAttr("blendShape1.it[0].itg[0].tw"+vertNum, .5)

 #### working with blendshapes
 #working iwth blendshapes
import maya.cmds as cmds
import re
import pickle

#load left verts
fName = "kinHeadVerts.dat"
fPath = "../data/"
f=open(fPath+fName, "r")
verts = pickle.load(f)
f.close()
print verts
for t in verts:
 i = 0
 for v in verts[t]:
  verts[t][i] = v.replace("polySurface6", "Head")
  verts[t][i]
  i+=1
	
cmds.select(verts['right'], verts['left'], verts['mid'])
#setAttr "blendShape1.SmileRoot" 1;


sideList = [["left", "right"], ["right", "left"]]
###START HERE#############
pattern = re.compile('(\[).*(\])')
sel = cmds.ls(sl=1)
i = 1
for s in sel:
 print s
 n = i*5
 bs = cmds.blendShape((s, "Head"))[0]
 cmds.setAttr(bs+"."+s, 1) 

 ##set the middle
 for v in verts['mid']:
  match = pattern.search(v)
  vertNum = match.group(0)
  cmds.setAttr(bs+".it[0].itg[0].tw"+vertNum, .5)

 ##set the left and right
 for side in sideList:
  ###set the side to 0
  for v in verts[side[0]]:
   match = pattern.search(v)
   vertNum = match.group(0)
   cmds.setAttr(bs+".it[0].itg[0].tw"+vertNum, 0)
  #dup the side
  dup = cmds.duplicate("Head", n=side[1]+s.replace("root", ""))
  n = n * -1 
  print n
  cmds.move(n,0,0, dup)
  #set the side back to 1
  for v in verts[side[0]]:
   match = pattern.search(v)
   vertNum = match.group(0)
   cmds.setAttr(bs+".it[0].itg[0].tw"+vertNum, 1)

 cmds.delete(bs)
 i+=1

####END HERE

pattern = re.compile('(\[).*(\])')
for v in midVerts:
 match = pattern.search(v)
 vertNum = match.group(0)
 cmds.setAttr("blendShape1.it[0].itg[0].tw"+vertNum, .5)
 """