Esempio n. 1
0
    def _makeRig(self, namer):
        #gather the bind joints and fk controls that were built
        bndJnts = []
        fkCtls = []
        for tok in self.__toks[:-1]:
            fkCtl = namer(tok, r='fk')
            if not MC.objExists(fkCtl):
                raise RuntimeError('%s does not exist'  % fkCtl)
            fkCtls.append(fkCtl)

        for tok in self.__toks:
            jnt = namer(tok, r='bnd')
            if not MC.objExists(jnt):
                raise RuntimeError('%s does not exist'  % jnt)
            bndJnts.append(jnt)

        MC.makeIdentity(bndJnts, apply=True, r=1, t=1, s=1)
        for jnt in bndJnts:
            control.setLockTag(jnt, uu=['t', 'r', 's'])

        for i, tok in enumerate(self.__toks[:3]):
            self.setPlugNode('bnd_%s' % tok, bndJnts[i])

        o = utils.Orientation()
        side = self.options.getValue('side')
        if side == 'rt':
            o.setAxis('aim', 'negY')
            o.reorientJoints(bndJnts)

        fkCtls = control.setupFkCtls(bndJnts[:-1], fkCtls, self.__toks[:-1], namer)
        for ctl in fkCtls:
            control.setLockTag(ctl, uk=['r'])

        namer.setTokens(r='ik')
        ikJnts = utils.dupJntList(bndJnts, self.__toks, namer)
        MC.setAttr('%s.v' % ikJnts[0], 0)


        ikCtl = namer('heel_ctl', r='ik')
        if not MC.objExists(ikCtl):
            raise RuntimeError("Cannot find '%s'" % ikCtl)

        MC.addAttr(ikCtl, ln='fkIk', min=0, max=1, dv=1, k=1)

        fkIkRev = utils.blendJointChains(fkCtls, ikJnts[:-1], bndJnts[:-1],
                                         '%s.fkIk' % ikCtl, namer)

        for ctl in fkCtls:
            MC.connectAttr('%s.outputX' % fkIkRev, '%s.v' % ctl)
        

        ikHandle, ikEff = MC.ikHandle(sj=ikJnts[0],
                                      ee=ikJnts[2],
                                      solver='ikRPsolver',
                                      n=namer.name('ikh'))

        #use the no-flip setup
        xp = utils.getXProductFromNodes(ikJnts[1],  ikJnts[0], ikJnts[2])
        sp = MC.xform(ikJnts[0], q=1, ws=1, t=1)
        l = MC.spaceLocator()[0]
        MC.xform(l, t=[sp[0] + xp[0], sp[1]+xp[1], sp[2]+xp[2]], ws=1)
        MC.delete(MC.poleVectorConstraint(l, ikHandle))
        MC.delete(l)
        MC.setAttr("%s.twist" % ikHandle, 90)

        MC.addAttr(ikCtl, ln='twist', dv=0, k=1)
        control.setLockTag(ikCtl, uk=['twist'])

        pma = MC.createNode('plusMinusAverage', n=namer('twist_pma'))
        MC.connectAttr("%s.twist" % ikCtl, "%s.input1D[0]" % pma)
        MC.setAttr("%s.input1D[1]" % pma, 90)
        MC.connectAttr("%s.output1D" % pma, "%s.twist" % ikHandle)

        del l, sp, xp


        ##set up the reverse foot
        #create the ik hanldes
        ikHandles = {}
        names = ['ankle', 'ball', 'toe', 'toetip']
        for i in range(len(names)-1):

            startIndex = self.__toks.index(names[i])
            endIndex = self.__toks.index(names[i+1])
            start = names[i]
            end = names[i+1]

            name = namer.name(d='revfoot_%s_to_%s_ikh' % (start, end),
                                 r='ik')
            handle = MC.ikHandle(sj=ikJnts[startIndex], ee=ikJnts[endIndex], n=name, sol='ikSCsolver')
            ikHandles[names[i+1]] = handle[0]
            MC.rename(handle[1], name + '_eff')



        #setup the toe control to have an inverse pivot
        toeCtl = namer('toe_ctl', r='ik')
        MC.connectAttr("%s.fkIk" % ikCtl, "%s.v" % toeCtl)
        
        MC.parent(toeCtl, ikCtl)
        utils.insertNodeAbove(toeCtl)

        toeCtlInv = MC.createNode('transform', n = namer('toe_inv', r='ik'))

        MC.parent(toeCtlInv, toeCtl)


        toeCtlInvMdn = MC.createNode('multiplyDivide', n=namer('toe_inv_mdn', r='ik'))
        MC.connectAttr('%s.t' % toeCtl, '%s.input1' % toeCtlInvMdn)
        MC.setAttr('%s.input2' % toeCtlInvMdn, -1, -1, -1, type='double3')
        MC.connectAttr('%s.output' % toeCtlInvMdn, '%s.t' % toeCtlInv)

        #setup the rev foot joints
        revFootJnts = {}
        revFkToks = ['heel', 'toetip', 'toe', 'ball', 'ankle']
        positions = [ikCtl, bndJnts[-1], bndJnts[-2], bndJnts[-3], bndJnts[-4]]


        MC.select(cl=1)
        for i in range(len(revFkToks)):
            tok = revFkToks[i]
            posNode = positions[i]
            pos = MC.xform(posNode, q=1, t=1, ws=1)
            if i == 1:
                pos[1] = MC.xform(positions[0], q=1, t=1, ws=1)[1]

            j = MC.joint(name=namer('%s_revfoot_jnt' % tok, r='ik'),
                     p = pos )
            revFootJnts[tok] = j
            if i == 0:
                MC.setAttr('%s.v' % j, 0)
        del i, j


        #orient the joints to aim down pos y and up axis along the plane formed by
        #the upper leg
        xp = utils.getXProductFromNodes(ikJnts[1],  ikJnts[0], ikJnts[2])
        for jnt in revFootJnts.values():
            utils.orientJnt(jnt, aimVec=[0,1,0], upVec=[1,0,0], worldUpVec=[xp[0],0,xp[2]])
        del jnt, xp


        MC.parent(revFootJnts['heel'], toeCtlInv)
        MC.parent(ikHandles['toetip'], revFootJnts['toetip'])
        MC.parent(ikHandles['toe'], revFootJnts['toe'])
        MC.parent(ikHandles['ball'], revFootJnts['ball'])
        MC.parent(ikHandle, revFootJnts['ankle'])


        #setup the foot roll
        self.__setupFootRoll(ikCtl, revFootJnts, namer)

        control.setLockTag(toeCtl, uk=['r', 't'])
        control.setLockTag(ikCtl, uk=['r', 't', 'fkIk'])
        
        self.setNodeCateogry(utils.insertNodeAbove(ikCtl, 'transform'), 'ik')
Esempio n. 2
0
    def _makeLayout(self, namer):
        """
        build the layout
        """
        positions = [(0,0,0),
                     (10,0,-2),
                     (20,0,0),
                     (25,0,0)]
        MC.select(cl=1)

        jnts = {}
        layoutCtls = {}
        #create/register bind joints and layout controls
        for i, tok in enumerate(self.__toks):
            jnts[tok] = MC.joint(p=positions[i], n = namer.name(r='bnd', d=tok))
            self.registerBindJoint(jnts[tok])
            layoutCtls[tok] = control.makeControl(namer.name(d='%s_layout' % tok, r='ctl'),
                                               shape='sphere', color='purple')

            self.registerControl(layoutCtls[tok], 'layout', uk=['t', 'r'])
            utils.snap(jnts[tok], layoutCtls[tok], orient=False)
            MC.select(jnts[tok])

        for i, tok in enumerate(self.__toks):
            utils.orientJnt(jnts[tok], aimVec=[0,1,0], upVec=[1,0,0], worldUpVec=[1,0,0])

            MC.setAttr('%s.s' % layoutCtls[tok], l=1)
            if tok != 'ankle':
                MC.setAttr('%s.r' % layoutCtls[tok], l=1)

        for tok in self.__toks[:-1]:
            MC.pointConstraint(layoutCtls[tok], jnts[tok], mo=False)

        #create up-vec locs
        l = MC.spaceLocator(n=namer.name(d='orientor_loc'))[0]
        MC.pointConstraint(layoutCtls['uparm'], layoutCtls['hand'], l)
        MC.aimConstraint(layoutCtls['loarm'], l,
                          aimVector=[0,0,1], upVector=[1,0,0],
                          worldUpType='object',
                          worldUpObject = layoutCtls['uparm'])
        MC.setAttr('%s.v' % l, 0)

        #aim the uparm at the loarm
        MC.aimConstraint(layoutCtls['loarm'], jnts['uparm'], aimVector=[0,1,0],
                         upVector=[0,0,1],
                         worldUpType='object',
                         worldUpObject=l)

        #aim the loarm at the hand
        MC.aimConstraint(layoutCtls['hand'], jnts['loarm'], aimVector=[0,1,0],
                         upVector=[0,0,1],
                         worldUpType='object',
                         worldUpObject=l)


        #setup hand twist
        MC.parent(layoutCtls['hand_tip'], layoutCtls['hand'])

        handTwistNode = MC.createNode('transform', n=namer.name(d='hand_orientor_loc'))
        MC.parent(handTwistNode, layoutCtls['hand'])
        MC.makeIdentity(handTwistNode, t=1, r=1, s=1)
        MC.aimConstraint(layoutCtls['hand_tip'], handTwistNode,
                         aimVector=[0,1,0],
                         upVector=[0,0,1],
                         worldUpVector=[0,0,1])


        handUpCtl = control.makeControl(namer('hand_up', r='ctl'),
                                                    shape='cube',
                                                    s=[.75, .75, .75],
                                                    color='blue')
        self.registerControl(handUpCtl, 'layout', uk=['t', 'r'])
        MC.parent(handUpCtl, handTwistNode)
        MC.makeIdentity(handUpCtl, t=1, r=1, s=1)
        MC.setAttr('%s.tz' % handUpCtl, 3)


        aimVec = [0,1,0]
        upVec = [0,0,1]
        # if self.options.getValue('side') == 'rt':
        #     upVec = [1,0,0]

        MC.aimConstraint(layoutCtls['hand_tip'], jnts['hand'],
                         aimVector=aimVec,
                         upVector=upVec,
                         worldUpType='object',
                         worldUpObject=handUpCtl)

        MC.pointConstraint(layoutCtls['hand_tip'], jnts['hand_tip'])


        #hand
        handCtl = control.makeControl(namer.name(d='ctl', r='ik'),
                                              shape='jack',
                                              color='red',
                                              xformType='joint',
                                              s=[2,2,2])


        control.setEditable(handCtl, True)

        self.registerControl(handCtl, 'rig')

        par = utils.insertNodeAbove(handCtl)
        utils.snap(jnts['hand'], par, orient=False)

        MC.parentConstraint(jnts['hand'], par, mo=True)


        #pole vector
        pvPar = MC.createNode('transform', name=namer('pv_par_pvPar'))
        MC.pointConstraint(layoutCtls['uparm'], layoutCtls['hand'], pvPar)




        MC.aimConstraint(layoutCtls['hand'], pvPar, aimVector=[0,1,0],
                         upVector=[1,0,0],
                         worldUpType='object',
                         worldUpObject=layoutCtls['loarm'])

        pv = control.makeControl(namer('polevec', r='ik'),
                                       shape='diamond',
                                       color='salmon',
                                       s=[.5,.5,.5])
        MC.parent(pv, pvPar)
        MC.makeIdentity(pv, t=1, r=1, s=1)

        control.setEditable(pv, True)
        self.registerControl(pv, 'rig')

        zero = utils.insertNodeAbove(pv)

        dst = MC.createNode('distanceBetween', name=namer('pv_dst'))
        MC.connectAttr('%s.worldMatrix' % pvPar, '%s.im1' % dst)
        MC.connectAttr('%s.worldMatrix' % layoutCtls['uparm'], '%s.im2' % dst)
        mdn = MC.createNode('multiplyDivide', n=namer('pv_dst_mdn'))
        MC.connectAttr('%s.distance' % dst, '%s.input1X' % mdn)
        MC.setAttr('%s.input2X' % mdn, 2)
        MC.connectAttr("%s.outputX" % mdn, "%s.tx" % zero)
        MC.setAttr('%s.tz' % pv, l=1)

        #FK
        for tok, jnt in jnts.items():
            if tok == 'hand_tip':
                continue
            ctl = control.makeControl(namer.name(tok, r='fk'),
                                shape='cube',
                                color='yellow',
                                s=[2,2,2])

            control.setEditable(ctl, True)
            utils.snap(jnt, ctl)

            self.registerControl(ctl, ctlType='rig')

            #center and scale it
            childJnt = jnts[self.__toks[self.__toks.index(tok)+1]]
            control.centeredCtl(jnt, childJnt, ctl)

        return namer
Esempio n. 3
0
    def _makeLayout(self, namer):
        """
        build the layout
        """
        positions = [(0,20,0),
                     (0,12,1),
                     (0,3,0),
                     (0,0,3),
                     (0,0,6),
                     (0,0,8)]

        legJoints = {}
        legCtls = {}
        MC.select(cl=1)

        #create/register bind joints and layout controls
        for i, tok in enumerate(self.__toks):
            legJoints[tok] = MC.joint(p=positions[i], n = namer.name(r='bnd', d=tok))
            self.registerBindJoint(legJoints[tok])

            legCtls[tok] = control.makeControl(namer.name(d='%s_layout' % tok, r='ctl'),
                                               shape='sphere',
                                               color='purple')

            if tok == 'ankle':
                self.registerControl(legCtls[tok], 'layout', uk=['t', 'ry'])
            elif tok in ['ball', 'toe']:
                self.registerControl(legCtls[tok], 'layout', uk=['ty', 'tz'])
            elif tok == 'toetip':
                self.registerControl(legCtls[tok], 'layout', uk=['tz'])
            else:
                self.registerControl(legCtls[tok], 'layout', uk=['t'])

            utils.snap(legJoints[tok], legCtls[tok], orient=False)
            MC.select(legJoints[tok])

        for i, tok in enumerate(self.__toks):
            utils.orientJnt(legJoints[tok], aimVec=[0,1,0], upVec=[1,0,0], worldUpVec=[1,0,0])


        ankleCtl = legCtls['ankle']
        for tok in ['ball', 'toe']:
            ctl = legCtls[tok]
            MC.parent(ctl, ankleCtl)

        MC.parentConstraint(legCtls['ankle'], utils.insertNodeAbove(legCtls['toetip']),
                            skipTranslate=['y'], mo=True)

        MC.pointConstraint(legCtls['hip'], legJoints['hip'], mo=False)
        MC.pointConstraint(legCtls['knee'], legJoints['knee'], mo=False)
        MC.pointConstraint(legCtls['ankle'], legJoints['ankle'], mo=True)

        #create up-vec locs
        l = MC.spaceLocator(n=namer.name(d='orientor_loc'))[0]
        MC.pointConstraint(legCtls['hip'], legCtls['ankle'], l)
        MC.aimConstraint(legCtls['knee'], l,
                          aimVector=[0,0,1], upVector=[1,0,0],
                          worldUpType='object',
                          worldUpObject = legCtls['hip'])
        MC.setAttr('%s.v' % l, 0)

        #aim the hip at the knee
        MC.aimConstraint(legCtls['knee'], legJoints['hip'], aimVector=[0,1,0],
                         upVector=[1,0,0],
                         worldUpVector=[0,-1,0],
                         worldUpType='objectRotation',
                         worldUpObject=l)

        #aim the knee at the ankle
        MC.aimConstraint(legCtls['ankle'], legJoints['knee'], aimVector=[0,1,0],
                         upVector=[1,0,0],
                         worldUpVector=[0,-1,0],
                         worldUpType='objectRotation',
                         worldUpObject=l)

        #setup IK
        for pr in [('ankle', 'ball'), ('ball', 'toe'), ('toe', 'toetip')]:
            handle = MC.ikHandle(solver='ikSCsolver', sj=legJoints[pr[0]],
                                 ee=legJoints[pr[1]],
                                 n=namer.name(d='%s_ikh' % pr[1]))[0]
            MC.parent(handle, legCtls[pr[1]])
            MC.makeIdentity(handle)
            MC.setAttr("%s.v" % handle, 0)
            utils.createStretch(legCtls[pr[0]], legCtls[pr[1]], legJoints[pr[0]], namer)

        #kneeIK
        toeIkCtl = control.makeControl(namer('toe_ctl', r='ik'),
                                        shape='circle',
                                        color='red',
                                        s=[2,2,2])
        toeLayoutCtl = control.makeControl(namer('toe_layout_ctl', r='ik'),
                                                 shape='cube',
                                                 color='purple',
                                                 s=[2, .75, 2])
        control.setEditable(toeIkCtl, True)
        self.registerControl(toeIkCtl, 'rig')

        self.registerControl(toeLayoutCtl, 'layout', uk=['tx', 'tz'])
        MC.parent(toeIkCtl, toeLayoutCtl)


        utils.snap(legJoints['toe'], toeLayoutCtl, orient=False)
        par = utils.insertNodeAbove(toeLayoutCtl)
        pm.pointConstraint(legJoints['toe'], par, mo=False, skip='y')

        #heel
        heelCtl = control.makeControl(namer.name(d='heel_ctl', r='ik'),
                                      shape='jack',
                                      color='red',
                                      s=[2,2,2])

        heelLayoutCtl = control.makeControl(namer('heel_layout_ctl', r='ik'),
                                                 shape='cube',
                                                 color='purple',
                                                 s=[3, 1, 3])
        self.registerControl(heelLayoutCtl, 'layout', uk=['tx', 'tz'])
        MC.parent(heelCtl, heelLayoutCtl)

        utils.snap(legJoints['ball'], heelLayoutCtl, orient=False)
        MC.setAttr("%s.tz" % heelLayoutCtl, -.5)
        par = utils.insertNodeAbove(heelLayoutCtl)
        pm.parentConstraint(legCtls['ankle'], par, mo=True, skipTranslate=['y'])
        control.setEditable(heelCtl, True)
        self.registerControl(heelCtl, 'rig')

        #FK
        for tok, jnt in legJoints.items():
            if tok == 'toetip':
                continue
            ctl = control.makeControl(namer.name(tok, r='fk'),
                                shape='cube',
                                color='green',
                s=[2,2,2])
            control.setEditable(ctl, True)
            utils.snap(jnt, ctl)

            self.registerControl(ctl, ctlType='rig')

            #center and scale it
            childJnt = legJoints[self.__toks[self.__toks.index(tok)+1]]
            control.centeredCtl(jnt, childJnt, ctl)

        return namer