Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #ik-fk
- # Select Ctrl, then joint chain
- from pymel.core import *
- def getChain(s):
- jntChain = []
- x = [s]
- while x:
- jntChain.append(x)
- x = listRelatives(x,c=1)
- return jntChain
- def makeFk(jntChain,mainCtrl):
- x = 0
- jntChainFk = duplicate(jntChain, n = jntChain+"_fk")[0]
- jntChain = getChain(jntChainFk)
- ctrlMasterGrp = group(n = jntChainFk[0]+"_fkCtrlGrp", em=1)
- parent(ctrlMasterGrp,mainCtrl)
- 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, ctrlGrp)
- delete(tp)
- 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, l=1)
- setAttr(ctrl[0].ty, l=1)
- setAttr(ctrl[0].tz, l=1)
- 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
- setAttr(ctrl[0].sx, l=1)
- setAttr(ctrl[0].sy, l=1)
- setAttr(ctrl[0].sz, 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)
- x += 1
- return jntChain , fkCtrls
- def makeIk(jntChain,mainCtrl):
- x = 0
- jntChainik = duplicate(jntChain, n = jntChain+"_ik")[0]
- jntChain = getChain(jntChainik)
- jntChain = jntChain[:-1]
- handJnt = jntChain[-1]
- ctrlMasterGrp = group(n = jntChainik[0]+"_ikCtrlGrp", em=1)
- parent(ctrlMasterGrp,mainCtrl)
- parent(jntChainik,ctrlMasterGrp)
- ctrlJnts = [jntChain[0],handJnt]
- i = 0
- for jnts in ctrlJnts:
- ctrl = circle(n=jnts[0]+"_ikCtrl")
- ctrlGrp = group(ctrl, n = ctrl[0]+"_grp",p=ctrlMasterGrp )
- tp =parentConstraint(jnts, ctrlGrp)
- delete(tp)
- if i == 0:
- rootCtrl = ctrl
- i += 1
- # pole vector
- pVJoint = jntChain[1]
- pVCtrl = circle(n=pVJoint[0]+"_poleVectorCtrl", r = .5)
- delete(pVCtrl[-1], ch=1)
- pVCtrlGrp = group(pVCtrl, n = pVCtrl[0]+"_grp",p=ctrlMasterGrp)
- p = pointConstraint(pVJoint, pVCtrlGrp)
- delete(p)
- pvc = orientConstraint([jntChain[0][0],pVJoint[0]], pVCtrlGrp,mo=0)
- delete(pvc)
- move(pVCtrlGrp,0,4,0, r=1,os=1,wd=1)
- parent(pVCtrlGrp, ctrl)
- ikhand = ikHandle(sj = jntChain[0][0], ee = jntChain[-1][0],sol = "ikRPsolver" )
- parent(ikhand[0],ctrl)
- parent(jntChain[0],rootCtrl)
- oc = orientConstraint(ctrl,handJnt)
- print pVCtrl,ikhand[0]
- poleVec = poleVectorConstraint(pVCtrl,ikhand[0],w=1)
- return jntChain, rootCtrl, ctrl
- def connectStuff(jnts,mainCtrl,fkChain,ikChain,rootFk,rootIk,ctrlIk):
- ojntChain = getChain(jnts)
- fkIkBlendAttr = addAttr(mainCtrl, ln="fk_ik_switch", at="double",min=0,max=1,dv=0)
- setAttr(mainCtrl+".fk_ik_switch", e=1, k=1)
- i = 0
- ojntChain = ojntChain[:-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)
- ikJnt = ocList[1].split("|")[-1]
- fkJnt = ocList[0].split("|")[-1]
- if i == 0:
- #print "making parent constraint"
- 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(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
- sl = selected()
- mainCtrl = sl[1]
- jnts = sl[0]
- fkChain, rootFks = makeFk(jnts, mainCtrl)
- ikChain, rootIk, ctrlIk = makeIk(jnts, mainCtrl)
- connectStuff(jnts,mainCtrl,fkChain,ikChain, rootFks,rootIk, ctrlIk)
- #____________________________
- """
- from pymel.core import *
- def getPiv(s):
- print s
- for ss in s:
- select(ss,add=1)
- #select(s)
- setToolTo('Move')
- piv = manipMoveContext('Move', q=True, p=True,m=2)
- return piv
- def getChain(s):
- jntChain = []
- x = [s]
- while x:
- jntChain.append(x)
- x = listRelatives(x,c=1)
- handJnt = jntChain[-1]
- return jntChain[:-1], handJnt
- def getPolePos(chain):
- root = chain[0]
- elbow = chain[1]
- wrist = chain[2]
- l = spaceLocator(n="test")
- pc = pointConstraint([root[0],wrist[0]], l)
- ac = aimConstraint(elbow, l)
- delete(pc,ac)
- pc2 = pointConstraint(elbow, l)
- delete(pc2)
- move(l,5,0,0,os=1,r=1)
- sl = selected()
- for s in sl:
- chain, handJoint = getChain(s)
- polePos = getPolePos(chain)
- """
Advertisement
Add Comment
Please, Sign In to add comment