示例#1
0
    def __mirrorBlendShape(self,*args):
        
        pm.select(self.baseShape)
        baseShape = pm.ls(sl = 1)[0]
        
        pm.select(self.sculptedShape)
        sculptedShape = pm.ls(sl = 1)[0]

        baseWarp = pm.duplicate(baseShape,n = nameUtils.setUniqueName(baseShape + 'Warp','geo'))
        baseScaleNeg = pm.duplicate(baseShape,n = nameUtils.setUniqueName(baseShape + 'ScaleNeg','geo'))
        
        #flip scale
        pm.setAttr(baseScaleNeg[0] + '.scaleX', -1)
        tempBlend = pm.blendShape(sculptedShape,baseScaleNeg[0],n = nameUtils.setUniqueName(sculptedShape + 'TempBlend','geo'))

        #create warp between warp and neg 
        pm.select(cl=True)
        pm.select(baseWarp)
        pm.select(baseScaleNeg,add = 1)
        pm.runtime.CreateWrap()
        pm.setAttr(tempBlend[0] + '.' + sculptedShape, 1)

        #Duplicate Wrapped shape for final result
        pm.duplicate(baseWarp)
        
        #Clean up setup
        pm.delete(baseWarp,baseScaleNeg)
示例#2
0
def rig_ctrlDuplicate(ctrl, name):
	"""Creates a hub set
	Args:
		ctrl (pm.PyNode): maya objects to rename
		name (str): new name
	Returns:
		list: [offset_grp, ctrl, con_grp]
	"""
	orig_name = ctrl.split('_')[0]
	grp_offset,grp_con = None,None
	if str(ctrl.getParent()) == orig_name+'Offset_GRP':
		grp_offset = pm.PyNode(orig_name + 'Offset_GRP')
	if orig_name+'Con_GRP' in ctrl.getChildren():
		grp_con = pm.PyNode(orig_name+'Con_GRP')
	if grp_offset:
		grp_offsetDup = pm.duplicate(grp_offset,n=name+'Offset_GRP',po=True)
	ctrl_dup = pm.duplicate(ctrl,n=ctrl.replace(orig_name, name))
	ctrl_dup[0].setParent(grp_offsetDup)
	for child in ctrl_dup[0].getChildren():
		if child.type() != 'nurbsCurve':
			pm.delete(child)
	if grp_con:
		grp_conDup = pm.duplicate(grp_con,n=name+'Con_GRP',po=True)
		grp_conDup[0].setParent(ctrl_dup)
	if grp_offset:
		return [grp_offsetDup[0],ctrl_dup[0],grp_conDup[0]]
	else:
		return [None,ctrl_dup[0],grp_conDup[0]]
示例#3
0
def copy_correctiveToBlend(base, corrective):
    '''Bakes a static mesh that can be used as a corrective to what you've posed
    Args:
        base (pm.PyNode): base object with bad shape from skinCluster or blendShapes
        corrective (pm.PyNode): sculpted fixed shape
    Returns:
        [pm.PyNode]: new corrected shape
    Usage:
        copy_correctiveToBlend(pm.ls(sl=True)[0], pm.ls(sl=True)[1])
    '''
    #Duplicate your deformed mesh twice, calling one positive and one negative. Move them a little away from your model
    positive = corrective
    negative = pm.duplicate(base, n=corrective.name()+"_negative")[0]
    inputs = pm.listConnections(base.getShape(), type=['skinCluster','blendShape'])
    for input in inputs:
        input.attr('envelope').set(0)
    corrected = pm.duplicate(base, n=corrective.name()+"_corrective")[0]
    #Make a new blend-shape node on your character containing the two duplicate meshes. This blend shape must use the parallel blending mode.
    blend = pm.blendShape(corrected, n='corrector_BS')[0]
    pm.blendShape(blend, e=True, t=(corrected, 0, positive, 1.0))
    pm.blendShape(blend, e=True, t=(corrected, 1, negative, 1.0))
    set=1
    for alias in blend.listAliases():
        alias[1].set(set)
        set=-1
    #Move your character back to bind-pose and in the parallel blend-node, set the positive mesh to 1 and the negative to -1. This should blend your mesh so that you only have the deformations you made to the positive mesh, but now in a neutral pose.
    #bindPose
    
    #Duplicate this new mesh and call it something with the letters BS is the name because this is infinitely funny. This mesh can now be used as a corrective blend-shape
    #Delete the parallel blend-node and repeat these steps for all your shapes. Yes, really.
    #pm.delete(p_bs)
    #pm.delete(base)
    for input in inputs:
        input.attr('envelope').set(1)
    return corrected
示例#4
0
def create_deltaMush(bindGeo, iterations = [5, 10, 20, 30, 40]):

    smoothGeo = pm.duplicate( bindGeo, rr=True, ic=True, name=bindGeo.name() + "_smooth") [0]
    smoothGeo.addAttr("envelope", at='long', min=0, max=1, dv=1, k=True)
    smoothGeo.addAttr("partitions", at='message')

    deltaGeo = pm.duplicate( bindGeo, rr=True, ic=False, name="BS_" + bindGeo.name() + "_delta") [0]

    pm.select(deltaGeo, smoothGeo)
    pm.mel.eval("CreateWrap")
  
    smoothNodes = []
    smoothNodeSets = []
    for i in range(0, len(iterations)):
        smoothNode = pm.deformer([smoothGeo], type='smooth')[0]
        smoothNode.iterations.set(iterations[i])
        smoothGeo.envelope >> smoothNode.envelope
        smoothNodes.append(smoothNode)
          
           
        smoothNodeSet = smoothNode.message.listConnections()[0]
        smoothNodeSet.clear()
        smoothNodeSets.append(smoothNodeSet)

    for smoothNodeSet in smoothNodeSets:
        smoothNodeSet.clear()
    partition = pm.partition(smoothNodeSets)
    partition.message >> smoothGeo.partitions

    skinCls = bindGeo.getShape().listConnections(type='skinCluster')[0]    
    joints = skinCls.getInfluence()
    assign_iteration_set(joints, bindGeo, skinCls, deltaGeo)
示例#5
0
    def gimbal(**kwargs):

        final = pm.nt.Transform(name = 'Gimbal')

        circle1 = pm.modeling.circle(
            constructionHistory = False,
            normal = kwargs['normal'] if 'normal' in kwargs else [0, 1, 0],
            radius = kwargs['radius'] if 'radius' in kwargs else 1
         )[0]

        circle2 = pm.duplicate(circle1, returnRootsOnly = True)[0]
        circle2.rotateBy((90, 0, 0))

        circle3 = pm.duplicate(circle1, returnRootsOnly = True)[0]
        circle3.rotateBy((0, 0, 90))

        for circle in [circle1, circle2, circle3]:

            pm.makeIdentity(circle, apply = True)

            shape = circle.getShape()

            pm.parent(shape, final, shape = True, relative = True)
            shape.rename('{0}Circle1Shape'.format(final.nodeName()))

            pm.delete(circle)

        return final
示例#6
0
def makeFkIk(*args):

	bindRoot = pm.ls(selection = True)[0]
	bindChain = pm.ls(bindRoot, dag = True)
	fkChain = pm.duplicate(bindRoot)
	replaceSuffix(fkChain, 'fk')
	makeFk(False, fkChain)
	ikChain = pm.duplicate(bindRoot)
	replaceSuffix(ikChain, 'ik')
	makeIk(False, ikChain)

	fkChainList = pm.ls(fkChain, dag = True)
	ikChainList = pm.ls(ikChain, dag = True)

	createPad(bindRoot)
	suffixIndex = bindChain[0].rfind('_')
	hanldeName = bindChain[0][:suffixIndex] + '_switch'
	handle = createHandle(hanldeName)
	pm.rename(handle, hanldeName)
	pm.parentConstraint(bindChain[-1], handle)
	constraintList = []
	for i, item in enumerate(bindChain):
		newConstraint = pm.orientConstraint(fkChainList[i], ikChainList[i], bindChain[i], mo = False)
		fkCon = pm.orientConstraint(newConstraint, q = True, wal = True)[1]
		ikCon = pm.orientConstraint(newConstraint, q = True, wal = True)[0]

		pm.setDrivenKeyframe(fkCon, cd = handle + '.switch', v = 1, dv = 10)
		pm.setDrivenKeyframe(fkCon, cd = handle + '.switch', v = 0, dv = 0)

		pm.setDrivenKeyframe(ikCon, cd = handle + '.switch', v = 0, dv = 10)
		pm.setDrivenKeyframe(ikCon, cd = handle + '.switch', v = 1, dv = 0)
示例#7
0
 def bdSwitchFKIK(self):
     if 'arm' in self.limb:
         print self.side + ' arm FK->IK switch ' 
         
         for loc in self.ikArmCons:
             shadowLoc = pm.ls(self.namespace + self.side +  loc + 'LOC')[0]
             tempLoc = pm.duplicate(shadowLoc)
             pm.parent(tempLoc,w=True)
             
             ikCon = pm.ls(self.namespace + self.side +  loc + 'CON',type='transform')[0]
             if ikCon.name().find('armIK') > 0:
                 tempCnstr = pm.parentConstraint(tempLoc,ikCon)
             else:
                 tempCnstr = pm.pointConstraint(tempLoc,ikCon)
             pm.delete([tempCnstr,tempLoc])
                    
         self.armSwitchCon.attr('ikFkBlend').set(0)
     
     elif 'leg' in self.limb:
         print self.side + ' leg FK->IK switch ' 
         
         for loc in self.ikLegCons:
             shadowLoc = pm.ls(self.namespace + self.side +  loc + 'LOC')[0]
             tempLoc = pm.duplicate(shadowLoc)
             pm.parent(tempLoc,w=True)
             
             ikCon = pm.ls(self.namespace + self.side +  loc + 'CON',type='transform')[0]
             if ikCon.name().find('legIK') > 0:
                 tempCnstr = pm.parentConstraint(tempLoc,ikCon)
             else:
                 tempCnstr = pm.pointConstraint(tempLoc,ikCon)
             pm.delete([tempCnstr,tempLoc])
                    
         self.legSwitchCon.attr('ikFkBlend').set(0)
示例#8
0
def duplicateArray(objA=None, noCopies=9, direction="+x", adj=0):
    """ Duplicate Array of Objects """
    if objA == None:
        objA = getSelection()
    else:
        objA = pm.PyNode(objA)
    if isinstance(objA, pm.nodetypes.Transform):
        result = [objA]
        width = getWidth(objA)
        dup = pm.duplicate(objA)[0]
        result.append(dup)
        if "+x" in direction or "+X" in direction:
            pos = dup.t.get()
            pm.move(pos.x + width[0] + adj, pos.y, pos.z)
        elif "-x" in direction or "-X" in direction:
            pos = dup.t.get()
            pm.move(pos.x - width[0] + adj, pos.y, pos.z)
        if "+y" in direction or "+Y" in direction:
            pos = dup.t.get()
            pm.move(pos.x, pos.y + width[1] + adj, pos.z)
        elif "-y" in direction or "-Y" in direction:
            pos = dup.t.get()
            pm.move(pos.x, pos.y - width[1] + adj, pos.z)
        if "+z" in direction or "+Z" in direction:
            pos = dup.t.get()
            pm.move(pos.x, pos.y, pos.z + width[2] + adj)
        elif "-z" in direction or "-Z" in direction:
            pos = dup.t.get()
            pm.move(pos.x, pos.y, pos.z - width[2] + adj)
        for i in xrange(noCopies - 1):
            dup = pm.duplicate(st=True)[0]
            result.append(dup)
        return result
示例#9
0
    def buildChains(self, *args):
        """
        Build joint chains based on locator positions.
        """
        self.jointChain = []
        self.ikChain = []
        self.fkChain = []

        loc1Pos = pm.xform(self.loc1, q=True, ws=True, t=True)
        loc2Pos = pm.xform(self.loc2, q=True, ws=True, t=True)
        loc3Pos = pm.xform(self.loc3, q=True, ws=True, t=True)

        jnt1='%s_shldrJnt'%self.prefix
        jnt2='%s_elbow1Jnt'%self.prefix
        jnt3='%s_wristJnt'%self.prefix

        self.jointChain.append(pm.PyNode(pm.joint(p=loc1Pos, n=jnt1))) 
        self.jointChain.append(pm.PyNode(pm.joint(p=loc2Pos, n=jnt2)))
        self.jointChain.append(pm.PyNode(pm.joint(p=loc3Pos, n=jnt3)))

        #--- Orient the chain
        self.orientChain()

        #--- Creating duplicate ik/fk joint chains
        for each in pm.duplicate(self.jointChain, rc=True):
            # Slice off number maya adds during duplication
            each.rename('%s_ik' % each[:-1])
            self.ikChain.append(pm.PyNode(each))

        for each in pm.duplicate(self.jointChain, rc=True):
            each.rename('%s_fk' % each[:-1])
            self.fkChain.append(pm.PyNode(each))
示例#10
0
def createIKSpline( jntList ):
    pymelLogger.debug('Starting: createIKSpline()...') 
    # Make IK Spline
    ikHandleTorso = pm.ikHandle( startJoint=jntList[0], endEffector=jntList[-1], solver = 'ikSplineSolver', numSpans = 4, name = jntList[-1]+'_'+Names.suffixes['ikhandle'])
    # we should probably rename the object created to know names ......    
    # CAREFULL // inherits Transform OFF, to avoid double transformation when grouped later on
    pm.setAttr(ikHandleTorso[2] + '.inheritsTransform', 0)
    
    # Duplicate last and first joint to use as Drivers of the spine Ik curve
    print jntList
    drvStart = pm.duplicate(jntList[0], parentOnly=True, name = Names.prefixes['driver']+'_'+ jntList[0] +'_'+Names.suffixes['start'])
    drvEnd = pm.duplicate(jntList[-1], parentOnly=True, name = Names.prefixes['driver']+'_'+ jntList[-1] +'_'+Names.suffixes['end'])
    pm.parent(drvEnd, w=1)
    
    # Make radius bigger
    pm.joint(drvStart, edit = True, radius = 1)
    pm.joint(drvEnd, edit = True, radius = 1)
    
    # Skin hip/shldr jnt's to back curve
    pm.skinCluster(drvStart,drvEnd,ikHandleTorso[2],dr=4)
    
    # return nedded elements
    rList = [ikHandleTorso, drvStart, drvEnd ]
    
    pymelLogger.debug('End: createIKSpline()...') 
    return rList
示例#11
0
    def instance(self, source_transform_node):
        """instances the given nodes hierarchy
        """

        # duplicate the given node
        # then replace the instanceable nodes with instances

        # find instanceable nodes in the node and dupNode
        source_hierarchy = self.walk_hierarchy(source_transform_node)

        # if there is no node in the sourceHierarchy just return
        # the instance of the given node
        if len(source_hierarchy) < 1:
            dup_node = pm.duplicate(source_transform_node, ilf=1, rc=True)[0]
            pm.select(dup_node)
            return

        dup_node = pm.duplicate(source_transform_node, rc=True)[0]
        dup_hierarchy = self.walk_hierarchy(dup_node)

        for i, node in enumerate(dup_hierarchy):

            shape = node.getShape()
            if shape is not None and isinstance(shape,
                                                tuple(self._instanceables)):
                # instance the corresponding sourceNode
                source_node = source_hierarchy[i]
                new_instance_node = pm.duplicate(source_node, ilf=True)[0]

                pm.parent(new_instance_node, node.getParent(), r=False)
                pm.delete(node)

        pm.select(dup_node)
        return dup_node
示例#12
0
 def bdSwitchIKFK(self):
     if 'arm' in self.limb:
         print self.side + ' arm IK -> FK switch'
         
         for loc in self.fkArmCons:
             shadowLoc = pm.ls(self.namespace + self.side +  loc + 'LOC')[0]
             tempLoc = pm.duplicate(shadowLoc)
             pm.parent(tempLoc,w=True)
             
             fkCon = pm.ls(self.namespace + self.side +  loc + 'CON',type='transform')[0]
             tempCnstr = pm.orientConstraint(tempLoc,fkCon)
             
             pm.delete([tempCnstr,tempLoc])
             
         
         self.armSwitchCon.attr('ikFkBlend').set(1)
         
     elif 'leg' in self.limb:
         print self.side + ' leg IK->FK switch ' 
         
         for loc in self.fkLegCons:
             shadowLoc = pm.ls(self.namespace + self.side +  loc + 'LOC')[0]
             tempLoc = pm.duplicate(shadowLoc)
             pm.parent(tempLoc,w=True)
             
             fkCon = pm.ls(self.namespace + self.side +  loc + 'CON',type='transform')[0]
             tempCnstr = pm.orientConstraint(tempLoc,fkCon)
             
             pm.delete([tempCnstr,tempLoc])
             
         
         self.legSwitchCon.attr('ikFkBlend').set(1)            
示例#13
0
def createJnts( LegJnts, side ):
   
    pymelLogger.debug('Starting: createJnts()...') 
    
    # duplicate joints
    listJnts = []
    print LegJnts
    for jnt in LegJnts:
        pm.select(clear=1)
        newJnt = pm.duplicate(jnt,rr=True,po=True, name=jnt+'_'+Names.suffixes['ik'])[0]
        try:
            newJnt.setParent(world=1)
        except: pass 
        listJnts.append(newJnt)
    print listJnts
    # parent joints  
    listJnts.reverse()
    index = 0
    for jnt in listJnts:
        if index+1 == len(listJnts): break
        jnt.setParent(listJnts[index+1])
        index = index + 1
        
    listJnts.reverse()

    # joints for inverse foot
    ankleFloorJnt = '%s%s' %(side,'AnkleFloor_if')
    # duplicate only joints ww for inverse foot
    pm.select(clear=1)
    toeBaseWW = listJnts[-3]
    invfootname = str(toeBaseWW).replace('_'+Names.suffixes['ik'], '_inversefoot')
    invfootjnt = pm.duplicate( toeBaseWW, name=invfootname )[0]
    invfootjnt.setParent(w=1)
    index = 1
    invjntlist = invfootjnt.listRelatives(ad=1)
    invjntlist.reverse()
    for jnt in invjntlist:
        jnt.rename(invfootname+str(index))
        jnt.setParent(w=1)
        index += 1
    invjntlist.reverse()
    invjntlist.append(invfootjnt)
    invjntlist.reverse()
    
    index = 0
    for jnt in invjntlist:
        if index+1 == len(invjntlist): break
        jnt.setParent(invjntlist[index+1])
        index = index + 1
        
    # make them child of the Ankle floor jnt
    invjntlist[-1].setParent(ankleFloorJnt)
    

    pm.select(clear=1)
    pymelLogger.debug('End: createJnts()...') 
    print listJnts
    return listJnts
示例#14
0
def duplicateJointChain( *joints ):
    '''
    update : 2015-04-04
    '''
    if joints:
        pm.select(joints)
    
    joints = pm.selected(type='joint')

    # 입력된게 없으면 에러
    if not joints:
        raise

    # 선택된게 하나이면?
    if len(joints)==1 :
        dupJnt = pm.duplicate( joints[0], po=True )[0]
        dupJnt.setParent( w=True )
        pm.select(dupJnt)

        return [dupJnt]

    else:
        startJoint = joints[0]
        endJoint   = joints[-1]

        # endJoint가 startJoint의 parent가 아니면 에러
        if endJoint not in startJoint.getChildren( allDescendents=True ):
            raise

        # 복사할 조인트 리스트 만듦
        jointList = [ endJoint ]
        p = endJoint.getParent()
        while p!=startJoint:
            jointList.append( p )
            p = p.getParent()
        jointList.append( startJoint )

        # 새로운 조인트 복사
        newJoint = []
        for jnt in jointList:
            jnt = pm.duplicate(jnt, returnRootsOnly=True, renameChildren=True, parentOnly=True)[0]
            newJoint.append(jnt)

        # parent
        for i in range( len(newJoint[:-1]) ):
            newJoint[i].setParent( newJoint[i+1])

        # 루트로 옮김
        newJoint[-1].setParent(w=True)

        #
        newJoint.reverse()

        return newJoint
示例#15
0
def bdBuildSplineSolverScale():
    selection = pm.ls(sl=1,type='transform')
    startJoint = ''
    if selection:
        startJoint = selection[0]
    else:
        return
    
    print startJoint
    
    ikSpline  = pm.listConnections(startJoint,type='ikHandle')[0]
    print ikSpline  
    solver = ikSpline.ikSolver.inputs()[0]
    
    if 'ikSplineSolver' in solver.name():
        sclChain = pm.duplicate(startJoint,name = startJoint.name() + '_SCL')[0]
        sclChainAll = sclChain.listRelatives(f=True, ad=True,type='joint')
        
        print sclChainAll  
        
        for sclJnt in sclChainAll:
            pm.rename(sclJnt,sclJnt+'_SCL')
        
        splineCurve = pm.listConnections(ikSpline, type = 'nurbsCurve')[0]
    
        effector = pm.listConnections(ikSpline ,source=True, type='ikEffector')[0]
        endJoint = pm.listConnections(effector,source=True, type='joint')[0]
        jointChain = startJoint.listRelatives(f=True, ad=True,type='joint')
        jointChain  = jointChain + [startJoint]
        jointChain.reverse()
        print jointChain
        
        splineCurveScl = pm.duplicate(splineCurve,name = splineCurve.name().replace('crv','crv_scl'))
        strArclenSCL = pm.arclen(splineCurveScl,ch=True)
        strArclenCRV = pm.arclen(splineCurve,ch=True)
        arclenSCL = pm.ls( strArclenSCL ) [0]
        arclenCRV = pm.ls( strArclenCRV ) [0]
        arclenSCL.rename(splineCurveScl[0].name() + '_length')
        arclenCRV.rename(splineCurve.name() + '_length')
        
        mdScaleFactor = pm.createNode('multiplyDivide', name = splineCurve.name().replace('crv','crv_scaleFactor_md'))
        arclenCRV.arcLength.connect(mdScaleFactor.input1X)
        arclenSCL.arcLength.connect(mdScaleFactor.input2X)
        mdScaleFactor.operation.set(2)
    
        for jnt in jointChain[1:]:
            mdJntTr = pm.createNode('multiplyDivide', name = jnt + '_trX_MD')
            #mdJntTr.operation.set(2)
            
            sclJnt = pm.ls(jnt + '_SCL')[0]
            mdScaleFactor.outputX.connect(mdJntTr.input2X)
            sclJnt.translateX.connect(mdJntTr.input1X)
            mdJntTr.outputX.connect(jnt.translateX)
示例#16
0
    def build_tweek_ctrls(self, follicles):
        """ 
        Args:
            None
        Returns (None)
        """
        base_name = '%s_flexiPlane' % self.flexiPlaneNameField.getText()
        follicle_prefix = '%s_flexiPlane_' % self.flexiPlaneNameField.getText()
        mainCTRLGRP = self.flexiPlaneNameField.getText() + '_flexiPlane_main_CTRLCon_GRP'
        main_crv_name =  '%s_main_CTRL' % base_name
        tweekCTRLGRP = pm.group( em = True, name = self.flexiPlaneNameField.getText() + '_flexiPlane_tweakCTRL_GRP' )
        tweekCTRLGRP.setAttr( 'inheritsTransform', 0 )
        pm.parent( tweekCTRLGRP, mainCTRLGRP )
        

        for index,follicle in enumerate(follicles):
            tweek_crv_name = self.format_string.format(PREFIX = self.flexiPlaneNameField.getText(),
                                                 INDEX = 'flexiPlane_tweak%03d' % (index+1),
                                                 SUFFIX = 'CTRL')
            pm.circle( c = (0, 0, 0 ), nr = ( 0, 1, 0 ), sw = 360, r = 1, d = 3, ut = 0, tol = 0.000129167, s = 8, n = tweek_crv_name, ch = 0 )
            pm.setAttr( tweek_crv_name + '.scaleX', .5 )
            pm.setAttr( tweek_crv_name + '.scaleY', .5 )
            pm.setAttr( tweek_crv_name + '.scaleZ', .5 )
            pm.setAttr( tweek_crv_name + '.overrideEnabled', 1 )
            pm.setAttr( tweek_crv_name + '.overrideColor', 17 )
            pm.makeIdentity( tweek_crv_name, apply=True, translate=True, rotate=True, scale=True )
            pm.setAttr( tweek_crv_name + '.overrideEnabled', 1 )
            pm.setAttr( tweek_crv_name + '.overrideColor', 17 )
            
            pm.duplicate( tweek_crv_name, n= tweek_crv_name + 'A' )
            pm.setAttr( tweek_crv_name + 'A.rotateZ', -90 )
            pm.makeIdentity( tweek_crv_name + 'A', apply=True, translate=True, rotate=True, scale=True )
            
            pm.duplicate( tweek_crv_name, n= tweek_crv_name + 'B' )
            pm.setAttr( tweek_crv_name + 'B.rotateZ', -90 )
            pm.setAttr( tweek_crv_name + 'B.rotateX', -90 )
            pm.makeIdentity( tweek_crv_name + 'B', apply=True, translate=True, rotate=True, scale=True )
            
            pm.parent( tweek_crv_name + 'AShape', tweek_crv_name + 'BShape', tweek_crv_name, add = True, shape = True )
            pm.delete( tweek_crv_name + 'A', tweek_crv_name + 'B')
            
            pm.select(tweek_crv_name, r=True)
            offSetGRP.add_offset_grps()
            conGRP.add_con_grps()
            pm.select(clear = True)
            
            pm.connectAttr( follicle + '.translate', tweek_crv_name + 'Offset_GRP.translate' )
            pm.connectAttr( follicle + '.rotate', tweek_crv_name + 'Offset_GRP.rotate' )
            pm.parent( tweek_crv_name + 'Offset_GRP', tweekCTRLGRP )
            pm.scaleConstraint( main_crv_name, tweek_crv_name + 'Offset_GRP' )
 
            pm.select( clear = True)
示例#17
0
	def bdMirrorCon(self):
		print 'Mirror Controller'
		mirrorType = self.mirrorRadioBtn.checkedId()
		
		
		selection = pm.ls(sl=True)
		if selection.count > 0:
			for sel in selection:
				if ('L_' in sel.name()) or ('R_' in sel.name()):
					conGrp = sel.getParent()
					conGrpPos = conGrp.getTranslation(space='world')
					conGrpRot = conGrp.getRotation(space='world')
					
					exp = ['L_','R_']
					if 'R_' in conGrp.name():
						exp.reverse()
					
					mirrorConGrp = ''
					if mirrorType == -2:
						mirrorConGrp = pm.duplicate(conGrp,name = conGrp.name().replace(exp[0],exp[1]))[0]
						scaleGrp = pm.group(mirrorConGrp)
						scaleGrp.setPivots([0,0,0])
						scaleGrp.scaleX.set(-1)
						
						pm.parent(mirrorConGrp,world=True)
						pm.makeIdentity(mirrorConGrp,apply=True,t=0,r=0,s=1)
						pm.delete(scaleGrp)
						mirrorConGrpRot = mirrorConGrp.getRotation(space='world')
						print mirrorConGrpRot 
						mirrorConGrp.setRotation([mirrorConGrpRot[0],-1 * mirrorConGrpRot[1],180 - abs(mirrorConGrpRot[2])])
						
					elif mirrorType == -3:
						mirrorConGrp = pm.duplicate(conGrp,name = conGrp.name().replace(exp[0],exp[1]))[0]
					
					mirrorConChildren = mirrorConGrp.getChildren(ad=True,type='transform')
					
					for child in mirrorConChildren :
						child.rename(child.name().replace(exp[0],exp[1]))
					
					if mirrorType == -3:
						mirrorConGrp.setTranslation([conGrpPos[0]*-1,conGrpPos[1],conGrpPos[2]])
					for child in mirrorConChildren :
						for shape in child.getChildren(type='shape'):
							shape.overrideEnabled.set(1)
							shape.overrideColor.set(self.conColors[exp[1]])
							targetShape = pm.ls(child.name().replace(exp[1],exp[0]) + '*',type='shape')[0]
							if mirrorType == -3:
								self.bdMirrorShape(shape,targetShape)
						
				else:
					pm.warning( 'Central controller, no need (sic) to mirror it!')
示例#18
0
	def bdBuildJointStructure(self,target,ctrlName,ikName):
		startDrv = pm.duplicate(target,po=True,name=target.replace('jnt','side_drv_jnt'))
		drvChain = pm.duplicate(target,name=target.replace('jnt','drv_jnt'))
		drvChainChildren = pm.listRelatives(drvChain[0], c=True,type='joint',f=True)
		for child in drvChainChildren:
			if '02' in child.name():
				child.rename(child.name().replace('bnd_jnt','drv_jnt'))
				pm.parentConstraint(child,ctrlName.replace('anim','anim_CON'),mo=True,w=1)
	
		pm.parent(drvChain[0],startDrv[0])
		if 'upper' in startDrv[0].name():
			pm.parent(startDrv[0],startDrv[0].split('_')[0] + '_eyelid_upper_blink_jnt')
		elif 'lower' in startDrv[0].name():
			pm.parent(startDrv[0],startDrv[0].split('_')[0] + '_eyelid_lower_blink_jnt')
def create_deltaMush(bindGeo, iterations=10):

    smoothGeo = pm.duplicate( bindGeo, rr=True, ic=True, name=bindGeo.name() + "_smooth") [0]
    deltaGeo = pm.duplicate( bindGeo, rr=True, ic=False, name=bindGeo.name() + "_delta") [0]

    pm.select(deltaGeo, smoothGeo)
    pm.mel.eval("CreateWrap")

    smoothNode = pm.deformer([smoothGeo], type='smoothSimple')[0]
    smoothNode.iterations.set(iterations)

    newBaseGeo = pm.duplicate( smoothGeo, rr=True, ic=False, name=bindGeo.name() + "_smoothBase") [0]
    
    wrapNode = deltaGeo.inMesh.listConnections()[0]
    swap_wrap_deformer_base(wrapNode, newBaseGeo)
示例#20
0
	def bdRigEye(self):
		#create IK handles for the bind joints, for now getting the joints based on the name
		parts = []
		if self.templateSide == 'both':
			parts = ['left','right']
		else:
			parts = [self.templateSide]
		for side in parts:		
			eyeLidsJnt = pm.ls(side + '*eyelid_*_01_jnt')
			eyeJoint = pm.ls(side + "*eye*jnt")[0]
			eyeCorners = pm.ls(side + "*eye*corner*01_jnt")
			eyeAnim = pm.ls(side + '_eye_anim')
			pm.select(cl=True)
			eyeAnimGrp = pm.group(n=side + '_eyelids_anim_GRP')
			pm.select(cl=True)
			pm.aimConstraint(eyeAnim[0],eyeJoint,offset = [0, 0, 0] ,weight=1 , aimVector =[0 ,0 ,1] ,upVector=[0, 1, 0] ,worldUpType="vector" ,worldUpVector= [0,1,0])
		
			blinkUpJnt = pm.duplicate(eyeJoint,name = side + '_eyelid_upper_blink_jnt',po=True)
			blinkLowJnt = pm.duplicate(eyeJoint,name = side + '_eyelid_lower_blink_jnt',po=True)
			
			baseLidsJnt = pm.ls(side + '*lids*base')
			pm.parent([blinkUpJnt[0],blinkLowJnt[0]],baseLidsJnt[0])
			for joint in (eyeLidsJnt + eyeCorners):
				endJoint = pm.listRelatives(joint,c=True,type='joint')
				
				ikName = endJoint[0].name().replace('02_bnd_jnt','ikHandle')
				ctrlName = endJoint[0].name().replace('02_bnd_jnt','anim')
				
				bdRigUtils.bdAddIk(joint.name(),endJoint[0].name(),'ikSCsolver',ikName)
				eyelidAnim,eyelidAnimGrp = bdRigUtils.bdBuildSquareController(endJoint[0].name(),ctrlName,0.2)
				pm.parent(eyelidAnimGrp , eyeAnimGrp)
				#bdRigUtils.bdBuildBoxController(endJoint[0].name(),ctrlName,0.2)
				if 'corner' not in ctrlName:
					bdRigUtils.bdAddAttributeMinMax(ctrlName,['BlinkPosition'],'double',-5,5,1)
				pm.parent(ikName,ctrlName)
				self.bdBuildJointStructure(joint,ctrlName,ikName)
			
			'''
			allAnimsGrps = pm.ls(self.templateSide + '*eye*CON_??',type='transform')
			globalAnimGrp = pm.ls('controllers') 
			pm.parent(allAnimsGrps,globalAnimGrp[0])
			'''
			
			self.bdAddEyeAttr(eyeAnim[0])
			self.bdCreateVerticalFollow(side)
			self.bdCreateSideFollow(side)
			self.bdCreateBlink(side)
			self.bdCleanupGuides(side)
示例#21
0
def rig_makeBlockGeo(meshes, constrain=False, *args):
    '''
    Args:
        meshes (list(pm.nt.Transform)): meshes to cut up
        constrain (boolean): whether to constrain them or not
    Returns:
        list (pm.nt.Transform): list of block geometries created
    Usage:
        rig_makeBlockGeo(pm.ls(sl=True), constrain=True)
    '''
    blockgeos=[]
    joints=[]
    for mesh in meshes:
        skinCluster = rig_getConnectedSkinCluster(mesh)
        if skinCluster:
            joints+= skinCluster.getWeightedInfluence()
            if len(joints)==1:
                dup=pm.duplicate(mesh, n=mesh.name().replace('GEO','BLOCKGEO'))[0]
                blockgeos.append(dup)
                rig_unlockTransform(dup)
                pm.parentConstraint(joints[0], dup, mo=True)
            else:
                for joint in joints:
                    blockgeo = rig_makeBlockGeoFromJoint([mesh], joint)
                    if blockgeo:
                        if pm.objExists(blockgeo):
                            blockgeos+=blockgeo
                            pm.delete(blockgeo, ch=True)
                            if constrain:
                                for geo in blockgeo:
                                    rig_unlockTransform(geo)
                                    pm.parentConstraint(joint, geo, mo=True)
        else:
            pm.warning('No skinCluster detected on mesh %s' % mesh)
    return blockgeos
示例#22
0
def rig_makeJointsAlongCurve(module, curve, numJoints):
	'''Create joints along a curve in the same direction as the curve
	Args:
		module (string): what the name of the joint module should be
		curve (pm.PyNode): the curve transform to be used
		numJoints (int): the number of joints to be created
	Returns:
		[pm.nt.Joint]: list of joints
	Usage:
		rig_makeJointsAlongCurve("petalA", pm.ls(sl=True)[0], 15)
		rig_makeJointsAlongCurve("seatbeltDrive", pm.ls(sl=True)[0], 160)
	'''
	#Creating a curve between them
	#pm.curve (d=1, n= 'curve_body',  p=[(startPos[0],startPos[1],startPos[2]),(endPos[0],endPos[1],endPos[2])])
	curve = pm.duplicate(curve)[0]
	pm.rebuildCurve(curve, ch=0, rpo=1, rt=0, end=1, kr=1, kcp=0, kep=1, kt=0, s=numJoints, d=1, tol=0.01)
	#Evenly spacing joints according to the curve
	joints=[]
	for k in range(0,numJoints+1):
		cvPos = pm.pointPosition( '%s.cv[%s]'%(curve,str(k)), w = 1)
		joints.append( pm.joint( n = '%s_0%s_JNT'%(module, str(k+1)), p = cvPos) )

	#Set the rotation order    
	for joint in joints[:-1]:
		joint.secondaryAxisOrient('yup', oj='xyz')
	pm.delete(curve)
	return joints
示例#23
0
	def bdMirrorCon(self):
		print 'Mirror Controller'
		
		selection = pm.ls(sl=True)
		if selection.count > 0:
			for sel in selection:
				if ('L_' in sel.name()) or ('R_' in sel.name()):
					print sel.name()
					conGrp = sel.getParent()
					conGrpPos = conGrp.getTranslation(space='world')
					conGrpRot = conGrp.getRotation(space='world')
					
					exp = ['L_','R_']
					if 'R_' in conGrp.name():
						exp.reverse()
					print exp
					mirrorConGrp = pm.duplicate(conGrp,name = conGrp.name().replace(exp[0],exp[1]))[0]
					mirroCon = mirrorConGrp.getChildren()[0]
					mirroCon.rename(sel.name().replace(exp[0],exp[1]))
					mirroCon.getShape().overrideColor.set(self.conColors[exp[1]])
					
					mirrorConGrp.setTranslation([conGrpPos[0]*-1,conGrpPos[1],conGrpPos[2]])
					mirrorConGrp.setRotation([conGrpRot[0],conGrpRot[1],conGrpRot[2]*-1])
				else:
					pm.warning( 'Central controller, no need (sic) to mirror it!')
示例#24
0
def symCtrl(s, root):
    parent = pm.listRelatives(s, parent = True)
    children = pm.listRelatives(s, children = True, type = 'transform')
    # deparent children
    for c in children:
        c.setParent(world = True)
    # duplicate group parent
    for p in parent :
        newGroup = pm.duplicate(parent, renameChildren = True, name = p.name().replace('R_', 'L_'))
    # rename children
    child = pm.listRelatives(newGroup, children = True, type = 'transform')
    
    print(child)
    for c in child:
        pm.rename(c, c.name().replace('R_', 'L_'))
    # reparent children
    for c in children:
        c.setParent(s)
        # deparent copy 
        print(children)
    
    tempGrp = pm.group(em = True, world  = True, name = "tempMirrorGrp" )
    for grp in newGroup:
        grp.setParent(tempGrp)
     # reverse
        tempGrp.scaleX.set(-1)
    # parent copy group parent to world to world
        grp.setParent(world = True)
    # parent copy to facial 'facial_ctrl_grp'
        grp.setParent(root)
        pm.delete(tempGrp)
示例#25
0
 def duplicate_rigid_body(self):
     self.bound_geo = pm.duplicate(self.rigid_body,
                                   name= '%s_rb' % (self.rigid_body))[0]
     shape_nodes = self.bound_geo.getShapes()
     for shape_node in shape_nodes:
             if 'rigidBody' in '%s' % (shape_node):
                 pm.delete(shape_node)
示例#26
0
def rig_makeBlockGeoFromJoint(meshes, influence, *args):
    '''Takes in a list of meshes to cut pieces that are influenced by influence object (joint)
    Args:
        meshes (list(pm.nt.Transform)): meshes to cut up
        influence (pm.nt.Joint): figures out the faces influenced based on this one joint
    Returns:
        list (pm.nt.Transform): list of block geometries created for that influence/joint
    Usage:
        rig_makeBlockGeoFromJoint(pm.ls(sl=True), 'jointTest_JNT')
    '''
    blockgeo=[]
    for mesh in meshes:
        skinCluster = rig_getConnectedSkinCluster(mesh)
        if pm.objExists(skinCluster):
            influences = skinCluster.getWeightedInfluence()
            if influence in influences:
                faces = rig_getSkinClusterInfluencedMostFace(mesh, skinCluster, influence)
                if faces:
                    deleteFaces=[]
                    dup = pm.duplicate(mesh, rr=True)
                    allFaces = pm.ls(pm.polyListComponentConversion( mesh, tf=True), fl=True)
                    deleteFaces = list( set(allFaces).difference(set(faces)))
                    deleteFaces = [pm.PyNode(face.name().replace(mesh.getShape().name(), dup[0].getShape().name())) for face in deleteFaces]
                    if deleteFaces:
                        pm.delete(deleteFaces)
                        dup[0].rename('%s_%s_CUTUP'%(mesh.name(),influence.replace('_JNT','')))
                        blockgeo.append(dup[0])
                    else:
                        pm.delete(dup[0])
    return blockgeo
示例#27
0
def transfer_shape(source, target, flip=True):
    """it will replace the shape of selected number 2 with the shapes of selected number 1"""

    target_shape = target.getShape(noIntermediate=True)
    target_shape_orig = get_orig_shape(target_shape)

    dup = pymel.duplicate(source, rc=1)[0]
    tmp = pymel.createNode('transform')
    pymel.parent(tmp, dup)
    pymel.xform(tmp, t=(0, 0, 0), ro=(0, 0, 0), scale=(1, 1, 1))
    pymel.parent(tmp, w=1)
    for sh in dup.getShapes(noIntermediate=True):
        pymel.parent(sh, tmp, r=1, s=1)

    pymel.delete(dup)
    temp_grp_negScale = pymel.createNode('transform')
    pymel.parent(tmp, temp_grp_negScale)
    if flip:
        temp_grp_negScale.scaleX.set(-1)

    pymel.parent(tmp, target)
    pymel.delete(temp_grp_negScale)

    pymel.makeIdentity(tmp, t=True)  # this brings translate values at 0 before scale freezing
    pymel.makeIdentity(tmp, apply=True, t=True, r=True, s=True)
    pymel.parent(tmp, w=1)

    color_info, vis_master = get_previous_controller_info(target)

    shapes_has_been_deleted = False
    for sh in tmp.getShapes():
        if target_shape_orig:
            adapt_to_orig_shape(sh, target.getShape())
        else:
            if not shapes_has_been_deleted:
                shapesDel = target.getShapes()
                if shapesDel: pymel.delete(shapesDel)
                shapes_has_been_deleted = True

            pymel.parent(sh, target, r=1, s=1)
            pymel.rename(sh.name(), target.name() + "Shape")

            if color_info[0]:
                if color_info[1]:
                    sh.overrideEnabled.set(True)
                    sh.overrideRGBColors.set(1)
                    sh.overrideColorRGB.set(color_info[2])

                else:
                    sh.overrideEnabled.set(True)
                    sh.overrideRGBColors.set(0)
                    sh.overrideColor.set(color_info[2])

            else:
                sh.overrideEnabled.set(False)

            if vis_master:
                vis_master.connect(sh.visibility)

    pymel.delete(tmp)
示例#28
0
def bdAddExtraGrp(nameMaskCon,grpType,empty):

    controllers = pm.ls(nameMaskCon,type = 'transform')
    conPyNodes = []
    for con in controllers:
        conPyNodes.append(con)

    for node in conPyNodes:
        if empty:
            pm.select(cl=True)
            conGrp = pm.group(name = node.name() + '_' + grpType)
            pos = node.getTranslation(space='world')
            rot = node.getRotation(space='world')
            conGrp.setTranslation(pos)
            conGrp.setRotation(rot)
            parent = node.getParent()
            pm.parent(conGrp,parent)

        else:
            conGrp = pm.duplicate(node,name = node.name().replace('CON',grpType))
        '''
		for axis in ['X','Y','Z']:
			conGrp[0].attr('translate' + axis).setKeyable(True)
			conGrp[0].attr('translate' + axis).setLocked(False)
		'''
        conGrpRelatives = pm.listRelatives(conGrp,ad = True)
        #print sdkConRelatives
        pm.delete(conGrpRelatives)
        pm.parent(node,conGrp)
def cam_projection(selected):
    if not selected:
        pm.informBox(title="ERROR", message="Please Select a shot Camera to continue", ok="OK")
        return None
    else:
        newCamera = pm.duplicate(ic=False, name="proj_cam_fr" + frame_name)
        return newCamera
示例#30
0
def addZero(*args, **kwargs):
	oblist = makeList(args)

	results = []

	for item in oblist:
		if item.type() == 'joint':
			zero = pm.createNode('transform', n=item+'Zero')
			zero.rotateOrder.set( item.rotateOrder.get() )
			snap(zero, item)
			pm.parent(item, zero)
			results.append(zero)
		elif item.type() == 'transform':
			zero = pm.duplicate(item, rr=True)[0]
			children = zero.getChildren()
			if len(children):
				pm.delete(children)
			zero.rename(item+'Zero')

			for attr in 'trs':
				for axis in 'xyz':
					pAttr = zero.attr(attr+axis)
					pAttr.set(lock=False)
					pAttr.set(k=True)

			pm.parent(item, zero)
			results.append(zero)

	if len(results) == 0:
		return None
	elif len(results) == 1:
		return(results[0])
	else:
		return(results)
示例#31
0
def qClothCmd(*args, **kwargs):
    '''
    create qCloth
    
    step 1: Select an anim geo
    step 2: Duplicate a cloth geo and a output geo from the anim geo
    step 3: Do blendshape both anim geo and cloth geo with output geo
    step 4: Create QCloth on cloth geo
    '''

    try:
        pm.loadPlugin("qualoth-2014-x64.mll")
    except:
        pass

    sel = pm.ls(sl=1)

    outputGrpName = 'output_Grp'

    clothGrpName = 'cloth_Grp'

    if pm.objExists(outputGrpName):
        outputGrp = pm.PyNode(outputGrpName)
    else:
        outputGrp = pm.createNode('transform', name=outputGrpName)

    outputGrp.v.set(0)

    if pm.objExists(clothGrpName):
        clothGrp = pm.PyNode(clothGrpName)
    else:
        clothGrp = pm.createNode('transform', name=clothGrpName)

    outputGeos = [
        pm.duplicate(i, name=i.name().replace("_anim", "_output"))[0]
        for i in sel
    ]

    [outputGeo.setParent(outputGrp) for outputGeo in outputGeos]

    [i.v.set(0) for i in sel]

    clothShape = []
    for i in sel:
        pm.select(i)
        clothShape.append(pm.mel.qlCreateCloth())

    clothGeos = [pm.PyNode(i).outputMesh.outputs(p=0)[0] for i in clothShape]

    [clothGeo.setParent(clothGrp) for clothGeo in clothGeos]

    blendNodes = [
        pm.blendShape(sel[i], clothGeos[i], outputGeos[i], w=[(0, 0), (1, 1)])
        for i in range(len(sel))
    ]
示例#32
0
def IK_createAveObj(cur, number, s="group"):

    newCur = pm.duplicate(cur, rr=1, n=cur + "_copyCurve1")
    curInfo = pm.arclen(cur, ch=1)
    ns = int(curInfo.arcLength.get())
    pm.delete(curInfo)
    pm.rebuildCurve(newCur,
                    ch=1,
                    rpo=1,
                    rt=0,
                    end=1,
                    kr=0,
                    kcp=0,
                    kep=1,
                    kt=0,
                    s=ns * 100,
                    d=3,
                    tol=0.01)

    allNewInfo = []
    aimObj = []

    p = 1.0 / float((number - 1))
    prF = 0.0

    if s == "position":
        allPoistion = []

    for i in range(number):
        if i == number - 1:
            NewInfo = pm.pointOnCurve(newCur, ch=1, top=1, pr=1)
        else:
            NewInfo = pm.pointOnCurve(newCur, ch=1, top=1, pr=prF)
            prF += p
        allNewInfo.append(NewInfo)

        t = pm.getAttr(NewInfo + ".position")

        if s == "position":
            allPoistion.append(t)

        if s == "group":
            obj = pm.group(em=1, n=cur + "_AimGrp" + str(i + 1))
            aimObj.append(obj)
            pm.setAttr(obj + ".translate", t)
            cmds.select(cl=1)

    pm.delete(allNewInfo, newCur)

    if s == "position":
        return allPoistion

    if s == "group":
        return aimObj
示例#33
0
    def target(self, source):
        dup = pm.duplicate(source)[0]
        # pm.select(dup,r=1)
        # pm.mel.eval("hyperShade -assign lambert1")

        for dAttr in ["displayBorders", "displayEdges"]:
            dup.getShape().attr(dAttr).set(1)

        for attr in ["tx", "ty", "tz", "rx", "ry", "rz", "sx", "sy", "sz"]:
            dup.attr(attr).unlock()
        self.targetMesh = dup
示例#34
0
def bswExtract(sel):
    if not sel:
        bs_qui.bs_displayMessage('error', 'Please select geometries.')
        return False
    mainGrp = pm.createNode('transform', n='blendshapeMain_grp', ss=True)
    for each in bsLS:
        shapeGrp = pm.createNode('transform', n=each + '_BSGrp', ss=True)
        for eachGeo in sel:
            dupShape = pm.duplicate(eachGeo, rr=True, n=each + '__' + eachGeo)
            pm.parent(dupShape, shapeGrp)
        pm.parent(shapeGrp, mainGrp)
示例#35
0
    def create_chain(self, prefix):
        chain = []
        dup_chain = self.rig_joints
        if prefix == RIG:
            dup_chain = self.bnd_joints

        for jnt in dup_chain:
            if prefix == RIG:
                new_jnt = pm.duplicate(jnt, name=RIG + '_' + jnt.name(),
                                       po=1)[0]
            else:
                new_jnt = pm.duplicate(jnt,
                                       name=jnt.name().replace(RIG, prefix),
                                       po=1)[0]
            chain.append(new_jnt)

        for i in range(len(chain) - 1, 0, -1):
            pm.parent(chain[i], chain[i - 1])

        return chain
示例#36
0
    def duplicateSourceMesh(self, obj, ctrl):
        """

        :param obj:
        :param ctrl:
        :return: Mesh Shape for the Control
        """
        dupliObj = pm.duplicate(obj)
        pm.rename(dupliObj, ctrl[0].name())

        return dupliObj[0], dupliObj[0].getShape()
示例#37
0
def exportAnimation(path=None):
    """
    Bakes and exports animation on a rig in the scene.
    
    Args:
        path(str): An destination fbx path to export. 
    """
    if path is None:
        path = pmc.sceneName()
    path = path.replace('.ma', '.fbx')

    # Get the root joint
    root = None
    namespace = None
    for namespace in pmc.listNamespaces():
        root = getRootJoint(namespace)
        if root is not None:
            namespace = namespace
            break
    if root is None:
        raise RootJointException('Could not find a root in the scene with a namespace.')

    try:
        pmc.undoInfo(openChunk=True)

        # Create a duplicate root joint
        dupRoot = pmc.duplicate(root)[0]
        pmc.rename(dupRoot, root.nodeName().split(':')[-1])

        # Copy animation tags
        copyTagAttribiutes(root, dupRoot)

        # Bind skeleton
        constraints = []
        exportJoints = [dupRoot] + getBindSkeleton()
        for joint in [dupRoot] + getBindSkeleton():
            source = pmc.PyNode('%s:%s' % (namespace, joint.nodeName()))
            constraints.append(pmc.parentConstraint(source, joint))

        # Bake animation and remove constraints
        bakeAnimation(exportJoints)
        pmc.delete(constraints)

        # Export animation and convert to hkx
        exportFbx([dupRoot] + getBindSkeleton(), path=path, animation=True)
        ckcmd.importanimation(
            getSceneSkeletonHkx(legacy=True), path,
            getSceneAnimationDirectory(), cache_txt=getSceneCacheFile(),
            behavior_directory=getSceneBehaviorDirectory()
        )

        # TODO copy cache file to correct directory
    finally:
        pmc.undoInfo(closeChunk=True)
示例#38
0
    def duplicateSourceMesh(self, obj, joint):
        """

        :param obj:
        :param ctrl:
        :return: Mesh Shape for the Control
        """
        dupliObj = pm.duplicate(obj)
        pm.rename(dupliObj, name.removeSuffix(joint) + '_PRX')

        return dupliObj[0], dupliObj[0].getShape()
示例#39
0
 def duplicate_rigid_body(self):
     '''
     # duplicates the rigid body object, and names with _rb
     '''
     self.bound_geo = pm.duplicate(self.rigid_body,
                                   name='%s_rb' % (self.rigid_body))[0]
     shape_nodes = self.bound_geo.getShapes()
     # deleting the rigid body shape on the duplicated object
     for shape_node in shape_nodes:
         if 'rigidBody' in '%s' % (shape_node):
             pm.delete(shape_node)
示例#40
0
文件: _util.py 项目: WSStudios/fossil
def advancedTwist(start, end, baseCtrl, endCtrl, ik):
    # Setup advanced twist
    startAxis = duplicate(start, po=True)[0]
    startAxis.rename('startAxis')
    startAxis.setParent(baseCtrl)
    core.dagObj.lockTrans(core.dagObj.lockRot(
        core.dagObj.lockScale(startAxis)))

    endAxis = duplicate(start, po=True)[0]
    endAxis.rename('endAxis')
    endAxis.setParent(endCtrl)
    endAxis.t.set(0, 0, 0)
    core.dagObj.lockTrans(core.dagObj.lockRot(core.dagObj.lockScale(endAxis)))

    hide(startAxis, endAxis)

    ik.dTwistControlEnable.set(1)
    ik.dWorldUpType.set(4)
    startAxis.worldMatrix[0] >> ik.dWorldUpMatrix
    endAxis.worldMatrix[0] >> ik.dWorldUpMatrixEnd
    def add_sine(self):

        nurbs_sine = pm.duplicate(self.nurbs,
                                  name='geo_' + self.ribbon_name + '_sine')

        # create sine deformer
        dfm_sine, tfm_sine = pm.nonLinear(nurbs_sine, type='sine')
        tfm_sine.setRotation([0, 0, 90], space='world')
        dfm_sine.dropoff.set(1)

        pm.blendShape(nurbs_sine, self.nurbs, weight=[0, 1])
示例#42
0
def generateReposer():

    rJoints = []
    rCards = []

    # Build all the cards and joints
    cards = core.findNode.allCards()
    for card in cards:
        rCard = duplicate(card, po=0)[0]
        rCard.deleteAttr('fossilRigData')
        for child in rCard.listRelatives():
            if not child.type() == 'nurbsSurface':
                delete(child)
        rCards.append(rCard)
        makeIdentity(rCard, t=False, r=False, s=True, apply=True)
        core.dagObj.lockScale(rCard)

        for jnt in card.joints:
            j = joint(None)
            j.rename(simpleName(jnt, '{}_repose'))

            core.dagObj.matchTo(j, jnt)

            assert jnt.info.get('options', {}).get(
                'mirroredSide',
                False) is False, 'parent to mirrored joints not supported yet'
            j.addAttr('bpj', at='message')
            jnt.message >> j.bpj

            rJoints.append(j)

    # Set their parents
    for j in rJoints:
        parent = j.bpj.listConnections()[0].parent
        if parent:
            j.setParent(getRJoint(parent))

    # Put under cards, card pivot to lead joint
    for rCard, card in zip(rCards, cards):
        bpj = card.parentCardJoint
        if bpj:

            start = card.start() if card.joints else bpj
            rCard.setParent(getRJoint(bpj))
            core.dagObj.unlock(rCard)
            xform(rCard, ws=True, piv=xform(start, q=True, t=True, ws=True))
            core.dagObj.lockTrans(rCard)

        start = getRJoint(card.start())
        start.setParent(rCard)
        core.dagObj.lockTrans(core.dagObj.lockScale(start))

    for j in rJoints:
        lockRYZ(j)
示例#43
0
def prepareObjectForMirror(objs=None):
    if objs:
        objs = pm.ls(objs)
    else:
        objs = pm.ls(sl=True)
    for obj in objs:
        nameSpaceAndName = obj.name().split(":")
        if len(nameSpaceAndName) > 1:
            objNameSpace = nameSpaceAndName[0]
            objName = nameSpaceAndName[1]
        else:
            objName = obj.name()
        if objName[:2] == ('L_'):
            otherObj = pm.PyNode(obj.name().replace('L_', 'R_'))
        elif objName[:2] == ('R_'):
            otherObj = pm.PyNode(obj.name().replace('R_', 'L_'))
        else:
            otherObj = obj.name()

    if not (pm.objExists(obj.name() + '_AIM')):
        aim = pm.spaceLocator(name='%s_AIM' % obj.name())
        pm.parent(aim, obj)
        aim.translate.set(1, 0, 0)
        aim.rotate.set(0, 0, 0)

    up = pm.spaceLocator(name='%s_UP' % obj.name())
    pm.parent(up, obj)
    up.translate.set(0, 1, 0)
    up.rotate.set(0, 0, 0)

    aim2 = pm.duplicate(aim)[0]
    pm.parent(aim2, world=True)
    aim2.translateX.set(-aim2.translateX.get())
    pm.parent(aim2, otherObj)
    pm.rename(aim2, '%s_AIM' % otherObj.name())

    up2 = pm.duplicate(up)[0]
    pm.parent(up2, world=True)
    up2.translateX.set(-up2.translateX.get())
    pm.parent(up2, otherObj)
    pm.rename(up2, '%s_UP' % otherObj.name())
示例#44
0
    def build_spine(self, spine_num):
        
        spine_curve_dup = pm.duplicate('spine_guide__curve', n = 'spine_guide__curve_dup')[0]
        pm.makeIdentity(spine_curve_dup , n=0, s=1, r=1, t=1, apply=True, pn=1)
        pm.parent(spine_curve_dup, world=True)
        
        poc = adb_PointonCurve.PointToCurveJnt(spine_num, sel=spine_curve_dup)

        spine_joints = poc.getJoints      
        adb_spine.SpineSetUp(spine_joints)        
        pm.delete(spine_curve_dup)
        [pm.delete(pm.PyNode(x).getParent()) for x in spine_joints]
def rebuild_targets_with_mask():
    """
    Rebuilds targets by duplicating the mesh.
    :return:
    """
    sel = pymel.selected()
    skin_node = sel[0].listHistory(type='skinCluster')
    tweak_node = sel[0].listHistory(type='tweak')
    if skin_node:
        skin_node[0].envelope.set(0)

    if tweak_node:
        tweak_node[0].envelope.set(0)

    blend_shape_node = sel[0].listHistory(type='blendShape')[0]
    blend_aliases = blend_shape_node.listAliases()
    connection_dict = {}

    for alias in blend_aliases:

        attribute = '{}.{}'.format(blend_shape_node, alias[0])
        connection = pymel.listConnections(attribute,
                                           destination=True,
                                           plugs=True)

        if connection:
            print connection[0]
            connection_dict[attribute] = connection[0]
            pymel.disconnectAttr(connection[0], attribute)
        pymel.setAttr(attribute, 0)

    for alias in blend_aliases:

        attribute = '{}.{}'.format(blend_shape_node, alias[0])
        pymel.setAttr(attribute, 1)
        dup = pymel.duplicate(sel[0], name=alias[0])

        for attr in dup.listAttributes():
            try:
                attr.unlock()
            except:
                pass

        pymel.parent(dup[0], world=True)
        pymel.setAttr(attribute, 0)
        if attribute in connection_dict.keys():
            pymel.connectAttr(connection_dict[attribute], attribute)

    if skin_node:
        skin_node[0].envelope.set(1)

    if tweak_node:
        tweak_node[0].envelope.set(1)
示例#46
0
    def make_chain_surface(cls, spans=10):
        count = 1
        nurbs = pm.nurbsPlane(u=1, v=spans, lr=5, n="surface")
        geo = pm.PyNode(nurbs[0])
        fols = []
        fol_shapes = []
        while count < spans:
            fol = pm.createNode('transform', n='follicle1', ss=True)
            fol_shape = pm.createNode('follicle',
                                      name="folicle_shape",
                                      p=fol,
                                      ss=True)
            pm.connectAttr(geo.local, fol_shape.inputSurface)
            pm.connectAttr(geo.worldMatrix[0], fol_shape.inputWorldMatrix)
            pm.connectAttr(fol_shape.outRotate, fol.rotate)
            pm.connectAttr(fol_shape.outTranslate, fol.translate)
            fol.inheritsTransform.set(False)
            fol_shape.parameterU.set(0.5)
            fol_shape.parameterV.set(0.1 * count)
            fols.append(fol)
            fol_shapes.append(fol_shapes)
            count += 1

        nurbs_jnts = Chain.make_jnt_chain(
            fols, name_template="_surface_{number}_JNT")
        for nurbs_JNT, fol in zip(nurbs_jnts[0:], fols[:-1]):
            nurbs_JNT.setParent(fol)

        drivers = []
        driver_a_jnt = pm.duplicate(nurbs_jnts[0], name="driver_A")
        driver_b_jnt = pm.duplicate(nurbs_jnts[(spans / 2) - 1],
                                    name="driver_B")
        driver_c_jnt = pm.duplicate(nurbs_jnts[-1], name="driver_C")
        drivers.append(driver_a_jnt)
        drivers.append(driver_b_jnt)
        drivers.append(driver_c_jnt)
        pm.parent(drivers, w=True)
        for driver in drivers:
            pm.setAttr(driver[0] + ".radius", 1.5)
        pm.bindSkin(nurbs, drivers)
示例#47
0
文件: tools.py 项目: ridlimod/MEm
def mirrorJoints(sJnt, side=""):
    sJnt = pym.PyNode(sJnt)
    if side == "":
        if "_r_" in sJnt.name():
            mirrorJoints(sJnt, side="l")
            return
        if "_l_" in sJnt.name():
            mirrorJoints(sJnt, side="r")
            return

    if side == "r":
        src = "_l_"
        tgt = "_r_"
        aux = "_rr_"
    if side == "l":
        src = "_r_"
        tgt = "_l_"
        aux = "_ll_"

    print src, tgt, aux
    mGrp = pym.createNode("transform", n="mirror_grp")
    name = sJnt.name()
    auxname = name.replace(src, aux)
    nJnt = pym.duplicate(sJnt, n=auxname)[0]
    for cJnt in nJnt.listRelatives(ad=True):
        cName = cJnt.name()
        cAuxName = cName.replace(src, aux)
        cJnt.rename(cAuxName)

    pym.parent(nJnt, mGrp, a=True)
    mGrp.scaleX.set(-1)

    def recurse(root, p=None):
        nf = root.name()
        newname = nf.replace(aux, tgt)
        newJnt = pym.createNode("joint", n=newname)
        copyTM(root, newJnt)
        newJnt.radius.set(root.radius.get())
        pym.makeIdentity(newJnt,
                         apply=True,
                         translate=True,
                         rotate=True,
                         scale=True)

        if p:
            pym.parent(newJnt, p)

        for child in root.getChildren(type="joint"):
            recurse(child, p=newJnt)

    recurse(nJnt)
    pym.delete(mGrp)
示例#48
0
def splitSidesAPI(targetObj, sourceObj, falloff=0.2):

    # look at number of verticies
    pm.select(sourceObj)
    tgtVertex = getObjVertex(targetObj.name())
    srcVertex = getObjVertex(sourceObj.name())

    bBox = getBBox(targetObj.name())
    rgtX = bBox.max.x
    # duplicate face twice (one left, one right)
    targetObj_Lft = pm.duplicate(targetObj, n='R_' + targetObj)[0]
    pm.move(targetObj_Lft, rgtX * -2.1, 0, 0, r=1)
    targetObj_Rgt = pm.duplicate(targetObj, n='L_' + targetObj)[0]
    pm.move(targetObj_Rgt, rgtX * 2.1, 0, 0, r=1)

    side = 1
    # on each object
    for target in ([targetObj_Lft, targetObj_Rgt]):
        side *= -1
        newPoint = om2.MPoint()
        newPntArray = om2.MPointArray()
        for id in range(len(srcVertex)):
            # get vert positions

            # find difference
            differencePos = (srcVertex[id][0] - tgtVertex[id][0],
                             srcVertex[id][1] - tgtVertex[id][1],
                             srcVertex[id][2] - tgtVertex[id][2])

            # get falloff amount from side of object
            falloffDist = getValue(srcVertex[id][0], falloff * side)

            # move vert difference * falloff amount
            newPntArray.append(
                om2.MPoint(tgtVertex[id][0] + (differencePos[0] * falloffDist),
                           tgtVertex[id][1] + (differencePos[1] * falloffDist),
                           tgtVertex[id][2] +
                           (differencePos[2] * falloffDist)))
        setObjVertex(target.name(), newPntArray)
示例#49
0
def reacquisition_curPosList(newcur, paramList, myface) :
    print "カーブ", newcur.name(), "を複製し,ターゲットカーブとします."
    
    
    if pm.objExists(myface.projection_curve_name) :
        c = pm.PyNode(myface.projection_curve_name)
        pm.delete(c)
    
    c = pm.duplicate(newcur, n = myface.projection_curve_name)
    myface.curve = c[0]
    
    global curPosList
    curPosList = getCurvePoint(c[0],paramList, "curvature")
示例#50
0
def makeOrigShape(obj):
    """Given a transform with some shape, create the basic foundation
    of deformation order, ie an "orig" shape."""
    try:
        shape = obj.getShape()
    except AttributeError:
        pmc.error("makeOrigShape argument must be a shape's transform node")
    orig = pmc.duplicate(shape, addShape=True, n=shape.name() + "Orig")[0]
    orig.ws >> shape.create
    # toggle this real quick to fix a texture bug
    orig.doubleSided.set(False)
    orig.doubleSided.set(True)
    orig.intermediateObject.set(True)
示例#51
0
def create_jnt_chain(name, ref_jnt, ref_jnt_end, number, suffix):
    """
    This module creates a joint chain by given to points' position and number of the joints in between these.
    :param name: str, base_name of the joints
    :param ref_jnt: str, start reference joint name
    :param ref_jnt_end: str, end reference joint name
    :param number: int, number of the joints in between the ref points
    :param suffix: str, suffix of the joint chain
    :return jnt_chain: str array, array of the newly created joints
    :return distance: float, distance between the ref joints
    """
    jnt_chain = []
    start_jnt = pm.duplicate(ref_jnt,
                             n='{}_ref'.format(ref_jnt),
                             parentOnly=True)[0]
    pm.parent(start_jnt, w=True)
    end_jnt = pm.duplicate(ref_jnt_end,
                           n='{}_ref'.format(ref_jnt_end),
                           parentOnly=True)[0]
    pm.parent(end_jnt, start_jnt)
    pm.joint(start_jnt, e=True, zso=True, oj="xyz", sao="yup")
    distance = pm.getAttr('{}.translateX'.format(end_jnt)) / number

    def recurse_jnt_chain(base_name, current_jnt, suf, count):
        if number >= count:
            jnt_name = '{}_{}_{}_jnt'.format(base_name, str(count), suf)
            jnt_chain.append(jnt_name)
            pm.joint(n=jnt_name)
            orient_node(current_jnt, jnt_name, 'b')
            pm.parent(jnt_name, current_jnt)
            if count > 0:
                pm.xform(jnt_name, t=(distance, 0, 0))
            current_jnt = jnt_name
        else:
            return None
        return recurse_jnt_chain(name, current_jnt, suf, count + 1)

    recurse_jnt_chain(name, start_jnt, suffix, 0)
    return jnt_chain, distance
示例#52
0
    def bdCreateFKChain(self):
        fkRootObj = pm.duplicate(self.rootObj)[0]
        fkRootObj.rename(self.rootObj.name() + '_FK')

        fkChain = fkRootObj.listRelatives(type='joint', ad=True, f=True)
        #fkChain.append(fkRootObj)
        fkChain.reverse()

        for jnt in fkChain:
            jnt.rename(jnt.name() + '_FK')

        pm.skinCluster(fkRootObj, self.dynCrv)
        return fkRootObj
示例#53
0
def zeroJoints(jointsList=None):
    if not jointsList:
        jointsList = pm.ls(sl=1)

    for eachJnt in jointsList:
        dup = pm.duplicate(eachJnt, rc=1, n=eachJnt[:-3] + "zero")

        try:
            for eachChild in pm.listRelatives(dup[0], c=1):
                pm.delete(eachChild)
        except:
            pass
        pm.parent(eachJnt, dup[0])
示例#54
0
文件: shapes.py 项目: ridlimod/MEm
 def extractShapes(self):
     """
     extract Shapes from targets
     """
     self.__reset__()
     parent = pym.createNode("transform", n=self.bsNode.name() + "_grp")
     for key, attr in self.__attrs__.iteritems():
         attr.set(1.0)
         dup = pym.duplicate(self.defNode, n=key)
         pym.parent(dup, parent, a=True)
         attr.set(0.0)
     self.__restore__()
     return parent
示例#55
0
    def unique_spine_zero_controller(self):
    # Create Root Costrain Jnt Unde Hip cotrol
        # Duplicate zero Jnt

        tempConst = pm.duplicate(self.joints.zeroJoint, po=True,
                                 name=("Const_" + self.joints.zeroJoint ))
        rootConst_jnt = tempConst[0]

        pm.parent(rootConst_jnt, self.hipCtrl.drawnNode)
        pm.pointConstraint(rootConst_jnt, self.joints.zeroJoint)
        pm.orientConstraint(rootConst_jnt, self.joints.zeroJoint)
        pm.setAttr(rootConst_jnt.visibility, 0)
        self._stuff.append(rootConst_jnt)
示例#56
0
def copyShape(source, dest, mirror=False):
    '''
    Make a copy of the source's shape for the dest.

    :param bool mirror:  If true, it is build mirrored on the x axis.
    '''

    source = duplicate(source)[0]

    color = getShader(dest)
    delete(core.shape.getShapes(dest))

    hasSharedShape = False
    if lib.sharedShape.find(dest):
        hasSharedShape = True
        lib.sharedShape.remove(dest)

    srcShapes = []
    newShapes = []
    for shape in core.shape.getShapes(source):
        srcShapes.append(shape)
        newShapes.append(
            parent(shape, dest, s=True, add=True)[0]
        )  # Might be a 2017 bug that shape.setParent() doesn't return an object

    if source.hasAttr('shapeType'):
        if not dest.hasAttr('shapeType'):
            try:
                dest.addAttr('shapeType', dt='string')
            except:
                pass

        if source.hasAttr('shapeType'):
            dest.shapeType.set(source.shapeType.get())

    if color:
        core.shader.assign(dest, color)

    # Reapply the shared shape if it exists to ensure it is at the end
    if hasSharedShape:
        lib.sharedShape.use(dest)
    addDisplayAttr(dest)

    if mirror:
        for srcShape, newShape in zip(srcShapes, newShapes):
            for sCv, dCv in zip(srcShape.cv, newShape.cv):
                pos = xform(sCv, q=True, ws=True, t=True)
                pos[0] *= -1
                xform(dCv, ws=True, t=pos)

    delete(source)
示例#57
0
    def jntOnCrv(self, numOfJnts=5, crv=None, *args):

        try:  # if in UI mode, get number of joints from UI
            numOfJnts = pm.intSliderGrp(self.slider, q=True, value=True)
        except:
            pass

        if crv == None:
            try:
                crv = pm.ls(sl=True)[0]
            except:
                pm.warning(
                    'ehm_tools...JntOnCrv: Select a curve to create joints on it.'
                )
                return None
        if numOfJnts < 2:
            pm.warning("number of joints must be greater than 1.")
            return None
        try:
            curveShape = crv.getShape().type()
        except:
            pm.warning("specified object is not a curve.")
            return None

        if curveShape != 'nurbsCurve':
            pm.warning("specified object is not a curve.")
            return None

        crv = pm.duplicate(crv)[0]
        pm.rebuildCurve(crv,
                        ch=False,
                        rpo=True,
                        rt=0,
                        end=1,
                        kr=0,
                        kcp=False,
                        kep=True,
                        kt=0,
                        s=200,
                        d=1,
                        tol=0.01)
        crvShape = crv.getShape()

        pm.select(clear=True)
        segSize = 1.0 / (numOfJnts - 1)

        for i in range(numOfJnts):
            pos = crvShape.getPointAtParam(segSize * i, 'world')
            self.newJnts.append(pm.joint(p=pos))

        pm.delete(crv)
示例#58
0
    def distribute(self, increment, bbox=False, *args, **kwargs):
        if not (self.curves and self.transformMesh):
            logger.info('No curves were saved, please excecute .saveObjects() before')
            return
        for curve in self.curves:
            currentCurvePos = 0.0
            if increment >= curve.length():
                logger.info('Increment value is higher than %s length' % curve)
                continue
            curveGrp = pm.createNode('transform', n='%sGrp' % curve)
            self.curveGroups.add(curveGrp)
            while currentCurvePos < 1.0:
                random.shuffle(self.transformMesh)  # random items
                logger.debug('currentCurvePos value is: %s' % currentCurvePos)
                if bbox:
                    currentCurvePos += self.boundingBoxObject(self.transformMesh[0])/curve.length()
                # validateChecks
                    if currentCurvePos > 1:
                        logger.debug('currentCurvePos value is bigger than 1: %s : %s' % (curve, currentCurvePos))
                        break
                    if currentCurvePos <= 0:
                        logger.warning('currentCurvePos is not incrementing its value: %s' % currentCurvePos)
                        break

                # create duplicate obj
                trnfMesh = pm.duplicate(self.transformMesh[0])[0]
                logger.debug('trnsMesh is type: %s' % type(trnfMesh))
                # group object and parent it in its respective curveGrp
                trnfGrp = pm.createNode('transform', n='%sOffset' % trnfMesh)
                motionPath = pm.PyNode(pm.pathAnimation(trnfGrp, c=curve, follow=True, followAxis='x', upAxis='y', fractionMode=True))
                motionPath.setUStart(currentCurvePos)
                pm.parent(trnfGrp, curveGrp)
                # pm.disconnectAttr('%s_uValue.output' % motionPath, motionPath.uValue)
                pm.delete('%s_uValue' % str(motionPath))
                # pos group and set transforms to zero
                pm.parent(trnfMesh, trnfGrp)
                trnfMesh.setTranslation((0,0,0), space='object')
                trnfMesh.setRotation((0,0,0))

                self.randomizerItem(trnfMesh, *args, **kwargs)

                currentCurvePos += increment / curve.length()  # this syntax type doesn't work on Int
                if bbox:
                    currentCurvePos += self.boundingBoxObject(self.transformMesh[0]) / curve.length()
                # validateChecks
                if currentCurvePos > 1:
                    logger.debug('currentCurvePos value is bigger than 1: %s : %s' % (curve, currentCurvePos))
                    break
                if currentCurvePos <= 0:
                    logger.warning('currentCurvePos is not incrementing its value: %s' % currentCurvePos)
                    break
示例#59
0
    def createMainNodes(self):
        #grps
        #chain grp
        self.chainGrp = pm.duplicate(self.rigGrp, parentOnly=True)[0]
        self.chainGrp.renameNode(name=self.TipName, nodeType='chain')
        self.chainGrp.setParent(self.rigGrp)

        #horizontal driver
        self.horizontalDriver = pm.duplicate(self.chainGrp, parentOnly=True)[0]
        self.horizontalDriver.renameNode(name=self.TipName, nodeType='horizDriver')
        pm.delete(pm.pointConstraint(self.startJoint, self.horizontalDriver))

        #vertical driver
        self.verticalDriver = pm.duplicate(self.horizontalDriver, parentOnly=True)[0]
        self.verticalDriver.renameNode(name=self.TipName, nodeType='vertDriver')

        #main
        pm.select(self.horizontalDriver)
        self.driver = pm.joint()
        self.driver.renameNode(name=self.TipName, nodeType='driver')
        self.driver.addCon()
        self.driver.getParent().setParent(self.chainGrp)
        self.driver.getParent().visibility.set(0)

        pm.select(self.driver)
        self.main = pm.joint()
        self.main.renameNode(name=self.TipName, descriptor='system')

        pm.select(self.endJoint)
        self.eff = pm.joint()
        self.eff.renameNode(name=self.TipName, nodeType='effector')
        self.eff.setParent(self.driver)

        self.horizontalDriver.setParent(self.chainGrp)
        self.verticalDriver.setParent(self.chainGrp)

        #connectEye
        self.startJoint.rotate.connect(self.driver.getParent().rotate)
示例#60
0
    def createRbnSrf(self):

        startJntVec = om.MVector(self.start[0], self.start[1], self.start[2])
        endJntVec = om.MVector(self.end[0], self.end[1], self.end[2])
        diffVec = endJntVec - startJntVec

        # calculate the witdth of the surface as a fraction of the total joint chain length
        jntChainLength = diffVec.length()
        self.width = jntChainLength * self.widthMult

        crv1 = pm.duplicate(pm.ls(self.buildCrv)[0])[0]
        crv1.setPivots(self.start)
        crv2 = pm.duplicate(crv1)[0]

        self.offsetCrv(crv1, -0.3 * self.width)
        self.offsetCrv(crv2, 0.3 * self.width)

        loftSrf = pm.loft(crv1,
                          crv2,
                          ch=0,
                          u=1,
                          c=0,
                          ar=1,
                          d=1,
                          ss=1,
                          rn=0,
                          po=0,
                          rsn=1)[0]
        loftSrf = \
        pm.rebuildSurface(ch=0, rpo=1, rt=0, end=1, kr=0, kcp=0, kc=0, su=0, du=1, sv=0, dv=1, tol=0, fr=0, dir=2,
                          n=self.name + "_srf")[0]
        pm.rename(loftSrf, self.name + "_srf")
        loftSrf.setPivots(loftSrf.c.get())
        self.rbnSrf = loftSrf
        pm.delete(self.rbnSrf, ch=1)

        pm.delete([crv1, crv2])
        pm.parent(self.rbnSrf, self.mainGrp)