示例#1
0
    def postRig(self):
        '''
        clean up for the rig build.
        '''
        if common.isValid('%s.jointVis' % self.rigGrp):
            return True
        
        if cmds.ls(type = 'rig') and common.isValid(self.controlsGrp) and not common.isValid(self.rigGrp):
            return True
        
        jointVisAttr     = attribute.addAttr(self.rigGrp, 'jointVis', attrType = 'enum', defValue = 'off:on')
        scaleAttr        = attribute.addAttr(self.rigGrp, 'uniformScale', attrType = 'double', defValue = 1, min = 0)
        jointDisplayAttr = attribute.addAttr(self.rigGrp, 'displayJnts', attrType = 'enum', defValue = 'Normal:Template:Reference')
        
        cmds.setAttr(jointDisplayAttr, 2)
        
        #setup attribute for uniform scale
        attribute.connect(scaleAttr, '%s.sx' % self.rigGrp)
        attribute.connect(scaleAttr, '%s.sy' % self.rigGrp)
        attribute.connect(scaleAttr, '%s.sz' % self.rigGrp)
            
        if self.skinClusterJnts:
            for jnt in self.skinClusterJnts:
                if cmds.objExists(jnt):
                    attribute.connect(jointVisAttr , '%s.v' % jnt)
                    cmds.setAttr('%s.overrideEnabled' % jnt, 1)
                    attribute.connect(jointDisplayAttr , '%s.overrideDisplayType' % jnt)

        #set joint visibility attribute
        cmds.setAttr(jointVisAttr, 1)
        
        for grp in [self.rigGrp, self.jointsGrp, self.controlsGrp]:
            attribute.lockAndHide(['t', 'r', 's', 'v'], grp)
示例#2
0
文件: rig.py 项目: jonntd/japeto
    def postBuild(self):
        """
        clean up rig asset
        
        .. todo: Finish complete cleanup of the rig
        """
        # create nodes on the rigGrp node
        tagControlsAttr = control.tag_as_control(self.rigGrp)
        cmds.addAttr(self.rigGrp, ln="deform_joints", at="message")
        tagJointsAttr = "%s.deform_joints" % self.rigGrp

        if self.controls:
            for ctrl in self.controls:
                attribute.connect(tagControlsAttr, "%s.%s" % (ctrl, tagControlsAttr.split(".")[1]))
            # end loop
        # end if

        if self.skinClusterJoints:
            for jnt in self.skinClusterJoints:
                if common.isValid(jnt):
                    cmds.addAttr(jnt, ln="deform_joints", at="message")
                    attribute.connect(tagJointsAttr, "%s.deform_joints" % jnt)
                # end if
            # end loop
        # end if

        # lock and hide attributes
        attribute.lockAndHide(["s", "v"], [self._shotCtrl, self._trsCtrl])
        attribute.lockAndHide(["t", "r", "s", "v"], self.rigGrp)

        # clear selection
        cmds.select(cl=True)
示例#3
0
    def postSetupRig(self):
        '''
        clean up section for the setup rig
        '''
        if common.isValid('%s.displayAxis' % self.masterGuide) or common.isValid(self.masterGuide) != True:
            return True
        #create attributes and lock/hide attrs on top nodes as well as masterGuide control
        displayAttr = attribute.addAttr(self.masterGuide, 'displayAxis', attrType = 'enum', defValue = 'off:on')
        attribute.lockAndHide(['r','t','s','v'], [self.setupRigGrp, self.skeletonGrp,self.guidesGrp, common.getParent(self.masterGuide)])
        attribute.lockAndHide('v', self.masterGuide)
        
        #resize guide controls
        for guide in self.getGuides():
            cmds.setAttr('%s.radius' % common.getShapes(guide, 0), self.controlScale * .5)
        
        #resize masterGuide control
        control.scaleShape(self.masterGuide, scale = [self.controlScale * 2, self.controlScale * 2, self.controlScale * 2])
        
        #declaring skeleton joints
        skeletonJnts = self.getSkeletonJnts()
        
        #connect joints to the attributes on the masterGuide control
        for jnt in skeletonJnts:
            if cmds.objExists(jnt):
                attribute.connect(displayAttr , '%s.displayLocalAxis' % jnt)
                common.setDisplayType(jnt, 'reference')

        #parent all constraints to guides group
        if self.setupConstraints:
            cmds.parent(self.setupConstraints, self.guidesGrp)

        #Put the build attributes onto setup rigs
        '''
        cmds.addAttr(self.setupRigGrp, ln = 'kwargs', dt = "string")
        cmds.setAttr('%s.kwargs' % self.setupRigGrp, str(self._buildAttrs), type = "string")
        '''
        attribute.copy('displayAxis', self.masterGuide, self.name(), reverseConnect = True)
        
        #parent setup under puppet node
        self._puppetNode.addChild(self.setupRigGrp)
        
        if self.parentHook:
            if cmds.objExists(self.parentHook):
                displayLine = control.displayLine(self.masterGuide, self.parentHook, name = self.masterGuide.replace('_%s' % common.GUIDES, '_%s' % common.CURVE))
                cmds.parent(displayLine, self.guidesGrp)

        #set build args on puppet node
        attrs = dict()
        for attr in self.attributes():
            attrs[attr.name()] = attr.value()
        self.puppetNode.storeArgs(**attrs)
示例#4
0
 def setupCtrl(self, name, obj, color = None):
     '''
     :param name: The name of control created
     :type name: *str*	
     
     :param obj: object to be controled
     :type obj: str
     
     :param color: object to be controled
     :type color: str
     
     :return: Guide control
     :rtype: str	
     '''
     #create hierarchy
     guideZero = cmds.createNode('transform', n = '%s_%s' % (name, common.ZERO))
     guideShape = cmds.createNode('implicitSphere',n = '%s_%sShape' % (name,common.GUIDES))
     guide = common.getParent(guideShape)
     guide = cmds.rename(guide, name + '_' + common.GUIDES)
     
     #set color
     if color:
         common.setColor(guideShape, color)
     else:
         common.setColor(guideShape, common.SIDE_COLOR[self._getSide()])
     
     #parent guide to zero group
     cmds.parent(guide, guideZero)
     
     cmds.delete(cmds.parentConstraint(obj, guideZero, mo = False))
     
     constraint = cmds.pointConstraint(guide, obj)
     
     cmds.parent([guideZero, constraint[0]],self.masterGuide)
     
     #lock and hide attributes
     attribute.lockAndHide(['r','s', 'v'], guide)
     
     #tag the guide control with a tag_guides attribute
     tagAttr = attribute.addAttr(guide, 'tag_guides', attrType = 'message')
     
     #connect attribute to the setupRigGrp
     attribute.connect('%s.tag_guides' % self.setupRigGrp, tagAttr)
     
     return guide
示例#5
0
文件: hand.py 项目: jonntd/japeto
    def postRig(self):
        if super(Hand, self).postRig():
            return True

        #TODO: Place build code for fingers here
        for obj in self.fingers:
            self.__fingers[obj].postRig()
            self.skinClusterJnts.extend(self.__fingers[obj].skinClusterJnts)
            #assign hooks
            self.hookRoot.extend(self.__fingers[obj].hookRoot)

        cmds.delete(self.handJoint)

        self.hookRoot.append(common.getParent(self.__handCtrl))
        attribute.lockAndHide(['t', 'r', 's', 'v'], self.__handCtrl)

        
        
        
示例#6
0
文件: foot.py 项目: jonntd/japeto
    def postRig(self):
        super(Foot, self).postRig()

        #lock bank controls
        for node in (self.__bankInCtrl,self.__bankOutCtrl, self.__heelPivotCtrl):
            if common.isValid(node):
                attribute.lockAndHide(['rx','s', 'v'], node)
            #end if
        #end loop

        #lock and hide foot control attributes
        attribute.lockAndHide(['t', 'r', 's', 'v'], self.__footCtrl)

        for handle in self.__footIkFk.getIkHandles():
            cmds.setAttr('%s.v' % handle, 0 )
        #end loop

        cmds.setAttr('%s.v' % self.__footIkFk.ikJoints[0], 0)
        cmds.setAttr('%s.v' % self.__footIkFk.fkJoints[0], 0)
        cmds.setAttr('%s.v' % self.__footIkFk.blendJoints[0], 0)
示例#7
0
文件: limb.py 项目: jonntd/japeto
 def postRig(self):
     super(Limb, self).postRig()
     attribute.lockAndHide(['s', 'v'],self.controls['ik'][0])
     attribute.lockAndHide(['r','s', 'v'],self.controls['ik'][1])
示例#8
0
文件: limb.py 项目: jonntd/japeto
    def rig(self):
        if not self._puppetNode:
            self.runSetupRig()
        if cmds.objExists('%s.master_guide' % self.setupRigGrp):
            self.masterGuide = attribute.getConnections('master_guide', self.setupRigGrp)[0].split('.')[0]
        if common.isValid(self.masterGuide):
            #get orientations for controls
            fkOrient  = self.__fkOrient()
            ikOrient  = self.__ikOrient()
            upVector  = self.upVector
            aimVector = self.aimVector

        #call parent class rig function
        if super(Limb, self).rig():
            return True
        
        #create ik fk switch
        ikfkDict = ikfk.create(jointChain = [self.startJoint, self.midJoint, self.tipJoint], stretch = self.stretch)
        ikfkDict['group'] = cmds.rename(ikfkDict['group'], '%s_%s' % (self.name(),ikfkDict['group']))

        #set the visibility on the ik/fk/blend joints to off
        cmds.setAttr('%s.v' % ikfkDict['fkJoints'][0], 0)
        cmds.setAttr('%s.v' % ikfkDict['ikJoints'][0], 0)
        cmds.setAttr('%s.v' % ikfkDict['blendJoints'][0], 0)

        ikfkAttr = attribute.addAttr(self.rigGrp, attr = 'ikfk', attrType = 'enum', defValue = ['off','on'],value = 0)

        cmds.connectAttr(ikfkAttr, '%s.ikfk' % ikfkDict['group'], l = True, f = True)

        #parent ikfk group under joints group
        cmds.parent(ikfkDict['group'], self.jointsGrp)

        #rename all ik and blend joints
        for i,jnt in enumerate(ikfkDict['ikJoints']):
            jnt = cmds.rename(jnt, jnt.replace('%s_%s_%s' % (common.SKINCLUSTER,common.JOINT, common.IK), '%s_%s' % (common.IK, common.JOINT)))
            ikfkDict['ikJoints'][i] = jnt

        for i,jnt in enumerate(ikfkDict['blendJoints']):
            jnt = cmds.rename(jnt, jnt.replace('%s_%s_%s' % (common.SKINCLUSTER,common.JOINT, common.BLEND), '%s_%s' % (common.BLEND, common.JOINT)))
            ikfkDict['blendJoints'][i] = jnt

        #create ik setup
        ikCtrl = control.create(name = ikfkDict['ikJoints'][2].replace('_%s' % common.JOINT, ''),type = 'cube', parent = self.controlsGrp, color = common.SIDE_COLOR[self._getSide()])
        ikCtrlZero = common.getParent(ikCtrl)
        attribute.copy('stretch', ikfkDict['group'], destination = ikCtrl, connect = True,reverseConnect = False)
        attribute.copy('stretchTop', ikfkDict['group'], destination = ikCtrl, connect = True,reverseConnect = False)
        attribute.copy('stretchBottom', ikfkDict['group'], destination = ikCtrl, connect = True,reverseConnect = False)

        if ikOrient == 'Local':
            transform.matchXform(ikfkDict['ikJoints'][2], ikCtrlZero, type = 'pose')
        else:
            transform.matchXform(ikfkDict['ikJoints'][2], ikCtrlZero, type = 'position')
            cmds.orientConstraint(ikCtrl, ikfkDict['ikJoints'][2], mo = True)
            common.setColor(ikCtrl, common.SIDE_COLOR[self._getSide()])

            #setup poleVector
            pvCtrl = control.create(name = ikfkDict['ikJoints'][2].replace('_%s' % common.JOINT, '_%s' % common.POLEVECTOR),type = 'cube', parent = self.controlsGrp, color = common.SIDE_COLOR[self._getSide()])
            #size polevector control

        for i in range(len(common.getShapes(pvCtrl))):
            control.scaleShape(pvCtrl, scale = [self.controlScale * .5, self.controlScale * .5, self.controlScale * .5], index = i)

        pvCtrlZero = common.getParent(pvCtrl)
        pvDisplayLineAttr = attribute.addAttr(pvCtrl, attr = 'pvLine', attrType = 'enum', defValue = 'off:on', value = 1)
        transform.matchXform(ikfkDict['ikJoints'][1], pvCtrlZero, type = 'position')
        #cmds.parent(ikfkDict['ikHandle'], w = True)
        pvPos = ikfk.getPoleVectorPosition(ikfkDict['ikJoints'][1], ikfkDict['ikHandle'])
        cmds.xform(pvCtrlZero, ws = True, t = pvPos)
        common.setColor(pvCtrlZero, common.SIDE_COLOR[self._getSide()])

        #create polevector constraint and parent under control
        cmds.poleVectorConstraint(pvCtrl, ikfkDict['ikHandle'])
        targetConstraint = cmds.pointConstraint(ikCtrl, ikfkDict['targetJnts'][1], mo = True) #ikhandle is under target joint
        pvDisplayLine = control.displayLine(ikfkDict['ikJoints'][0], pvCtrl, name = pvCtrl.replace(common.CONTROL, common.DISPLAYLINE), parent = self.controlsGrp)


        cmds.orientConstraint(ikCtrl,ikfkDict['ikJoints'][0], mo = True)

        #adding attribute to ik ctrl
        ikTwistAttr = attribute.addAttr(ikCtrl, attr = 'twist')
        cmds.connectAttr(ikTwistAttr, '%s.twist' % ikfkDict['ikHandle'], f = True)

        #connecting to shapes
        ikfkReverse = cmds.createNode('reverse', n = ikCtrl.replace('%s_%s' % (common.IK, common.CONTROL), '%s_%s' % (common.REVERSE, common.UTILITY)))
        attribute.connect('%s.ikfk' % ikfkDict['group'], '%s.inputX' % ikfkReverse)
        for shape in common.getShapes(ikCtrl):
            attribute.connect('%s.outputX' % ikfkReverse,'%s.v' % shape)

        for shape in common.getShapes(pvCtrl):
            attribute.connect('%s.outputX' % ikfkReverse,'%s.v' % shape)

        #connect pvDisplayLineAttr in pvDisplayLine visibility
        displayLineMultiply = cmds.createNode('multiplyDivide', n = pvDisplayLine.replace(common.DISPLAYLINE, common.MULTIPLYDIVIDE))
        attribute.connect(pvDisplayLineAttr, '%s.input1X' % displayLineMultiply)
        attribute.connect('%s.outputX' % ikfkReverse, '%s.input2X' % displayLineMultiply)
        attribute.connect('%s.outputX' % displayLineMultiply, '%s.v' % common.getChildren(pvDisplayLine)[0])

        #create fk setup
        fkCtrls = list()
        parent = self.controlsGrp
        for i,jnt in enumerate(ikfkDict['fkJoints']):
            cmds.select(cl = True)
            #rename fk joint
            jnt = cmds.rename(jnt,jnt.replace('%s_%s_%s' % (common.SKINCLUSTER,common.JOINT,common.FK), '%s_%s' % (common.FK,common.JOINT)))
            ikfkDict['fkJoints'][i] = jnt #re-assign fk joint intop ikfkDict
            #create controls, set color, and make connections
            fkCtrl = control.create(name = jnt.replace('_%s' % common.JOINT, ''),type = 'circle', parent = parent, color = common.SIDE_COLOR[self._getSide()])
            fkCtrlZero = common.getParent(fkCtrl)
            
            if fkOrient == 'Local':
                transform.matchXform(jnt, fkCtrlZero, type = 'pose')
            #end if
            else:
                transform.matchXform(jnt, fkCtrlZero, type = 'position')
            #end else
            
            cmds.connectAttr('%s.ikfk' % ikfkDict['group'], '%s.v' % common.getShapes(fkCtrl)[0], f = True)
            cmds.parentConstraint(fkCtrl, jnt, mo = True)
            attribute.lockAndHide('t', fkCtrl)
            attribute.lockAndHide('s', fkCtrl)
            attribute.lockAndHide('v', fkCtrl)
            #get joint rotate order and apply to control and parent group
            rotateOrder = attribute.getValue('rotateOrder', jnt)
            for node in [fkCtrl, fkCtrlZero]:
                cmds.setAttr('%s.rotateOrder' % node, rotateOrder)
    
                fkCtrls.append(fkCtrl)
                parent = fkCtrl
            #end loop
        #end loop

        aimAxis = transform.getAimAxis(ikfkDict['blendJoints'][0], allowNegative = False)    
        #Up Twist Joint Setup
        if self.upTwistJnts:
            noTwistJnt = common.duplicate(self.startJoint, name = self.startJoint.replace('%s' % common.SKINCLUSTER, 'NoTwist_%s' % common.SKINCLUSTER), parent = self.startJoint)

            inverseMultNode = cmds.createNode('multiplyDivide', n = noTwistJnt.replace('%s_%s' % (common.SKINCLUSTER,common.JOINT), '%s_%s' % (common.UTILITY, common.MULTIPLYDIVIDE)))
            cmds.connectAttr('%s.r%s' % (ikfkDict['blendJoints'][0], aimAxis), '%s.input1X' % inverseMultNode, f = True)
            cmds.setAttr('%s.input2X' % inverseMultNode, -1)
            cmds.connectAttr('%s.outputX' % inverseMultNode, '%s.r%s' % (noTwistJnt, aimAxis), f = True)


            step   = 1.0 / (len(self.upTwistJnts) +1)
            for i in range( 1, (len(self.upTwistJnts)+1) ):
                twsitMultNode = cmds.createNode('multiplyDivide', n = self.upTwistJnts[i - 1].replace('%s_%s' % (common.SKINCLUSTER,common.JOINT), '%s_%s' % (common.UTILITY, common.MULTIPLYDIVIDE)))
                cmds.connectAttr('%s.r%s' % (ikfkDict['blendJoints'][0], aimAxis), '%s.input1X' % twsitMultNode, f = True)
                cmds.setAttr('%s.input2X' % twsitMultNode, -(1-(step*i))  )
                cmds.connectAttr('%s.outputX' % twsitMultNode, '%s.r%s' % (self.upTwistJnts[i -1], aimAxis),f = True)
            #end loop

            self.upTwistJnts.insert(0, noTwistJnt)
        #end if

        if self.loTwistJnts:
            twistJnt = common.duplicate(self.midJoint,name = self.midJoint.replace('%s' % common.SKINCLUSTER, 'loTwist_%s' % common.SKINCLUSTER), parent = self.midJoint)
            constraint = cmds.aimConstraint(ikfkDict['blendJoints'][2],twistJnt,aimVector =  aimVector, upVector  = upVector,  worldUpType ="objectrotation", worldUpVector = upVector, worldUpObject = self.tipJoint)
            cmds.setAttr('%s.v' % twistJnt, 0)
        #end if

        step   = 1.0 / (len(self.loTwistJnts) +1)
        for i in range( 1, (len(self.loTwistJnts)+1) ):
            twsitMultNode = cmds.createNode('multiplyDivide', n = self.loTwistJnts[i - 1].replace('%s_%s' % (common.SKINCLUSTER,common.JOINT), '%s_%s' % (common.UTILITY, common.MULTIPLYDIVIDE)))
            cmds.connectAttr('%s.r%s' % (ikfkDict['blendJoints'][2], aimAxis), '%s.input1X' % twsitMultNode, f = True)
            cmds.setAttr('%s.input2X' % twsitMultNode, 1-(step*i) )
            cmds.connectAttr('%s.outputX' % twsitMultNode, '%s.r%s' % (self.loTwistJnts[i -1], aimAxis),f = True)
        #end loop

        #------------------------
        #Add to class variables
        #------------------------
        #assign joints to the joints list
        self.joints = {'ik' : ikfkDict['ikJoints'], 'fk' : ikfkDict['fkJoints'], 'blend' : ikfkDict['blendJoints'], 'target' : ikfkDict['targetJnts']}
        #assign controls to the controls list
        #assign fkCtrls into the controls dictionary 
        self.controls = {'ik' : [ikCtrl, pvCtrl],'fk' : fkCtrls }
        self.ikfkGroup = ikfkDict['group']
        #assign hooks
        self.hookRoot = [ikfkDict['ikJoints'][0], common.getParent(fkCtrls[0]), ikCtrl, ikfkDict['targetJnts'][-1]]
        self.hookPoint = [ikfkDict['blendJoints'][-1]]
        #add no twist joint to the skincluster list
        self.skinClusterJnts.append(noTwistJnt)
示例#9
0
文件: spaces.py 项目: jonntd/japeto
def create( spaceNode, spaceAttrNode = None , parent=None ):
    '''
    Create space switcher

    :param spaceNode: Transform node to be constrained.
    :type spaceNode: *str*
    :param spaceAttrNode: Node where the 'space' attribute is going to be created.
    :type spaceAttrNode: *str*
    :param parent: Parent for the spaces group.
    :type parent: *str*
    :return: Spaces group
    :rtype: *str*
    '''
    # Load decompose matrix plugin

    # get attribute spaceNode
    if spaceAttrNode == None:
        spaceAttrNode = spaceNode

    # check if exists
    if cmds.objExists( '%s.spaceGrp' % spaceNode ):
        raise RuntimeError, 'This node has spaces already. Use addSpace instead'

    # --------------------------------------------------------------------------
    # CREATE GROUP
    #
    grp = cmds.createNode('transform',n='%s%s' % (spaceNode,'Spaces'), parent=parent  )
    cmds.setAttr('%s.%s' % (grp,'inheritsTransform'),False)
    decomMatrixNode = cmds.createNode('decomposeMatrix')
    cmds.connectAttr( '%s.%s' % (spaceNode,'parentMatrix'), '%s.%s' % (decomMatrixNode,'inputMatrix') )
    cmds.connectAttr( '%s.%s' % (decomMatrixNode,'outputTranslate'), '%s.%s' % (grp,'translate') )
    cmds.connectAttr( '%s.%s' % (decomMatrixNode,'outputRotate'), '%s.%s' % (grp,'rotate') )
    cmds.connectAttr( '%s.%s' % (decomMatrixNode,'outputScale'), '%s.%s' % (grp,'scale') )

    # --------------------------------------------------------------------------
    # CREATE LOCAL SPACE
    #
    attribute.addAttr( spaceAttrNode, 'space', attrType='enum', defValue=['local'] )
    localSpace = cmds.createNode('transform', name='%s_%s' % (grp,'local'), parent=grp)
    transform.matchXform( localSpace, spaceNode, 'pose' )
    attribute.lockAndHide( ['t','r','s','v'], localSpace )

    # --------------------------------------------------------------------------
    # CREATE CONSTRAINT
    #
    constraint = cmds.parentConstraint( localSpace, spaceNode )[0]

    # --------------------------------------------------------------------------
    # CREATE MESSAGE ATTRIBUTES
    #
    # spaceAttrNode
    cmds.addAttr( spaceNode, k=True, ln='spaceAttrNode', at='message' )
    cmds.connectAttr( '%s.%s' % (spaceAttrNode,'space'), '%s.%s' % (spaceNode,'spaceAttrNode') )

    # spaceNode
    cmds.addAttr( spaceAttrNode, k=True, ln='spaceNode', at='message' )
    cmds.connectAttr( '%s.%s' % (spaceNode,'message'), '%s.%s' % (spaceAttrNode,'spaceNode') )

    # spaceGrp
    cmds.addAttr( spaceNode, k=True, ln='spaceGrp', at='message' )
    cmds.connectAttr( '%s.%s' % (grp,'message'), '%s.%s' % (spaceNode,'spaceGrp') )

    # spaceConstraint
    cmds.addAttr( spaceNode, k=True, ln='spaceConstraint', at='message' )
    cmds.connectAttr( '%s.%s' % (constraint,'message'), '%s.%s' % (spaceNode,'spaceConstraint') )
    # --------------------------------------------------------------------------

    return grp