cwisbg

ik-fk

Jul 30th, 2013
318
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.32 KB | None | 0 0
  1. #ik-fk
  2. # Select Ctrl, then joint chain
  3. from pymel.core import *
  4. def getChain(s):
  5.     jntChain = []
  6.     x = [s]
  7.     while x:
  8.         jntChain.append(x)
  9.         x = listRelatives(x,c=1)
  10.     return jntChain  
  11. def makeFk(jntChain,mainCtrl):
  12.     x = 0
  13.     jntChainFk = duplicate(jntChain, n = jntChain+"_fk")[0]
  14.     jntChain = getChain(jntChainFk)
  15.     ctrlMasterGrp = group(n = jntChainFk[0]+"_fkCtrlGrp", em=1)
  16.     parent(ctrlMasterGrp,mainCtrl)
  17.     jntChain = jntChain[:-1]
  18.     fkCtrls = []
  19.     for jnt in jntChain:  
  20.         jnt = jnt[0]
  21.         ctrl = circle(n=jnt+"_fkCtrl")
  22.         fkCtrls.append(ctrl)
  23.         rotate(ctrl, 0,90,0)
  24.         makeIdentity(ctrl,a=1,t=1,r=1,s=1,n=0)
  25.         ctrlGrp = group(ctrl, n = ctrl[0]+"_grp",p=ctrlMasterGrp )
  26.         tp =parentConstraint(jnt, ctrlGrp)
  27.         delete(tp)
  28.         oc = orientConstraint(ctrl,jnt,mo=1)
  29.         if x == 0:
  30.             parent(jnt,ctrl[0])
  31.             pass
  32.         else:
  33.             pc = parentConstraint(jntChain[x-1][0],ctrlGrp,mo=1)
  34.             setAttr(ctrl[0].tx, l=1)  
  35.             setAttr(ctrl[0].ty, l=1)
  36.             setAttr(ctrl[0].tz, l=1)
  37.             setAttr(ctrl[0].tx, k=0, cb=0)
  38.             setAttr(ctrl[0].ty, k=0, cb=0)
  39.             setAttr(ctrl[0].tz, k=0, cb=0)
  40.         if x == 0:
  41.             fkRootCtrl = ctrl
  42.         setAttr(ctrl[0].sx, l=1)  
  43.         setAttr(ctrl[0].sy, l=1)
  44.         setAttr(ctrl[0].sz, l=1)
  45.         setAttr(ctrl[0].sx, k=0, cb=0)
  46.         setAttr(ctrl[0].sy, k=0, cb=0)
  47.         setAttr(ctrl[0].sz, k=0, cb=0)
  48.         x += 1
  49.     return jntChain , fkCtrls
  50. def makeIk(jntChain,mainCtrl):
  51.     x = 0
  52.     jntChainik = duplicate(jntChain, n = jntChain+"_ik")[0]
  53.     jntChain = getChain(jntChainik)
  54.     jntChain = jntChain[:-1]
  55.     handJnt = jntChain[-1]
  56.     ctrlMasterGrp = group(n = jntChainik[0]+"_ikCtrlGrp", em=1)
  57.     parent(ctrlMasterGrp,mainCtrl)    
  58.     parent(jntChainik,ctrlMasterGrp)
  59.     ctrlJnts = [jntChain[0],handJnt]
  60.     i = 0
  61.     for jnts in ctrlJnts:
  62.         ctrl = circle(n=jnts[0]+"_ikCtrl")
  63.         ctrlGrp = group(ctrl, n = ctrl[0]+"_grp",p=ctrlMasterGrp )
  64.         tp =parentConstraint(jnts, ctrlGrp)
  65.         delete(tp)
  66.         if i == 0:
  67.             rootCtrl = ctrl
  68.         i += 1
  69.     # pole vector
  70.     pVJoint = jntChain[1]
  71.     pVCtrl = circle(n=pVJoint[0]+"_poleVectorCtrl", r = .5)
  72.     delete(pVCtrl[-1], ch=1)
  73.    
  74.     pVCtrlGrp = group(pVCtrl, n = pVCtrl[0]+"_grp",p=ctrlMasterGrp)
  75.    
  76.     p = pointConstraint(pVJoint, pVCtrlGrp)
  77.     delete(p)
  78.     pvc = orientConstraint([jntChain[0][0],pVJoint[0]], pVCtrlGrp,mo=0)
  79.     delete(pvc)  
  80.     move(pVCtrlGrp,0,4,0, r=1,os=1,wd=1)  
  81.     parent(pVCtrlGrp, ctrl)
  82.  
  83.     ikhand = ikHandle(sj = jntChain[0][0], ee = jntChain[-1][0],sol = "ikRPsolver" )
  84.     parent(ikhand[0],ctrl)
  85.     parent(jntChain[0],rootCtrl)
  86.     oc = orientConstraint(ctrl,handJnt)
  87.     print pVCtrl,ikhand[0]
  88.     poleVec = poleVectorConstraint(pVCtrl,ikhand[0],w=1)
  89.     return jntChain, rootCtrl, ctrl
  90.    
  91. def connectStuff(jnts,mainCtrl,fkChain,ikChain,rootFk,rootIk,ctrlIk):
  92.     ojntChain = getChain(jnts)
  93.     fkIkBlendAttr = addAttr(mainCtrl, ln="fk_ik_switch", at="double",min=0,max=1,dv=0)
  94.     setAttr(mainCtrl+".fk_ik_switch",  e=1, k=1)
  95.     i = 0
  96.     ojntChain = ojntChain[:-1]
  97.     for o in ojntChain:
  98.         of = o[0].split("|")[-1]
  99.         blendOc = orientConstraint([fkChain[i][0],ikChain[i][0]],ojntChain[i][0], n = of+"_fkIkConstraint")
  100.         ocList = orientConstraint(blendOc,q=1,tl=1)        
  101.         ikJnt = ocList[1].split("|")[-1]
  102.         fkJnt = ocList[0].split("|")[-1]
  103.                
  104.         if i == 0:
  105.             #print "making parent constraint"
  106.             pc = pointConstraint([fkChain[i][0],ikChain[i][0]],ojntChain[i][0], n = of+"_pointConstraint")
  107.             # Root Snapping
  108.             setDrivenKeyframe(pc+"."+fkJnt+"W0", cd = mainCtrl+".fk_ik_switch", v=1, dv=0)
  109.             setDrivenKeyframe(pc+"."+ikJnt+"W1", cd = mainCtrl+".fk_ik_switch", v=0, dv=0)
  110.             setDrivenKeyframe(pc+"."+fkJnt+"W0", cd = mainCtrl+".fk_ik_switch", v=0, dv=1)
  111.             setDrivenKeyframe(pc+"."+ikJnt+"W1", cd = mainCtrl+".fk_ik_switch", v=1, dv=1)
  112.         # Ik Fk blending
  113.         #print rootFk[0],rootIk[0]
  114.         for jnt in rootFks:
  115.             setDrivenKeyframe(jnt[0].visibility, cd = mainCtrl+".fk_ik_switch", v=1, dv=0)# fk visablility
  116.             setDrivenKeyframe(jnt[0].visibility, cd = mainCtrl+".fk_ik_switch", v=0, dv=1)
  117.         # ik root
  118.         setDrivenKeyframe(rootIk[0].visibility, cd = mainCtrl+".fk_ik_switch", v=0, dv=0)# Ik visablility
  119.         setDrivenKeyframe(rootIk[0].visibility, cd = mainCtrl+".fk_ik_switch", v=1, dv=1)
  120.         # ik ctrl
  121.         setDrivenKeyframe(ctrlIk[0].visibility, cd = mainCtrl+".fk_ik_switch", v=1, dv=1)
  122.         setDrivenKeyframe(ctrlIk[0].visibility, cd = mainCtrl+".fk_ik_switch", v=0, dv=0)
  123.                        
  124.                        
  125.         setDrivenKeyframe(blendOc+"."+fkJnt+"W0", cd = mainCtrl+".fk_ik_switch", v=1, dv=0)
  126.         setDrivenKeyframe(blendOc+"."+fkJnt+"W0", cd = mainCtrl+".fk_ik_switch", v=0, dv=1)
  127.  
  128.         setDrivenKeyframe(blendOc+"."+ikJnt+"W1", cd = mainCtrl+".fk_ik_switch", v=0, dv=0)
  129.         setDrivenKeyframe(blendOc+"."+ikJnt+"W1", cd = mainCtrl+".fk_ik_switch", v=1, dv=1)
  130.         i += 1  
  131.      
  132. sl = selected()
  133. mainCtrl = sl[1]
  134. jnts = sl[0]
  135. fkChain, rootFks = makeFk(jnts, mainCtrl)
  136. ikChain, rootIk, ctrlIk = makeIk(jnts, mainCtrl)
  137. connectStuff(jnts,mainCtrl,fkChain,ikChain, rootFks,rootIk, ctrlIk)
  138.  
  139.  
  140.  
  141.  
  142.  
  143.  
  144.  
  145.  
  146. #____________________________
  147. """
  148. from pymel.core import *
  149. def getPiv(s):
  150.    print s
  151.    for ss in s:
  152.        select(ss,add=1)
  153.    #select(s)
  154.    setToolTo('Move')
  155.    piv = manipMoveContext('Move', q=True, p=True,m=2)  
  156.    return piv
  157. def getChain(s):
  158.    jntChain = []
  159.    x = [s]
  160.    while x:
  161.        jntChain.append(x)
  162.        x = listRelatives(x,c=1)
  163.    handJnt = jntChain[-1]
  164.  
  165.    return jntChain[:-1], handJnt
  166.  
  167. def getPolePos(chain):
  168.    root = chain[0]
  169.    elbow = chain[1]
  170.    wrist = chain[2]
  171.    l = spaceLocator(n="test")
  172.    pc = pointConstraint([root[0],wrist[0]], l)
  173.    ac = aimConstraint(elbow, l)
  174.    delete(pc,ac)
  175.    pc2 = pointConstraint(elbow, l)
  176.    delete(pc2)
  177.    move(l,5,0,0,os=1,r=1)
  178.    
  179. sl = selected()
  180. for s in sl:
  181.    chain, handJoint = getChain(s)
  182.    polePos = getPolePos(chain)
  183.  
  184. """
Advertisement
Add Comment
Please, Sign In to add comment