Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # ik-fk v1
- # Select shoulder joint
- # only works with shoulder, elbow, wrist, and hand/foot joint set-ups
- from pymel.core import *
- def getPiv(s):
- select(s)
- setToolTo('Move')
- piv = manipMoveContext('Move', q=True, p=True,m=2)
- return piv
- def getChain(s):
- print "gettign chain"
- jntChain = []
- limit = 4
- x = [s]
- while limit:
- jntChain.append(x)
- x = listRelatives(x,c=1)
- limit -= 1
- return jntChain
- print "returning ", jntChain
- def grpr(name):
- g = ls(name)
- if not g:
- g = group(n=name,em=1)
- return g
- def getPolePos(chain):
- root = chain[0]
- elbow = chain[1]
- wrist = chain[2]
- l = spaceLocator(n="test")
- pc = pointConstraint([root[0],wrist[0]], l,mo=0)
- ac = aimConstraint(elbow, l,aim = (0,0,1))
- delete(pc,ac)
- pc2 = pointConstraint(elbow, l)
- delete(pc2)
- move(l,0,0,5,os=1,r=1)
- lt = l.getTranslation()
- delete(l)
- return lt
- def makeFk(jntChain,mainCtrl):
- x = 0
- jntChainFk = duplicate(jntChain, n = jntChain[0][0]+"_fk")[0]
- fkMasterGrp = grpr(mainCtrl+"fk_master_grp")
- parent(jntChainFk,fkMasterGrp)
- jntChain = getChain(jntChainFk)
- #ctrlMasterGrp = grpr(jntChainFk[0]+"_fkCtrlGrp")
- #parent(ctrlMasterGrp,fkMasterGrp)
- jntChain = jntChain[:-1]
- fkCtrls = []
- for jnt in jntChain:
- jnt = jnt[0]
- ctrl = circle(n=jnt+"_fkCtrl")
- fkCtrls.append(ctrl)
- rotate(ctrl, 0,90,0)
- #makeIdentity(ctrl,a=1,t=1,r=1,s=1,n=0)
- #ctrlGrp = group(ctrl, n = ctrl[0]+"_grp",p=ctrlMasterGrp )
- tp = parentConstraint(jnt, ctrl)
- delete(tp)
- ac = aimConstraint(jnt.listRelatives(c=1), ctrl,aim = (0,0,1))
- delete(ac)
- ctrlGrp = zeroGrp(ctrl)
- parent(ctrlGrp, fkMasterGrp)
- oc = orientConstraint(ctrl,jnt,mo=1)
- if x == 0:
- parent(jnt,ctrl[0])
- pass
- else:
- pc = parentConstraint(jntChain[x-1][0],ctrlGrp,mo=1)
- setAttr(ctrl[0].tx, k=0)
- setAttr(ctrl[0].ty, k=0)
- setAttr(ctrl[0].tz, k=0)
- setAttr(ctrl[0].tx, k=0, cb=0)
- setAttr(ctrl[0].ty, k=0, cb=0)
- setAttr(ctrl[0].tz, k=0, cb=0)
- if x == 0:
- fkRootCtrl = ctrl
- # Lock attributes
- setAttr(ctrl[0].sx, l=1)
- setAttr(ctrl[0].sy, l=1)
- setAttr(ctrl[0].sz, l=1)
- setAttr(ctrl[0].tx, l=1)
- setAttr(ctrl[0].ty, l=1)
- setAttr(ctrl[0].tz, l=1)
- setAttr(ctrl[0].sx, k=0, cb=0)
- setAttr(ctrl[0].sy, k=0, cb=0)
- setAttr(ctrl[0].sz, k=0, cb=0)
- setAttr(ctrl[0].tx, k=0, cb=0)
- setAttr(ctrl[0].ty, k=0, cb=0)
- setAttr(ctrl[0].tz, k=0, cb=0)
- x += 1
- return fkMasterGrp,jntChain , fkCtrls
- def zeroGrp(s):
- s = s[0]
- pap = listRelatives(s,p=1)
- pos = s.getTranslation()
- rot = s.getRotation()
- scl = s.getScale()
- nwGrp = group(em=1, n= s+"_zeroGrp")
- move(s, 0,0,0)
- rotate(s,0,0,0)
- scale(s,1,1,1)
- parent(s,nwGrp)
- move(nwGrp, pos)
- rotate(nwGrp, rot)
- scale(nwGrp, scl)
- if pap:
- parent(nwGrp,pap)
- return nwGrp
- def makeMainCtrl(chain):
- wrist = chain[2][0]
- #wristCtlPosition = getPiv(wrist)
- mainCtrl = circle(n=chain[0][0]+"_mainCtrl_", r = .5,ch=0)
- pc = parentConstraint(wrist,mainCtrl)
- delete(pc)
- rotate(mainCtrl,0,90,0,r=1)
- move(mainCtrl[0],0,4,0,r=1)
- heroCtrlGrp = zeroGrp(mainCtrl)
- zGrp = listRelatives(mainCtrl,p=1)
- pc = parentConstraint(wrist,zGrp,mo=1)
- parent(heroCtrlGrp,masterArmRigCtrlGrp)
- return mainCtrl
- def getikChain(s):
- jntChain = []
- x = [s]
- limit = 4
- while limit:
- jntChain.append(x)
- x = listRelatives(x,c=1)
- limit -= 1
- return jntChain
- def makeIk(jntChain,mainCtrl):
- x = 0
- jntChainik = duplicate(jntChain, n = jntChain[0][0]+"_ik")[0]
- fkMasterGrp = grpr(mainCtrl[0]+"ik_master_grp")
- jntChain = getikChain(jntChainik)
- jntChainSave = jntChain
- handJnt = jntChain[-2][0]
- jntChain = jntChain[0]
- #ctrlMasterGrp = group(n = jntChainik[0]+"_ikCtrlGrp", em=1)
- #parent(ctrlMasterGrp,fkMasterGrp)
- #parent(jntChainik,ctrlMasterGrp)
- ctrlJnts = [jntChain[0],handJnt]
- i = 0
- for jnts in ctrlJnts:
- ctrl = circle(n=mainCtrl[0]+"_ikCtrl",ch=0)
- tp =parentConstraint(jnts, ctrl)
- delete(tp)
- ac = aimConstraint(jnts.listRelatives(c=1), ctrl,aim = (0,0,1))
- delete(ac)
- ctrlGrp = zeroGrp(ctrl)
- if i == 0:
- rootCtrl = ctrl
- parent(ctrlGrp,fkMasterGrp)
- i += 1
- pPos = getPolePos(jntChainSave)
- poleVCtrl = circle(n=mainCtrl[0]+"_poleVectorCtrl", r = .5,ch=0)
- move(poleVCtrl[0], pPos)
- poleVCtrlGrp = zeroGrp(poleVCtrl)
- parent(poleVCtrlGrp,fkMasterGrp)
- ikhand = ikHandle(sj = jntChain[0], ee = handJnt,sol = "ikRPsolver" )
- parent(ikhand[0],ctrl)
- parent(jntChain[0],rootCtrl)
- parent(poleVCtrlGrp,fkMasterGrp)
- oc = orientConstraint(ctrl,handJnt,mo=1)
- poleVec = poleVectorConstraint(poleVCtrl,ikhand[0],w=1)
- return fkMasterGrp,jntChainSave, rootCtrl, ctrl, poleVCtrl
- def connectStuff(jnts,mainCtrl,fkChain,ikChain, rootFks,rootIk, ctrlIk, poleVCtrl):
- #ojntChain = getChain(jnts)
- fkIkBlendAttr = addAttr(mainCtrl[0], ln="fk_ik_switch", at="double",min=0,max=1,dv=0)
- setAttr(mainCtrl[0]+".fk_ik_switch", e=1, k=1)
- mainCtrl= mainCtrl[0]
- i = 0
- ojntChain = jnts[:-1]
- for o in ojntChain:
- of = o[0].split("|")[-1]
- blendOc = orientConstraint([fkChain[i][0],ikChain[i][0]],ojntChain[i][0], n = of+"_fkIkConstraint")
- ocList = orientConstraint(blendOc,q=1,tl=1)
- print ocList
- ikJnt = ocList[1].split("|")[-1]
- fkJnt = ocList[0].split("|")[-1]
- if i == 0:
- pc = pointConstraint([fkChain[i][0],ikChain[i][0]],ojntChain[i][0], n = of+"_pointConstraint")
- # Root Snapping
- setDrivenKeyframe(pc+"."+fkJnt+"W0", cd = mainCtrl+".fk_ik_switch", v=1, dv=0)
- setDrivenKeyframe(pc+"."+ikJnt+"W1", cd = mainCtrl+".fk_ik_switch", v=0, dv=0)
- setDrivenKeyframe(pc+"."+fkJnt+"W0", cd = mainCtrl+".fk_ik_switch", v=0, dv=1)
- setDrivenKeyframe(pc+"."+ikJnt+"W1", cd = mainCtrl+".fk_ik_switch", v=1, dv=1)
- # Ik Fk blending
- #print rootFk[0],rootIk[0]
- for jnt in rootFks:
- setDrivenKeyframe(jnt[0].visibility, cd = mainCtrl+".fk_ik_switch", v=1, dv=0)# fk visablility
- setDrivenKeyframe(jnt[0].visibility, cd = mainCtrl+".fk_ik_switch", v=0, dv=1)
- # ik root
- setDrivenKeyframe(rootIk[0].visibility, cd = mainCtrl+".fk_ik_switch", v=0, dv=0)# Ik visablility
- setDrivenKeyframe(rootIk[0].visibility, cd = mainCtrl+".fk_ik_switch", v=1, dv=1)
- # ik ctrl
- setDrivenKeyframe(ctrlIk[0].visibility, cd = mainCtrl+".fk_ik_switch", v=1, dv=1)
- setDrivenKeyframe(ctrlIk[0].visibility, cd = mainCtrl+".fk_ik_switch", v=0, dv=0)
- ##
- setDrivenKeyframe(poleVCtrl[0].visibility, cd = mainCtrl+".fk_ik_switch", v=1, dv=1)
- setDrivenKeyframe(poleVCtrl[0].visibility, cd = mainCtrl+".fk_ik_switch", v=0, dv=0)
- ##
- setDrivenKeyframe(blendOc+"."+fkJnt+"W0", cd = mainCtrl+".fk_ik_switch", v=1, dv=0)
- setDrivenKeyframe(blendOc+"."+fkJnt+"W0", cd = mainCtrl+".fk_ik_switch", v=0, dv=1)
- setDrivenKeyframe(blendOc+"."+ikJnt+"W1", cd = mainCtrl+".fk_ik_switch", v=0, dv=0)
- setDrivenKeyframe(blendOc+"."+ikJnt+"W1", cd = mainCtrl+".fk_ik_switch", v=1, dv=1)
- i += 1
- print "Done Connecting things"
- sl = selected()
- jnts = sl[0]
- jnts = getChain(jnts)
- global masterArmRigCtrlGrp
- name = "R_masterArmRigCtrlGrp"
- masterArmRigCtrlGrp = grpr(name)
- mainCtrl = makeMainCtrl(jnts)
- #makeFk(jnts, mainCtrl)
- #makeIk(jnts, mainCtrl)
- fkMasterGrp, fkChain, rootFks = makeFk(jnts, mainCtrl[0])
- ikMasterGrp, ikChain, rootIk, ctrlIk, poleVCtrl = makeIk(jnts, mainCtrl)
- connectStuff(jnts,mainCtrl,fkChain,ikChain, rootFks,rootIk, ctrlIk,poleVCtrl)
- parent([fkMasterGrp,ikMasterGrp],masterArmRigCtrlGrp)
- print jnts[0][0].root()
- pc = parentConstraint(masterArmRigCtrlGrp,jnts[0][0].root().split("|")[0],mo=1)
- print "done"
Advertisement
Add Comment
Please, Sign In to add comment