예제 #1
0
파일: pkTools.py 프로젝트: myCodeTD/pkmel
def friendsCreateProxyCube() :
	# Create a polygon cube as a proxy of a hair mesh
	# Select joints then run script
	
	sels = mc.ls( sl=True )
	selSize = len( sels )
	
	cube = mc.polyCube( sx=1 , sy=len( sels )-1 , sz = 1 , ch=False )[0]
	
	for ix in range( selSize ) :
		
		# print sels[ len( sels ) - ix - 1 ]
		# select -r pCube1.vtx[0:1] pCube1.vtx[18:19] ;
		# select -r pCube1.vtx[2:3] pCube1.vtx[16:17] ;
		# CreateCluster;
		minA , maxA = 0 + ( ix*2 ) , 1 + ( ix*2 )
		minB , maxB = ( selSize * 4 ) - 2 - ( ix*2 ) , ( selSize * 4 ) - 1 - ( ix*2 )
		
		mc.select( '%s.vtx[%s:%s]' % ( cube , minA , maxA ) , r=True )
		mc.select( '%s.vtx[%s:%s]' % ( cube , minB , maxB ) , add=True )
		
		mm.eval( 'CreateCluster' )
		clstr = mc.ls( sl=True )[0]
		zGrp = rigTools.zeroGroup( clstr )
		mc.parentConstraint( sels[ ix ] , zGrp )
예제 #2
0
파일: arcIK.py 프로젝트: jonntd/zentools
	def constrainJoints(self): # Rivet & constrain joints to the ArcCtrl surface

		rivetArgs=[]
		cjLen=1
		for j in self.jointHierarchy[1:]:
			if self.spread:
				cj=removeAll\
				(
					self.jointHierarchy[1:],
					iterable(mc.listRelatives(j,c=True,type='transform'))
				)
				rivetArgs.extend(cj)
				cjLen=len(cj)+1

			rivetArgs.append(j)

		skipRotate=[]
		for sr in range(1,cjLen+1):
			skipRotate.append(-sr)

		rivetArgs.append(self.ArcCtrl.outputSurface)

		self.rivet=Rivet(rivetArgs,constraint=True,skipRotate=skipRotate)

		if not\
		(
			mc.connectionInfo(self.jointHierarchy[-1]+'.r',id=True) or
			mc.connectionInfo(self.jointHierarchy[-1]+'.rx',id=True) or
			mc.connectionInfo(self.jointHierarchy[-1]+'.ry',id=True) or
			mc.connectionInfo(self.jointHierarchy[-1]+'.rz',id=True)
		):
			mc.parentConstraint(self.ArcCtrl.handles[-1],self.jointHierarchy[-1],st=('x','y','z'),mo=True)
			if self.spread or self.curl:
				for j in cj:
					mc.parentConstraint(self.ArcCtrl.handles[-1],j,st=('x','y','z'),mo=True)
예제 #3
0
 def connectBind(self):
     #Create opposite node to blend
     blendOpposite = rc.create1MinusNode(
         "%s.%s" %(self.m_blendControl, self.m_blendAttr),
         "%s_IKFKBlendOpp_CTRL" %(self.m_name)
         )
     for i in range(len(self.m_bindJoints)):
         const1 = cmds.parentConstraint(
             self.m_ikJoints[i],
             self.m_bindJoints[i],
             st = ["x", "y", "z"]
             )[0]
         const2 = cmds.parentConstraint(
             self.m_fkJoints[i],
             self.m_bindJoints[i],
             st = ["x", "y", "z"]
             )[0]
         cmds.connectAttr(
             blendOpposite,
             "%s.blendParent2" %(self.m_bindJoints[i])
             )
         # Change to quarternion
         pairBlend = cmds.listConnections(
             "%s.constraintRotateX" %(const1),
             d=1
             )[0]
         cmds.setAttr("%s.rotInterpolation" %(pairBlend), 1)
예제 #4
0
def addNoiseOnControl(Object, Control):
    if Object.__class__ == list:
        pass

    elif Object.__class__ in [str, unicode]:
        Object = [Object]

    else:
        "Not Valid Arguments on Add Noise"
        return None

    Expresion = """//{0}
    {0}.rotateX=`noise((time+{2})*{1}.frequency)`*{1}.amplitud;
    {0}.rotateY=`noise((time+{2}+30)*{1}.frequency)`*{1}.amplitud;
    {0}.rotateZ=`noise((time+{2}+60)*{1}.frequency)`*{1}.amplitud;
    {0}.ty=`noise((time+{2}+90)*{1}.frequency)`*{1}.movY + {1}.movY;
    """
    if not isNoiseControl(Control):
        addAttributes(Control)

    for eachObject in Object:
        constraints = constraintComponents(gessFrom=eachObject)
        ResetGroup = RMRigTools.RMCreateGroupOnObj(eachObject, Type="child")
        for eachkey in constraints.constraintDic:
            cmds.delete(eachkey)
            cmds.parentConstraint(ResetGroup, constraints.constraintDic[eachkey]["affected"], mo=True)
        ExpressionNode = cmds.expression(
            name="NoiseMainExpresion", string=Expresion.format(ResetGroup, Control, random.uniform(0, 100))
        )
예제 #5
0
def keyToOn():
    controller = mc.ls(sl=True)[0]

    channelBox = mel.eval('global string $gChannelBoxName; $temp=$gChannelBoxName;')	#fetch maya's main channelbox
    attrs = mc.channelBox(channelBox, q=True, sma=True)

    if attrs:
        channel = controller + "." + attrs[0]
        constraint = mc.listConnections(channel, type="constraint")[0]
        currentTime = mc.currentTime( query=True )

        # save rest pose on constraint
        # mc.currentTime(currentTime-1)
        constraintChannels = mc.listConnections(constraint, type="animCurve")
        mc.parentConstraint(controller, constraint, edit=True, maintainOffset=True)
        for i in constraintChannels:
            value = mc.getAttr(mc.listConnections(i, plugs=True)[0])
            setKeyframe(mc.listConnections(i, plugs=True)[0], currentTime, value)

        # set key on 1 for controller
        setKeyframe(channel, currentTime-1, value=0)
        setKeyframe(channel, currentTime, value=1)

        # mc.currentTime( currentTime )
    else:
        mc.warning("Select constrain channel!")
def creatSphere(*args):
    circleSel = mc.ls(sl=1)[0]
    radiusCircle = mc.circle(circleSel, q=1, r=1)
    radiusSpere = radiusCircle*.75
    particleSphere = mc.polySphere(n='%s_Sphere'%circleSel, r=radiusSpere, sx=float(radiusSpere), sy=float(radiusSpere), ax=[0, 1, 0])[0]
    mc.parentConstraint(circleSel, particleSphere, mo=0, w=1)
    #mc.parent(particleSphere, circleSel)
    mc.setAttr('%s.tx'%particleSphere, 0)
    mc.setAttr('%s.ty'%particleSphere, 0)
    mc.setAttr('%s.tz'%particleSphere, 0)
    mc.setAttr('%s.rx'%particleSphere, 0)
    mc.setAttr('%s.ry'%particleSphere, 0)
    mc.setAttr('%s.rz'%particleSphere, 0)
    mc.setAttr('%s.v'%particleSphere, 0)
    mc.select(particleSphere, r=1) 
    mc.emitter(type='surface', r=4, dx=1, dy=0, dz=0, n='%s_emitter'%circleSel )
    mc.particle( n='%s_Particles'%circleSel )
    mc.connectDynamic( '%s_Particles'%circleSel, em='%s_emitter'%circleSel )
    particlesShape = mc.listRelatives('%s_Particles'%circleSel, s=1)[0]
    mc.setAttr('%s.lifespanMode'%particlesShape, 1)
    mc.setAttr('%s.lifespan'%particlesShape, 0.4)
    mc.setAttr('%s.startFrame'%particlesShape, 1001)
    mc.connectControl( 'numText', '%s.rate'%('%s_emitter'%circleSel) )
    mc.shadingNode('blinn', n='%s_blinn'%circleSel, asShader=1)
    mc.sets( n='%s_blinnSG'%circleSel, renderable=True, noSurfaceShader=True, empty=1)
    mc.connectAttr('%s.outColor'%('%s_blinn'%circleSel), '%s.surfaceShader'%('%s_blinnSG'%circleSel))
    mc.connectControl( 'myColorIndex', '%s.color'%('%s_blinn'%circleSel) )
    mc.connectControl( 'lifeText', '%s.lifespan'%particlesShape )
    mc.sets('%s_Particles'%circleSel, e=1, forceElement='%s'%('%s_blinnSG'%circleSel))
예제 #7
0
def create_spine_rig(base_curve, rig_region_name, pelvis, cog, spine_1, spine_2, spine_3, spine_4, neck):

    # create group to contain all rigging nodes
    cmds.select(cl=True)
    spine_group = cmds.group(em=True, n=rig_region_name + '_group')
    cmds.select(spine_group, base_curve, r=True)
    cmds.parent()

    # add the arm group node to the base curve rig nodes attr
    add_node_to_rig_nodes(base_curve, rig_region_name, spine_group)

    cog_curve, cog_curve_group = jt_ctl_curve.create(cog, 'star_5', lock_unused=False)
    cmds.setAttr(cog_curve + '.scale', 3,3,3)
    cmds.select(cog_curve, r=True)
    cmds.makeIdentity(apply=True, t=0, r=0, s=1, n=0)

    cmds.select(cog_curve, cog, r=True)
    cmds.parentConstraint(mo=True, weight=1)
    cmds.scaleConstraint(mo=True, weight=1)

    cmds.select(cog_curve_group, base_curve, r=True)
    cmds.parent()

    pelvis_curve, pelvis_curve_group = jt_ctl_curve.create(pelvis, 'waist', True, True, True, True)
    spine_1_curve, spine_1_curve_group = jt_ctl_curve.create(spine_1, 'circle', True, True, True, True)
    spine_2_curve, spine_2_curve_group = jt_ctl_curve.create(spine_2, 'circle', True, True, True, True)
    spine_3_curve, spine_3_curve_group = jt_ctl_curve.create(spine_3, 'circle', True, True, True, True)
    spine_4_curve, spine_4_curve_group = jt_ctl_curve.create(spine_4, 'circle', True, True, True, True)
    neck_curve, neck_curve_group = jt_ctl_curve.create(neck, 'circle', True, True, True, True)

    # parent fk controlls to spine group
    cmds.select(cog_curve_group, pelvis_curve_group, spine_1_curve_group, spine_2_curve_group, spine_3_curve_group, spine_4_curve_group, neck_curve_group, spine_group, r=True)
    cmds.parent()
예제 #8
0
	def __init__( self, fkik_snap_set ):
		cmds.select( cl = True )
		self.get_globals()

		for obj in cmds.sets( fkik_snap_set, q = True ):
			controller = DAG_Node( obj )

			obj_snap_attr = '{0}.{1}'.format( controller.name(), self.snap_parent_str )

			if cmds.objExists( obj_snap_attr ):
				obj_snap = cmds.listConnections( obj_snap_attr )

				if obj_snap:
					obj_snap = obj_snap[0]
					snap_grp = DAG_Node( cmds.group( n = '{0}_Snap_Grp'.format( obj.split( '|' )[-1] ), em = True ) )

					snap_grp.set_parent( controller.parent() )

					obj_tra = cmds.xform( controller.name(), ws = True, rp = True, q = True )
					cmds.xform( snap_grp.name(), ws = True, t = obj_tra )

					obj_rot = cmds.xform( controller.name(), ws = True, ro = True, q = True )
					cmds.xform( snap_grp.name(), ws = True, ro = obj_rot )

					cmds.makeIdentity( snap_grp.name(), a = True, t = True, r = True, s = True )

					cmds.parentConstraint( obj_snap, snap_grp.name(), mo = True )

					snap_grp_attr = Maya_Util().add_attr( snap_grp.name(), self.snap_parent_str, 'message' )
					cmds.connectAttr( snap_grp_attr, obj_snap_attr, force = True )

		cmds.select( cl = True )
 def addJoint(side='L'):
     if mc.objExists('%s_armPalm_bnd_0'%side):return
     
     # make joint and locators
     Joint = mc.createNode('joint', name='%s_armPalm_bnd_0'%side)
     JointGroup = mc.group(Joint, name='%s_armPalm_bndgrp_0'%side)
     FKloc = mc.spaceLocator(p=(0,0,0), name='%s_armPalmFK_loc_0'%side)[0]
     IKloc = mc.spaceLocator(p=(0,0,0), name='%s_armPalmIK_loc_0'%side)[0]
     
     # constraint 
     constraintNode = mc.parentConstraint(FKloc, IKloc, JointGroup)
     
     # match position
     mc.delete(mc.parentConstraint('%s_armMiddleAIK_jnt_0'%side, FKloc))
     mc.delete(mc.parentConstraint('%s_armMiddleAIK_jnt_0'%side, IKloc))
 
     # parent locator
     mc.parent(FKloc, '%s_armWristFk_jnt_0'%side)
     mc.parent(IKloc, '%s_armMiddleAIK_jnt_0'%side)
     
     # make ikfk switch
     reverseNode = [x.split('.')[0] for x in mc.connectionInfo('%s_armFkIk_ctl_0.FKIKBlend'%side, dfs=True) if mc.nodeType(x.split('.')[0])=='reverse'][0]
     mc.connectAttr('%s.outputX'%reverseNode, '%s.%sW0'%(constraintNode[0], FKloc))
     mc.connectAttr('%s_armFkIk_ctl_0.FKIKBlend'%side, '%s.%sW1'%(constraintNode[0], IKloc))
     
     # add to bind set
     mc.sets(Joint, e=True, forceElement='bind_joints_set')
     
     # connect jointLayer
     mc.connectAttr('jointLayer.drawInfo',  '%s.drawOverride'%Joint)
     
     # parent joint
     mc.parent(JointGroup, '%s_armBind_org_0'%side)
예제 #10
0
def createControl( si, shape = 'circleX', childsAlso = True, par = None, lastAlso = False, constraint = True, connect = False, offsetGroup = True ):
	if not lastAlso and not si.children:
		return
	if shape == 'joint':
		mc.select( cl = True )
		curv = mn.Node( mc.joint( n = si.name + "_jnt" ) )
	elif shape == 'locator':
		curv = mn.Node( mc.spaceLocator( n = si.name + '_loc' )[0] )
	else:
		curv = crv.Curve( si.name + "_ctl" )
		curv = curv.create( shape )
	if offsetGroup:
		grp = mn.createNode( "transform", ss = True )
		grp.name = si.name + "_grp"
		trf.snap( si, grp )
		curv.parent = grp
		curv.a.t.v  = [0]*3
		curv.a.r.v  = [0]*3
		if par:
			grp.parent = par
	else:
		trf.snap( si, curv )
		curv.freeze()
	if constraint:
		mc.parentConstraint( curv, si, mo = True )
		mc.scaleConstraint( curv, si, mo = True )
	if connect:
		curv.a.t >> si.a.t
		curv.a.r >> si.a.r
		curv.a.s >> si.a.s
	if childsAlso and si.children:
		for c in si.children:
			c = mn.Node( c.name.split( '|' )[-1] )
			createControl( c, shape, True, curv, lastAlso, constraint, connect, offsetGroup )
예제 #11
0
def BindSkeletons(source, dest, method='connect'):
    '''
    From 2 given root joints search through each hierarchy for child joints, match
    them based on node name, then connect their trans/rots directly, or 
    parentConstrain them. Again cmds for speed
    '''
    sourceJoints = cmds.listRelatives(source, ad=True, f=True, type='joint')
    destJoints = cmds.listRelatives(dest, ad=True, f=True, type='joint')
 
    if cmds.nodeType(source) == 'joint':
        sourceJoints.append(source)
    if cmds.nodeType(dest) == 'joint':
        destJoints.append(dest)
        
    attrs = ['rotateX', 'rotateY', 'rotateZ', 'translateX', 'translateY', 'translateZ']   
     
    for sJnt, dJnt in MatchGivenHierarchys(sourceJoints, destJoints):
        if method == 'connect':
            for attr in attrs:
                try:
                    cmds.connectAttr('%s.%s' % (sJnt, attr), '%s.%s' % (dJnt, attr), f=True)
                except:
                    pass
        elif method == 'constrain':
            try:
                cmds.parentConstraint(sJnt, dJnt, mo=True)    
            except:
                pass
예제 #12
0
 def on_actionStartMove_triggered(self, args=None):
     if args==None:return
     toMoveOBJ = str(self.MovedOBJLineEdit.text())
     toKeepOBJ = str(self.KeepedOBJLineEdit.text())
     
     if not mc.objExists(toMoveOBJ) or not mc.objExists(toKeepOBJ):return
     if toMoveOBJ == toKeepOBJ:return
     
     
     self.ConstraintDT = {}
     self.ConstraintLocators = []
     
     
     for Jnt in (toKeepOBJ, toMoveOBJ):
         OldConstraintNode = [x for x in mc.listRelatives(Jnt, c=True, path=True) or [] if mc.nodeType(x).endswith('Constraint')]
         for OCSN in OldConstraintNode:
             ConstraintType = mc.nodeType(OCSN)
             ConstraintOBJ  = eval('mc.%s("%s", q=True, tl=True)'%(ConstraintType, OCSN))
             
             self.ConstraintDT.setdefault(Jnt, {})['type'] = ConstraintType
             self.ConstraintDT.setdefault(Jnt, {})['ConsOBJ'] = ConstraintOBJ
             mc.delete(OCSN)
         
         
         Loc = mc.spaceLocator(p=(0,0,0))
         mc.delete(mc.parentConstraint(Jnt, Loc))
         ConstraintNode = mc.parentConstraint(Loc[0], Jnt)
         
         self.ConstraintLocators.append(Loc[0])
         self.ConstraintLocators.append(ConstraintNode[0])
예제 #13
0
def locatorOnly(self):

    sel = cmds.ls(sl=True)

    # Gives error if more than one object is selected.
    if len(sel) > 1:
        cmds.error("Too many objects selected!")

    # Creates and snaps a locator to object.
    elif len(sel):
        tObj = sel[0]
        tLoc = "{0}_tLoc".format(tObj)
        LScale = cmds.floatField(LocScale, q=True, v=True)

        if cmds.objExists(tLoc):
            cmds.delete(tLoc)

        cmds.spaceLocator(n="{0}_tLoc".format(tObj))
        cmds.scale(LScale, LScale, LScale)
        cmds.parentConstraint(tObj, tLoc, mo=False)
        cmds.parentConstraint(tObj, tLoc, rm=True)

        print LScale
    # Gives error if no objects are selected.
    else:
        cmds.error("No objects selected!")
예제 #14
0
 def createGuide(self, *args):
     Base.StartClass.createGuide(self)
     # Custom GUIDE:
     cmds.addAttr(self.moduleGrp, longName="flip", attributeType='bool')
     cmds.setAttr(self.moduleGrp+".flip", 0)
     
     cmds.addAttr(self.moduleGrp, longName="indirectSkin", attributeType='bool')
     cmds.setAttr(self.moduleGrp+".indirectSkin", 0)
     
     cmds.setAttr(self.moduleGrp+".moduleNamespace", self.moduleGrp[:self.moduleGrp.rfind(":")], type='string')
     
     self.cvJointLoc, shapeSizeCH = ctrls.cvJointLoc(ctrlName=self.guideName+"_JointLoc1", r=0.3)
     self.connectShapeSize(shapeSizeCH)
     self.jGuide1 = cmds.joint(name=self.guideName+"_JGuide1", radius=0.001)
     cmds.setAttr(self.jGuide1+".template", 1)
     cmds.parent(self.jGuide1, self.moduleGrp, relative=True)
     
     self.cvEndJoint, shapeSizeCH = ctrls.cvLocator(ctrlName=self.guideName+"_JointEnd", r=0.1)
     self.connectShapeSize(shapeSizeCH)
     cmds.parent(self.cvEndJoint, self.cvJointLoc)
     cmds.setAttr(self.cvEndJoint+".tz", 1.3)
     self.jGuideEnd = cmds.joint(name=self.guideName+"_JGuideEnd", radius=0.001)
     cmds.setAttr(self.jGuideEnd+".template", 1)
     cmds.transformLimits(self.cvEndJoint, tz=(0.01, 1), etz=(True, False))
     ctrls.setLockHide([self.cvEndJoint], ['tx', 'ty', 'rx', 'ry', 'rz', 'sx', 'sy', 'sz'])
     
     cmds.parent(self.cvJointLoc, self.moduleGrp)
     cmds.parent(self.jGuideEnd, self.jGuide1)
     cmds.parentConstraint(self.cvJointLoc, self.jGuide1, maintainOffset=False, name=self.jGuide1+"_ParentConstraint")
     cmds.parentConstraint(self.cvEndJoint, self.jGuideEnd, maintainOffset=False, name=self.jGuideEnd+"_ParentConstraint")
     cmds.scaleConstraint(self.cvJointLoc, self.jGuide1, maintainOffset=False, name=self.jGuide1+"_ScaleConstraint")
     cmds.scaleConstraint(self.cvEndJoint, self.jGuideEnd, maintainOffset=False, name=self.jGuideEnd+"_ScaleConstraint")
def cameraFrustum_build(cam_shape):
    #make sure a camera is loaded
    if cam_shape==0:
        cmds.error('no camera loaded...select a camera and load')
    else:
    #create frustum only if one doesnt already exist
        selCamXform = cmds.listRelatives(cam_shape[0], p=1)
        prefix = 'frust_'
        frustumGrpName = prefix + 'camera_frustum_all_grp'
        if cmds.objExists(frustumGrpName)==0:
        #create main grp
            frustumMainGrp = cmds.group(em=1, n=frustumGrpName);
            cmds.setAttr(frustumGrpName + '.tx', lock=1, keyable=0, channelBox=0)
            cmds.setAttr(frustumGrpName + '.ty', lock=1, keyable=0, channelBox=0)
            cmds.setAttr(frustumGrpName + '.tz', lock=1, keyable=0, channelBox=0)
            cmds.setAttr(frustumGrpName + '.rx', lock=1, keyable=0, channelBox=0)
            cmds.setAttr(frustumGrpName + '.ry', lock=1, keyable=0, channelBox=0)
            cmds.setAttr(frustumGrpName + '.rz', lock=1, keyable=0, channelBox=0)
            cmds.setAttr(frustumGrpName + '.sx', lock=1, keyable=0, channelBox=0)
            cmds.setAttr(frustumGrpName + '.sy', lock=1, keyable=0, channelBox=0)
            cmds.setAttr(frustumGrpName + '.sz', lock=1, keyable=0, channelBox=0)
            cmds.setAttr(frustumGrpName + '.v', lock=1, keyable=0, channelBox=0)

        #create frustum geo
            frustumGeo = cmds.polyCube(w=2, h=2, d=2, n=prefix + 'camera_frustum_geo')
            cmds.delete(frustumGeo[0], constructionHistory=True)
            cmds.parent(frustumGeo[0], frustumMainGrp)

        #load plugin "nearestPointOnMesh.mll" if needed and connect
            plugin = cmds.pluginInfo('nearestPointOnMesh.mll', q=1, l=1)
            if plugin==0:
                cmds.loadPlugin('nearestPointOnMesh.mll')

            nearNodeName = prefix + 'npomNode'
            npomNode = cmds.createNode('nearestPointOnMesh', n=nearNodeName)
            cmds.connectAttr(frustumGeo[0] + '.worldMesh', npomNode + '.inMesh')

        #create clusters
            cmds.select(frustumGeo[0] + '.vtx[4:7]', r=1)
            nearCluster = cmds.cluster(n=prefix + 'camera_nearFrustum_cluster')
            cmds.select(frustumGeo[0] + '.vtx[0:3]', r=1)
            farCluster = cmds.cluster(n=prefix + 'camera_farFrustum_cluster')

        #create near/far/camera locs
            cameraLoc = cmds.spaceLocator(p=(0, 0, 0), n=prefix + 'camera_loc')
            cmds.parent(cameraLoc[0], frustumMainGrp)
            nearLoc = cmds.spaceLocator(p=(0, 0, 0), n=prefix + 'camera_nearFrustum_loc')
            cmds.move(0, 0, -1)
            farLoc = cmds.spaceLocator(p=(0, 0, 0), n=prefix + 'camera_farFrustum_loc')
            cmds.move(0, 0, 1)

        #parent clusters under loc -- parent locs under camera loc
            cmds.parent(nearCluster[1], nearLoc[0])
            cmds.parent(farCluster[1], farLoc[0])
            cmds.parent(nearLoc[0], cameraLoc[0])
            cmds.parent(farLoc[0], cameraLoc[0])
        #constrain camera loc to camera
            cmds.parentConstraint(selCamXform, cameraLoc, weight=1)

        return frustumGeo[0]
예제 #16
0
 def RMCreateHipSystem(self):
     #resetHipControl, hipControl = RMRigShapeControls.RMCircularControl(self.rootHip,radius = self.SpineLength *.7,name = "hip")
     resetHipControl, hipControl = RMRigShapeControls.RMImportMoveControl(self.rootHip, scale = self.SpineLength, name = "hip",Type = "circleDeform")
     cmds.parent( resetHipControl, self.COG)
     cmds.parentConstraint( hipControl, self.hipJoints[0])
     cmds.parent( self.rootHip, self.spineJoints[0])
     return resetHipControl, hipControl
예제 #17
0
    def RMRedistributeConstraint(self,ListOfDrivers, ListOfConstrained, MaxInfluences, KeepBorders = True, ConstraintType = "parent"):

        DeltaMaxInfluence =  1/(float (len(ListOfDrivers))-1)
        CentersControlDic = {}
        for i in range (0,len( ListOfDrivers)):
            CentersControlDic[ListOfDrivers[i]] = ( DeltaMaxInfluence*i)

        pprint.pprint (CentersControlDic)
        DeltaPositionConstrained = float(1/(float(len(ListOfConstrained))-1))
        PositionConstDic = {}

        for i in range(0,len( ListOfConstrained)):
            PositionConstDic[ListOfConstrained[i]] = (DeltaPositionConstrained*i)

        pprint.pprint (PositionConstDic)

        reach = MaxInfluences * DeltaMaxInfluence

        for eachConstrained in ListOfConstrained:
            for eachDriver in ListOfDrivers:
                weight = self.RMGaussCosine( PositionConstDic [ eachConstrained ], CentersControlDic [ eachDriver ], reach )
                if weight > 0:
                    if ConstraintType == "parent":
                        cmds.parentConstraint(eachDriver, eachConstrained , weight = weight,mo = True)
                    elif ConstraintType == "point":
                        cmds.pointConstraint(eachDriver, eachConstrained  , weight = weight,mo = True)
                    elif ConstraintType == "orient":
                        cmds.orientConstraint(eachDriver, eachConstrained , weight = weight,mo = True)
                    else:
                        print "not valid costraintType requested, valid types are point, parent, or orient"
def rigFace() : 
    jntGrp = 'facialJnt_grp'

    if not mc.objExists(jntGrp) : 
        mc.group(em = True, n = jntGrp)

    facePolyMap = {'L_brow_ply': 'L_brow_ctrl',
                     'L_baseEye_ply': 'L_baseEye_ctrl', 
                     'L_eye_ply': 'L_eye_ctrl',
                     'R_brow_ply': 'R_brow_ctrl', 
                     'R_baseEye_ply': 'R_baseEye_ctrl', 
                     'R_eye_ply': 'R_eye_ctrl', 
                     'nose_ply': 'noseface_ctrl', 
                     'mouth_ply': 'mount_ctrl'
                     }

    for each in facePolyMap : 
        poly = each
        ctrl = facePolyMap[poly]

        if mc.objExists(poly) : 

            movePivot(ctrl, poly)

            joint = mc.createNode('joint', n = poly.replace('_ply', '_jnt'))
            mc.delete(mc.pointConstraint(poly, joint))
            mc.skinCluster(poly, joint, tsb = True)
            mc.parentConstraint(ctrl, joint)
            mc.scaleConstraint(ctrl, joint)

            mc.parent(joint, jntGrp)
def CreateHydraulicRig(upDir, *args):

    selection = cmds.ls(sl=True)
    if len(selection) != 3:
        cmds.confirmDialog(icon = "warning!!", title = "Hydraulic Rig Tool", message = "You must select exactly 3 objects.  Top of hydraulic, bottom of hydraulic, and the up vector.")
        return
    else:
        hyd_start_01_anim = selection[0]
        hyd_start_02_anim = selection[1]
        upObject = selection[2]
        
        hyd_start_01 = hyd_start_01_anim.rpartition("_")[0]
        hyd_start_02 = hyd_start_02_anim.rpartition("_")[0]

        # Create a rig for the lower arm extra hydraulic piston.
        cmds.delete("driver_"+hyd_start_01+"_parentConstraint1")
        robo_lowarm_pistonrod_01_anim_sub = cmds.group(em=True, name=hyd_start_01_anim+"_sub", parent=hyd_start_01_anim)
        const = cmds.parentConstraint(hyd_start_01_anim, robo_lowarm_pistonrod_01_anim_sub, weight=1, mo=False)
        cmds.delete(const)
        const = cmds.parentConstraint(robo_lowarm_pistonrod_01_anim_sub, "driver_"+hyd_start_01, weight=1, mo=True)
        
        cmds.delete("driver_"+hyd_start_02+"_parentConstraint1")
        robo_lowarm_pistonrod_02_anim_sub = cmds.group(em=True, name=hyd_start_02_anim+"_sub", parent=hyd_start_02_anim)
        const = cmds.parentConstraint(hyd_start_02_anim, robo_lowarm_pistonrod_02_anim_sub, weight=1, mo=False)
        cmds.delete(const)
        const = cmds.parentConstraint(robo_lowarm_pistonrod_02_anim_sub, "driver_"+hyd_start_02, weight=1, mo=True)

        # Hook up the hydraulics for the lowerarm piston.
        const1 = cmds.aimConstraint(robo_lowarm_pistonrod_01_anim_sub, robo_lowarm_pistonrod_02_anim_sub, weight=1, mo=True, aimVector=(-1, 0, 0), upVector=(0, 0, upDir), worldUpType="object", worldUpVector=(0, 0, -1), worldUpObject=upObject)
        const2 = cmds.aimConstraint(robo_lowarm_pistonrod_02_anim_sub, robo_lowarm_pistonrod_01_anim_sub, weight=1, mo=True, aimVector=(1, 0, 0), upVector=(0, 0, upDir), worldUpType="object", worldUpVector=(0, 0, -1), worldUpObject=upObject)
    
    cmds.select(const1, const2)
예제 #20
0
파일: orientjoints.py 프로젝트: SplineO/cmt
def template_joints(joints=None, reorient_children=True, reset_orientation=True):
    if joints is None:
        joints = cmds.ls(sl=True, type='joint')
    if not joints:
        raise RuntimeError('No joint selected to orient.')

    if reorient_children:
        children = cmds.listRelatives(fullPath=True, allDescendents=True, type='joint')
        joints.extend(children)

    red, green, blue = create_shaders()

    orient_group = cmds.createNode('transform', name=ORIENT_GROUP)
    manips = []
    for joint in joints:
        if reset_orientation:
            cmds.makeIdentity(joint, apply=True)
            cmds.joint(joint, edit=True, orientJoint='xyz', secondaryAxisOrient='yup', children=False, zeroScaleOrient=True)
        if not cmds.listRelatives(joint, children=True):
            zero_orient([joint])
            continue
        group, manip = create_orient_manipulator(joint, blue)
        manips.append(manip)
        cmds.parent(group, orient_group)
        cmds.parentConstraint(joint, group)
        cmds.setAttr(joint + '.template', 1)
    cmds.select(manips)
예제 #21
0
def createIKCtrlsOnJnts(ikCrv, parentCtrl, size=1):
    ikCVNum = ll.getCurveCVCount(ikCrv)
    prev=parentCtrl
    for i in range(1, ikCVNum):
        clus = mc.cluster('%s.cv[%d]'%(ikCrv, i), n=parentCtrl.replace('masterctrl','ikClus%d')%i)
        cvPos = mc.xform('%s.cv[%d]'%(ikCrv, i), q=1, ws=1, t=1)
        mc.select(parentCtrl)
        meval('wireShape("plus")')
        ikCtrl = mc.rename(masterCtrl.replace('masterctrl','ikCtrl%d'%i))
        mc.xform(ikCtrl, t=cvPos, ws=1)
        mc.scale(size, size, size, ikCtrl, ocp=1)
        mc.makeIdentity(ikCtrl, a=1, s=1)
        mc.parent(ikCtrl, parentCtrl)
        lsZeroOut(ikCtrl)
        ctrlPR = lsZeroOut(ikCtrl, 'PR')
        mc.addAttr(ikCtrl, ln='SPACE', at='bool', k=1)
        mc.setAttr(ikCtrl+'.SPACE', l=1)
        mc.addAttr(ikCtrl, ln='parent', at='float', dv=0, min=0, max=1, k=1)
        mc.addAttr(ikCtrl, ln='master', at='float', dv=1, min=0, max=1, k=1)
        mc.addAttr(ikCtrl, ln='world', at='float', dv=0, min=0, max=1, k=1)
        mc.parentConstraint(ikCtrl, clus)
        cons = mc.parentConstraint(prev, parentCtrl, ctrlPR, mo=1)[0]
        wal = mc.parentConstraint(cons, q=1, wal=1)
        if len(wal) > 1:
            mc.connectAttr(ikCtrl+'.parent', '%s.%s'%(cons, wal[0]), f=1)
            mc.connectAttr(ikCtrl+'.master', '%s.%s'%(cons, wal[1]), f=1)
        prev=ikCtrl
예제 #22
0
파일: animRig_lib.py 프로젝트: boochos/work
def tentacleRig():
    sel = cmds.ls(sl=1)
    if sel:
        ns = sel[0].split(':')[0]
        side = sel[0].split(':')[1][0]
        g = cmds.group(n=plc.getUniqueName('__TENTACLERIG__'), em=True)
        macros = tentacleMacro(ns, side)
        micros = tentacleMicro(ns, side)
        i = 0
        j = 0
        for macro in macros:
            if i != 3:
                # macroN = tentacleMacroCt(macro)
                # cmds.parent(macroN, g)
                microN = tentacleMicroCt(micros[j], macro)
                cmds.parent(microN, g)
            if i != 3:
                macroFake = tentacleCt(parents=[macros[i], macros[i + 1]], j=j, ns=ns, side=side)
                cmds.parent(macroFake, g)
            i = i + 1
            j = j + 3
        # clean up
        if len(sel) == 2:
            cmds.parentConstraint(sel[1], g)
        p = plc.assetParent(sel[0])
        cmds.parent(g, p)
    else:
        message('Select an object or 2')
예제 #23
0
파일: ArmRig.py 프로젝트: jaredauty/Rigging
 def rigBlendControl(self, _parent):
     # Move and parent blend control
     rc.orientControl(self.m_blendControl, _parent)
     group = rg.addGroup(self.m_blendControl, "%s_0" %(self.m_blendControl))
     moveValue = -2
     if self.m_isMirrored:
         moveValue *= -1
     cmds.setAttr("%s.t%s" %(self.m_blendControl, self.m_twistAxis), moveValue)
     cmds.parentConstraint(_parent, group, mo=1)
     rc.lockAttrs(
         self.m_blendControl, 
         [
             "tx", 
             "ty",
             "tz", 
             "rx", 
             "ry", 
             "rz", 
             "sx", 
             "sy", 
             "sz", 
             "visibility"
         ],
         True,
         True
         )
예제 #24
0
    def AddSpaceObject(self, ControlObject, SpaceObject, SpaceSwitchName = "spaceSwitch"):
        SpaceSwDic = self.GetSpaceSwitchDic( ControlObject, SpaceSwitchName = SpaceSwitchName)
        
        EnumDic = self.AddEnumParameters([self.NameConv.RMGetAShortName(SpaceObject)],ControlObject)

        Switch = cmds.shadingNode('condition', asUtility=True, name = SpaceSwitchName + "SWCondition")
        cmds.connectAttr(ControlObject + "." + SpaceSwitchName, Switch + ".firstTerm")
        cmds.setAttr (Switch +".secondTerm", EnumDic[self.NameConv.RMGetAShortName(SpaceObject)])
        cmds.setAttr (Switch +".operation", 0)
        cmds.setAttr (Switch +".colorIfTrueR", 1)
        cmds.setAttr (Switch +".colorIfFalseR", 0)

        if self.NameConv.RMIsNameInFormat(ControlObject):
            Switch = self.NameConv.RMRenameBasedOnBaseName(ControlObject, Switch, NewName = Switch)
        else:
            Switch = self.NameConv.RMRenameNameInFormat(Switch)

        for eachConstraint in SpaceSwDic['constraints']:
            Object = SpaceSwDic['constraints'][eachConstraint]['object']
            parentConstraint = cmds.parentConstraint (SpaceObject, Object, mo = True)
            WA = cmds.parentConstraint (parentConstraint, q = True, weightAliasList = True)
            TL = cmds.parentConstraint (parentConstraint, q = True, targetList = True)
            if SpaceObject in TL:
                cmds.connectAttr (Switch + ".outColorR", parentConstraint[0] + "." + WA[TL.index(SpaceObject)])
            else:
                print "Error, cant find spaceobject in constraint targetList"
예제 #25
0
 def getParentConstraintDic (self, parentConstraint) :
     returnedDic = {'alias':{}, "object":None }
     aliasDic={}
     if cmds.objectType(parentConstraint)=="parentConstraint":
         WA = cmds.parentConstraint (parentConstraint, q = True, weightAliasList = True)
         TL = cmds.parentConstraint (parentConstraint, q = True, targetList = True)
     
     elif cmds.objectType(parentConstraint)=="orientConstraint":
         WA = cmds.orientConstraint (parentConstraint, q = True, weightAliasList = True)
         TL = cmds.orientConstraint (parentConstraint, q = True, targetList = True)
     
     elif cmds.objectType(parentConstraint)=="pointConstraint":
         WA = cmds.pointConstraint (parentConstraint, q = True, weightAliasList = True)
         TL = cmds.pointConstraint (parentConstraint, q = True, targetList = True)
     
     else:
         "error No constraint Type identified"
     
     if len(WA) == len(TL):
         for eachWAIndex in range(0,len(WA)):
             aliasDic[WA[eachWAIndex]] = TL[eachWAIndex]
     
     returnedDic["object"] = cmds.listConnections(parentConstraint + ".constraintRotateX")[0]
     returnedDic["alias"] = aliasDic
     return returnedDic
예제 #26
0
    def RMCreateTwist(self, TwistJoint, LookAtObject,  NumberOfTB = 3, LookAtAxis = "Y"):
        #LookAtObject = cmds.listRelatives( TwistJoint,type = "transform",children=True)[]
    
        positionA = cmds.xform(TwistJoint ,q=True,ws=True,rp=True)
        positionB = cmds.xform(LookAtObject ,q=True,ws=True,rp=True)

        vectorA = om.MVector(positionA)
        vectorB = om.MVector(positionB)

        self.RMCreateBonesBetweenPoints(vectorA,vectorB,NumberOfTB, AlignObject = TwistJoint)

        Distance = RMRigTools.RMPointDistance( TwistJoint, LookAtObject)
        
        cmds.parentConstraint (TwistJoint,self.TwistResetJoints)

        resetPoint , control = RMRigShapeControls.RMCreateBoxCtrl(self.TwistJoints[0], Xratio = .1, Yratio = .1, Zratio = .1, customSize = Distance/5 ,name = "TwistOrigin" + self.NameConv.RMGetAShortName (TwistJoint).title())
        #control = self.NameConv.RMRenameBasedOnBaseName(TwistJoint , control,  NewName = self.NameConv.RMGetAShortName(control))
        #resetPoint = self.NameConv.RMRenameBasedOnBaseName(TwistJoint , resetPoint,  NewName = self.NameConv.RMGetAShortName(resetPoint))
        
        sign = 1
        MoveDistance = Distance/5
        if "-" in LookAtAxis:
            sign = -1
        if "Z" in LookAtAxis or "z" in LookAtAxis:
            MoveList = [0,0, MoveDistance * sign]
            WUV = [0,0,sign]
        elif "Y" in LookAtAxis or "y" in LookAtAxis:
            MoveList = [0,MoveDistance * sign,0 ]
            WUV = [0,sign,0]

        cmds.xform( resetPoint, os = True, relative=True,  t = MoveList)

        cmds.aimConstraint( LookAtObject,self.TwistJoints[0], aim = [1,0,0], worldUpVector = [0,0,1], worldUpType = "object", worldUpObject = control)

        TwistJointDivide = cmds.shadingNode( "multiplyDivide", asUtility = True, name = "TwistJoint" + self.NameConv.RMGetAShortName( TwistJoint).title())
        TwistJointDivide = self.NameConv.RMRenameBasedOnBaseName( TwistJoint , TwistJointDivide,  NewName = self.NameConv.RMGetAShortName( TwistJointDivide))


        TwistAddition = cmds.shadingNode( "plusMinusAverage", asUtility = True, name = "TwistJointAdd" + self.NameConv.RMGetAShortName( TwistJoint).title())
        TwistAddition = self.NameConv.RMRenameBasedOnBaseName( TwistJoint , TwistAddition,  NewName = self.NameConv.RMGetAShortName( TwistAddition))
        NegativeLookAtRotation = cmds.shadingNode( "multiplyDivide", asUtility = True, name = "NegativeLookAtRotation" + self.NameConv.RMGetAShortName( TwistJoint).title())
        NegativeLookAtRotation = self.NameConv.RMRenameBasedOnBaseName( TwistJoint , NegativeLookAtRotation,  NewName = self.NameConv.RMGetAShortName( NegativeLookAtRotation))
        cmds.connectAttr( LookAtObject + ".rotateX", NegativeLookAtRotation + ".input1X")
        cmds.setAttr(NegativeLookAtRotation + ".input2X", -1 )
        cmds.setAttr(NegativeLookAtRotation + ".operation", 1 )
        cmds.connectAttr(self.TwistJoints[0]+".rotateX", TwistAddition + ".input1D[0]")
        cmds.connectAttr( NegativeLookAtRotation + ".outputX", TwistAddition + ".input1D[1]")
        cmds.connectAttr(TwistAddition + ".output1D", TwistJointDivide + ".input1X")


        #cmds.connectAttr(self.TwistJoints[0]+".rotateX", TwistJointDivide + ".input1X") in this case the rotation of the lookatNode was not affecting
        cmds.setAttr(TwistJointDivide + ".input2X", -(len(self.TwistJoints) - 1))
        cmds.setAttr(TwistJointDivide + ".operation", 2 )

        for eachJoint in self.TwistJoints[1:]:
            cmds.connectAttr(TwistJointDivide+".outputX", eachJoint + ".rotateX")


        self.TwistControlResetPoint = resetPoint
        self.TwistControl = control
예제 #27
0
        def closestPointOnModel(self , modelShape , obj):

                closest_Point = []
                modelShapeType = self.getObjType(modelShape)

                temp = mc.createNode('transform',name=obj+'_point_temp')
                mc.parentConstraint(obj,temp,mo = False)

                #model type data
                if modelShapeType == 'kNurbsSurface':
                        closest_Point = ['closestPointOnSurface' , temp+'_cpos' , 'local' , 'inputSurface']
                elif modelShapeType == 'kMesh':
                        closest_Point = ['closestPointOnMesh' , temp+'_cpom' , 'outMesh' , 'inMesh']

                #create getUV Node
                closest_PointNode = mc.createNode( closest_Point[0] , name = closest_Point[1] )
                mc.connectAttr( temp+'.translate' , closest_PointNode+'.inPosition' )
                mc.connectAttr( modelShape + '.' + closest_Point[2]  ,  closest_PointNode +'.' + closest_Point[3] )

                #get UV
                U = mc.getAttr(closest_PointNode + '.result.parameterU')
                V = mc.getAttr(closest_PointNode + '.result.parameterV')
                mc.delete(closest_PointNode,temp)

                return {'u':U , 'v':V}
예제 #28
0
    def create_ik_setup(self):
        """Creates the IK setup."""
        ik = cmds.ikHandle(sj=self.result_jnts[0], ee=self.result_jnts[-1], sol='ikSplineSolver', ns=1)
        cmds.rename(ik[1], '%s_%s_%s' % (self.side, 'neck', self.nc.effector))
        curve = cmds.rename(ik[2], '%s_%s_%s' % (self.side, 'neck', self.nc.curve))
        cmds.setAttr('%s.inheritsTransform' % curve, 0)
        ik = cmds.rename(ik[0], '%s_%s_%s' % (self.side, 'neck', self.nc.ikhandle))
        cmds.select(self.additional_jnts, curve)
        cmds.skinCluster(tsb=True)
        cmds.parent(ik, self.top_grp)

        cmds.setAttr('%s.dTwistControlEnable' % ik, 1)
        cmds.setAttr('%s.dWorldUpType' % ik, 4)
        cmds.setAttr('%s.dWorldUpAxis' % ik, 4)
        cmds.setAttr('%s.dWorldUpVectorY' % ik, -1)
        cmds.setAttr('%s.dWorldUpVectorEndY' % ik, 1)
        cmds.setAttr('%s.dWorldUpVectorEndZ' % ik, -1)
        cmds.connectAttr('%s.worldMatrix[0]' % self.additional_jnts[0], '%s.dWorldUpMatrix' % ik, f=True)
        cmds.connectAttr('%s.worldMatrix[0]' % self.additional_jnts[1], '%s.dWorldUpMatrixEnd' % ik, f=True)
        self.head_grp = cmds.group(self.controls['head'])
        self.head_grp = cmds.rename(self.head_grp, '%s_head_CTL_%s' % (self.side, self.nc.group))
        cmds.parent(self.head_grp, self.top_grp)
        self.c.move_pivot_to(self.guides['neckEnd'][0], self.guides['neckEnd'][1], self.guides['neckEnd'][2], self.head_grp)
        cmds.parentConstraint(self.controls['head'], self.additional_jnts[-1], mo=True, weight=1)
        cmds.orientConstraint(self.controls['head_rot'], self.result_jnts[-1], mo=True, weight=1)
예제 #29
0
def createArmSwitches(pairs, instance):
    parents = []
    enumvals = []
    connodes = []
    for p in range(len(pairs)):
        parents.append(pairs[p][0])
        con = cmds.shadingNode("condition", asUtility=True, n=instance + pairs[p][0] + 'Switch_CON')
        connodes.append(con)
        cmds.setAttr(con+'.secondTerm', p)
        enumvals.append(pairs[p][2])
        
    
    ctrlparent = cmds.listRelatives(pairs[0][1], p=True)[0]
    switchgrpname = pairs[0][1].replace('_GRP', '_SWITCH' )
    sgrp = cmds.group(n=switchgrpname, em=True)
    tc = cmds.parentConstraint(pairs[0][1], sgrp, mo=False)
    cmds.delete(tc)
    cmds.parent(sgrp, ctrlparent)
    cmds.parent(pairs[0][1], sgrp)
    parentcon = cmds.parentConstraint(parents[0], parents[1], parents[2], parents[3], parents[4], sgrp, mo=True)
    cmds.addAttr(pairs[p][2], at='enum', en="World:Root:COG:Pelvis:Chest:", shortName="switch", longName="switch", k=True)
    
    for c in range(len(connodes)):    
        cmds.setAttr(connodes[c]+'.colorIfTrueR', 1) 
        cmds.setAttr(connodes[c]+'.colorIfTrueG', 1) 
        cmds.setAttr(connodes[c]+'.colorIfTrueB', 1) 
        cmds.setAttr(connodes[c]+'.colorIfFalseR', 0)
        cmds.setAttr(connodes[c]+'.colorIfFalseG', 0)
        cmds.setAttr(connodes[c]+'.colorIfFalseB', 0)
        cmds.connectAttr(pairs[0][2]+'.switch', connodes[c]+'.firstTerm')
        cmds.connectAttr(connodes[c]+'.outColorR', parentcon[0] + '.' + pairs[c][0] + 'W' + str(c))
예제 #30
0
	def CreateFingerSquareRig(self,Finger):

		if self.NameConv.RMGetFromName(Finger[0],"Side")=="LF":
			sideVariation = 1
		else:
			sideVariation = -1

		BoxResetPoint , BoxControl = RMRigShapeControls.RMCreateBoxCtrl(Finger[len(Finger)-1], ParentBaseSize = True, Xratio = .5 ,Yratio = .5 ,Zratio = .5)
		self.RMaddFinguerControls(BoxControl)
		
		cmds.makeIdentity(BoxControl, apply = True , r = False, t = True, s = True, n = 0)
		cmds.parentConstraint(Finger[len(Finger)-1],BoxResetPoint)

		RMRigTools.RMLockAndHideAttributes(BoxControl,"0000000000")

		RMRigTools.RMConnectWithLimits (BoxControl + ".MidUD",    Finger[0] + ".rotateY", [[-10,100],[0,0],[10,-100]])
		RMRigTools.RMConnectWithLimits (BoxControl + ".MidLR",    Finger[0] + ".rotateZ", [[-10,sideVariation * 120],[0,0],[10,sideVariation * -127]])
		RMRigTools.RMConnectWithLimits (BoxControl + ".MidTwist", Finger[0] + ".rotateX" ,[[-10,sideVariation * 90],[0,0],[10,sideVariation * -90]])
		index = 1
		for eachjoint in range(0,len(Finger)-1):
			RMRigTools.RMConnectWithLimits (BoxControl + ".UD" + str(index),    Finger[eachjoint] + ".rotateY", [[-10,100],[0,0],[10,-100]])
			RMRigTools.RMConnectWithLimits (BoxControl + ".LR" + str(index),    Finger[eachjoint] + ".rotateZ", [[-10,sideVariation * 120],[0,0],[10,sideVariation * -127]])
			RMRigTools.RMConnectWithLimits (BoxControl + ".Twist" + str(index), Finger[eachjoint] + ".rotateX" ,[[-10, sideVariation * 90],[0,0],[10, sideVariation * -90]])
			index += 1
		self.fingerControlsReset.append(BoxResetPoint)
		self.fingerContols.append(BoxControl)
예제 #31
0
def spaceSwitchSetup(targets, contained):
    contained_grp = utility.getPrt(contained)
    if not contained_grp or utility.getShapes(contained_grp):
        contained_grp = groupIt([contained])[0]

    select_list = []

    # check if it already parentconstrainted
    constraint = cmds.listConnections(
        "%s.translateX" % contained_grp, d=0, s=1)
    oldLoc = ''
    loc_name = contained.split("|")[-1].split(":")[-1] + '_loc'
    if constraint:
        constraint = constraint[0]

        loc_weight_name = cmds.listAttr(constraint, st=loc_name+"*", ud=1)
        print(loc_name)
        print(loc_weight_name)
        if loc_weight_name:
            target_name = cmds.listConnections(
                constraint+'.'+loc_weight_name[0], d=1, s=0, p=1)[0]
            target_name = target_name.replace(
                'targetWeight', 'targetTranslate')
            oldLoc = cmds.listConnections(target_name, d=0, s=1)[0]

    if not oldLoc:
        loc = cmds.spaceLocator(name=loc_name)[0]
        cmds.matchTransform(loc, contained_grp)
        contained_grp_prt = utility.getPrt(contained_grp)
        if contained_grp_prt:
            loc = cmds.parent(loc, contained_grp_prt)[0]

        cmds.setAttr("%s.v"%loc, 0)
        utility.fixedObj([loc])

        oldLoc = loc

    print(oldLoc)
    select_list.append(oldLoc)
    loc_name = oldLoc.split("|")[-1].split(":")[-1]
    print(loc_name)

    for target in targets:
        select_list.append(target)

    select_list.append(contained_grp)

    cmds.select(cl=1)
    for obj in select_list:
        cmds.select(obj, add=1)

    constraint = cmds.parentConstraint(mo=1)[0]

    target_list = cmds.listAttr(constraint, st="*W*", ud=1)
    print(target_list)

    # edit enum
    enumName = ''
    parentInx = 0
    for inx, target in enumerate(target_list):
        if loc_name == target[0:-2]:
            parentInx = inx
            enumName = enumName + ":origin"
        else:
            enumName = enumName + ":" + target[0:-2]

    enumName = enumName[1:]

    if cmds.attributeQuery('follow', node=contained, ex=1):
        # edit
        cmds.addAttr("%s.follow" % contained, k=1, e=1,
                     ln="follow", at="enum", en=enumName)
    else:
        # create
        cmds.addAttr(contained, k=1, ln="follow", at="enum", en=enumName)

    # set to parent as defualt
    cmds.setAttr("%s.follow" % contained, parentInx)

    condition_nodes = cmds.listConnections("%s.follow" % contained, d=1, s=0)
    # print(condition_nodes)
    if condition_nodes:
        for nodes in condition_nodes:
            cmds.delete(nodes)
    # connect node
    for inx, target in enumerate(target_list):
        condition_node = cmds.shadingNode("condition", au=1)

        cmds.connectAttr("%s.follow" % contained,
                         "%s.firstTerm" % condition_node, f=1)

        weight_name = constraint+"."+target

        cmds.connectAttr("%s.outColorR" % condition_node, weight_name, f=1)
        cmds.setAttr("%s.secondTerm" % condition_node, inx)
        cmds.setAttr("%s.operation" % condition_node, 1)
    
    cmds.select(contained)
예제 #32
0
def addParentConstraint(parentLs, childLs):
    if len(parentLs) != len(childLs):
        print "number of parents is not equal to number of children"
        return None
    for i in xrange(len(parentLs)):
        cmds.parentConstraint(parentLs[i], childLs[i], maintainOffset=True)
예제 #33
0
def makeHeadStreatch(jointCount=5):
    # -> testing guide
    if not getHeadStreatchGuide(): return

    # -> make curve
    attachCurve = makeAttachCurve()
    upVectorCurve = mc.duplicate(attachCurve)[0]
    baseDistanceCurve = mc.duplicate(attachCurve)[0]

    # -> move up vector curve
    mc.move(mc.arclen(upVectorCurve, ch=False) / 18,
            0,
            0,
            upVectorCurve,
            r=True)

    # -> make joints
    Joints, upLocators = makeAttachJoints(attachCurve, upVectorCurve,
                                          jointCount)

    moreWeghtJnt = mc.createNode('joint')
    mc.delete(mc.parentConstraint(Joints[0], moreWeghtJnt))
    mc.setAttr('%s.radius' % moreWeghtJnt, 1.5)

    # -> make bend Joints
    BendJoints = []
    for i, jnt in enumerate(Joints):
        BendJoints.append(mc.createNode('joint'))
        mc.delete(mc.parentConstraint(jnt, BendJoints[i]))
        mc.makeIdentity(BendJoints[i], t=True, r=True, s=True, apply=True)
        if i > 0:
            mc.parent(BendJoints[i], BendJoints[i - 1])

    # -> make streatch
    #-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    distanceValueNode = mc.arclen(attachCurve, ch=True)
    baseValueNode = mc.arclen(baseDistanceCurve, ch=True)

    divdeNode = mc.createNode('multiplyDivide')

    for attr in ('input2X', 'input1Y', 'input2Z'):
        mc.connectAttr('%s.arcLength' % distanceValueNode,
                       '%s.%s' % (divdeNode, attr))

    for attr in ('input1X', 'input2Y', 'input1Z'):
        mc.connectAttr('%s.arcLength' % baseValueNode,
                       '%s.%s' % (divdeNode, attr))

    mc.setAttr('%s.operation' % divdeNode, 2)

    for jnt in Joints:
        for attr in 'XYZ':
            mc.connectAttr('%s.output%s' % (divdeNode, attr),
                           '%s.scale%s' % (jnt, attr))
    #  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    DisStartLocator = mc.spaceLocator(p=(0, 0, 0))[0]
    DisEndLocator = mc.spaceLocator(p=(0, 0, 0))[0]
    DistanceNode = mc.createNode('distanceBetween')
    DisDivideNode = mc.createNode('multiplyDivide')

    mc.delete(mc.parentConstraint(BendJoints[0], DisStartLocator))
    mc.delete(mc.parentConstraint(BendJoints[-1], DisEndLocator))

    mc.connectAttr(
        '%s.worldPosition[0]' %
        mc.listRelatives(DisStartLocator, s=True, path=True)[0],
        '%s.point1' % DistanceNode)
    mc.connectAttr(
        '%s.worldPosition[0]' %
        mc.listRelatives(DisEndLocator, s=True, path=True)[0],
        '%s.point2' % DistanceNode)

    mc.connectAttr('%s.distance' % DistanceNode, '%s.input1Y' % DisDivideNode)
    mc.setAttr('%s.input2Y' % DisDivideNode,
               mc.getAttr('%s.input1Y' % DisDivideNode))
    mc.setAttr('%s.operation' % DisDivideNode, 2)

    for jnt in BendJoints:
        mc.connectAttr('%s.outputY' % DisDivideNode, '%s.sy' % jnt)
    #-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

    # -> Rig
    # - bend joints -
    #BendIKHandle = mc.ikHandle(sj=BendJoints[0], ee=BendJoints[1])
    VectorLoc = mc.spaceLocator(p=(0, 0, 0))[0]

    mc.delete(mc.parentConstraint(Joints[0], VectorLoc))
    mc.move(mc.arclen(upVectorCurve, ch=False) / 18, 0, 0, VectorLoc, r=True)

    for i, jnt in enumerate(BendJoints):
        if i > 0:
            mc.connectAttr('%s.rotate' % BendJoints[0], '%s.rotate' % jnt)

    # - skin bind Curve -
    mc.skinCluster(BendJoints, attachCurve)
    mc.skinCluster(BendJoints, upVectorCurve)

    # - make Cotrol -
    localStartControl = mc.circle(nr=(0, 1, 0), ch=False)[0]
    localEndControl = mc.circle(nr=(0, 1, 0), ch=False)[0]

    localStartControlGrp = mc.group(localStartControl)
    localEndControlGrp = mc.group(localEndControl)

    startControl = mc.circle(nr=(0, 1, 0), ch=False)[0]
    endControl = mc.circle(nr=(0, 1, 0), ch=False)[0]

    startControlGrp = mc.group(startControl)
    endControlGrp = mc.group(endControl)

    #  - match position -
    mc.delete(mc.parentConstraint(Joints[0], localStartControlGrp))
    mc.delete(mc.parentConstraint(Joints[-1], localEndControlGrp))

    mc.delete(mc.parentConstraint(Joints[0], startControlGrp))
    mc.delete(mc.parentConstraint(Joints[-1], endControlGrp))

    # - add Attribute -
    mc.addAttr(endControl, ln='range', min=0, max=3, dv=1)
    mc.setAttr('%s.range' % endControl, k=False, cb=True)

    # - connect -
    for i, attr in enumerate(
        ('tx', 'ty', 'tz', 'rx', 'ry', 'rz', 'sx', 'sy', 'sz', 'v')):

        mc.connectAttr('%s.%s' % (startControl, attr),
                       '%s.%s' % (localStartControl, attr))

        if i < 3:
            multiNode = mc.createNode('multDoubleLinear')
            mc.connectAttr('%s.%s' % (endControl, attr),
                           '%s.input1' % multiNode)
            mc.connectAttr('%s.range' % endControl, '%s.input2' % multiNode)
            mc.connectAttr('%s.output' % multiNode,
                           '%s.%s' % (localEndControl, attr))
        else:
            mc.connectAttr('%s.%s' % (endControl, attr),
                           '%s.%s' % (localEndControl, attr))

        if i > 2:
            mc.setAttr('%s.%s' % (startControl, attr), l=True, k=False)
            mc.setAttr('%s.%s' % (endControl, attr), l=True, k=False)

    # - constraint -
    mc.pointConstraint(localStartControl, BendJoints[0])
    mc.aimConstraint(localEndControl,
                     BendJoints[0],
                     aim=(0, 1, 0),
                     wu=(1, 0, 0),
                     wuo=VectorLoc,
                     wut='object')
    # -> Compile
    JointGrp = mc.group(Joints, moreWeghtJnt)
    LocatorGrp = mc.group(upLocators)
    CurveGrp = mc.group(attachCurve, upVectorCurve, baseDistanceCurve)

    BendJointGrp = mc.group(BendJoints[0])

    controlGrp = mc.group(startControlGrp, endControlGrp)
    localControlGrp = mc.group(localStartControlGrp, localEndControlGrp)
    setGrp = mc.group(JointGrp, BendJointGrp, LocatorGrp, CurveGrp)

    rootGrp = mc.group(controlGrp, localControlGrp, setGrp)

    mc.parent(DisStartLocator, localStartControl)
    mc.parent(DisEndLocator, localEndControl)

    mc.parent(VectorLoc, localStartControl)

    # -> rename
    # - bend set -
    DisStartLocator = mc.rename(DisStartLocator, 'C_HSbendDisStart_loc_0')
    DisEndLocator = mc.rename(DisEndLocator, 'C_HSbendDisEnd_loc_0')

    for i, jnt in enumerate(BendJoints):
        BendJoints[i] = mc.rename(jnt,
                                  'C_HSbend%s_jnt_0' % string.uppercase[i])
    BendJointGrp = mc.rename(BendJointGrp, 'C_HSbendJoint_jnh_0')

    VectorLoc = mc.rename(VectorLoc, 'C_HSBendVector_loc_0')
    # - joint -
    for i, jnt in enumerate(Joints):
        Joints[i] = mc.rename(jnt,
                              'C_headStreatch%s_bnd_0' % string.uppercase[i])

    moreWeghtJnt = mc.rename(moreWeghtJnt, 'C_headStreatch_bnd_0')
    JointGrp = mc.rename(JointGrp, 'C_headStreatch_bndG_0')

    # - locator -
    for i, loc in enumerate(upLocators):
        upLocators[i] = mc.rename(
            loc, 'C_headStreatchUp%s_loc_0' % string.uppercase[i])

    mc.rename(LocatorGrp, 'C_headStreatch_locG_0')

    # - control -
    startControl = mc.rename(startControl, 'C_HSstart_ctl_0')
    endControl = mc.rename(endControl, 'C_HSend_ctl_0')

    startControlGrp = mc.rename(startControlGrp, 'C_HSstart_cth_0')
    endControlGrp = mc.rename(endControlGrp, 'C_HSend_cth_0')

    localStartControl = mc.rename(localStartControl, 'C_HSstartLocal_ctl_0')
    localEndControl = mc.rename(localEndControl, 'C_HSendLocal_ctl_0')

    localStartControlGrp = mc.rename(localStartControlGrp,
                                     'C_HSstartLocal_cth_0')
    localEndControlGrp = mc.rename(localEndControlGrp, 'C_HSendLocal_cth_0')

    controlGrp = mc.rename(controlGrp, 'C_headStreatch_cth_0')
    localControlGrp = mc.rename(localControlGrp, 'C_headStreatchLocal_cth_0')

    # - curve -
    attachCurve = mc.rename(attachCurve, 'C_HSJointAttach_cus_0')
    upVectorCurve = mc.rename(upVectorCurve, 'C_HSLocatorAttach_cus_0')
    baseDistanceCurve = mc.rename(baseDistanceCurve, 'C_HSDistance_cus_0')

    mc.rename(CurveGrp, 'C_HeadStreatch_cusgrp_0')

    # - comp group -
    mc.rename(setGrp, 'C_headStreatch_setg_0')
    mc.rename(rootGrp, 'C_headStreatch_grp_0')

    # -> clean up
    mc.hide(upLocators)
    mc.hide(upVectorCurve, baseDistanceCurve)
    mc.hide(localControlGrp)
    mc.hide(BendJointGrp)

    mc.setAttr('%s.template' % attachCurve, 1)

    # -> create selection sets
    mc.sets(Joints, moreWeghtJnt, name='C_HSJoint_set_0')
    mc.sets(startControl, endControl, name='C_HSControl_set_0')
예제 #34
0
# Grab all joints from selection
selected_joints = cmds.ls(selection=True, type='joint')

# For every joint that doesn't contain "end" or "eye", do something
for jnt in selected_joints:
    if 'end' in jnt or 'eye' in jnt:
        pass
    else:
        #Create Ctrl in the same way we did before
        joint_name = jnt[:-3]
        ctrl = cmds.circle(name=joint_name + 'ctrl',
                           normal=[1, 0, 0],
                           radius=1.5,
                           ch=False)
        grp = cmds.group(name=(ctrl[0] + 'grp'))
        constraint = cmds.parentConstraint(jnt, grp)
        cmds.delete(constraint)
        cmds.parentConstraint(ctrl[0], jnt)

        #Auto parents new controls
        # "or []" Accounts for root joint that doesn't have a parent, it forces it to be a list instead of "NoneType"
        jnt_parent = cmds.listRelatives(jnt, allParents=True) or []
        if len(jnt_parent) == 0:
            pass
        else:
            parent_ctrl = (jnt_parent[0][:-3] + 'ctrl')
            print(parent_ctrl)

            if cmds.objExists(parent_ctrl):
                cmds.parent(grp, parent_ctrl)
예제 #35
0
def upperArmTwist(color, rollGrpParent, fkArmJoint, ikArmJoint, suffix, name,
                  prefix, upperArm, lowerArm):
    print "START Building the " + suffix + " UPPER arm twists---------------------------------------"

    #create a nice name
    name = prefix + name + suffix
    if name.find("_") == 0:
        name = name.partition("_")[2]

        # define the joints for this rig.
        upperarm = prefix + upperArm + suffix
        lowerarm = prefix + lowerArm + suffix
        driver_clavicle = "driver_" + prefix + "clavicle" + suffix
        driver_upperarm = "driver_deltoid_" + prefix + upperArm + suffix
        driver_lowerarm = "driver_" + prefix + lowerArm + suffix

        numRolls = 0
        for joint in [
                "_twist_01", "_twist_02", "_twist_03", "_twist_04",
                "_twist_05", "_twist_06"
        ]:
            if cmds.objExists("driver_" + prefix + upperArm + joint + suffix):
                numRolls = numRolls + 1

        print "...There are a total of " + str(numRolls) + " to build."

        for i in range(int(numRolls)):
            print "...Building upper arm twist_0" + str(i + 1)
            driver_upperarm_twist = "driver_" + prefix + upperArm + "_twist_0" + str(
                i + 1) + suffix

            rollGrp = cmds.group(empty=True,
                                 name=upperarm + "_roll_grp_0" + str(i + 1))
            cmds.parent(rollGrp, "arm_sys_grp")

            # Move the driver_upperarm_twist joint to its correct position between the driver_upperarm and its driver_lowerarm using a point constraint.
            const = cmds.parentConstraint(driver_upperarm,
                                          driver_upperarm_twist,
                                          n=driver_upperarm +
                                          "_temp_parentConst",
                                          weight=1)
            cmds.delete(const)
            const = cmds.pointConstraint(driver_upperarm,
                                         driver_lowerarm,
                                         driver_upperarm_twist,
                                         n=driver_upperarm +
                                         "_temp_PointConst",
                                         weight=1)
            cmds.delete(const)

            # Duplicate the driver_upperarm, driver_lowerarm, and driver_upperarm_twist joints
            blendJnts = []
            blend_driver_upperarmParent = cmds.duplicate(
                driver_upperarm,
                n="Blend_" + driver_upperarm + "_parent_ignore_0" + str(i + 1),
                ic=True,
                po=True)[0]
            blendJnts.append(blend_driver_upperarmParent)

            blend_driver_lowerarm = cmds.duplicate(
                driver_lowerarm,
                n="Blend_" + driver_lowerarm + "_ignore_0" + str(i + 1),
                ic=True,
                po=True)[0]
            blendJnts.append(blend_driver_lowerarm)

            blend_driver_upperarm = cmds.duplicate(
                driver_upperarm,
                n="Blend_" + driver_upperarm + "_ignore_0" + str(i + 1),
                po=True)[0]
            blendJnts.append(blend_driver_upperarm)

            blend_driver_upperarm_twist = cmds.duplicate(
                driver_upperarm_twist,
                n="Blend_" + driver_upperarm_twist + "_ignore_0" + str(i + 1),
                ic=True,
                po=True)[0]
            blendJnts.append(blend_driver_upperarm_twist)

            cmds.parent(blend_driver_lowerarm, blend_driver_upperarm_twist,
                        blend_driver_upperarmParent)
            cmds.parent(blend_driver_upperarm, blend_driver_upperarm_twist)

            # Set the parent bone to have zyx rotation order
            cmds.setAttr(blend_driver_upperarmParent + ".rotateOrder", 2)

            originalJnts = [driver_upperarm, driver_lowerarm]
            #print originalJnts

            # Now we are going to disconnect the constraints that were driving the original driver_upperarm
            # and driver_lowerarm joints and re-connect them to the parent_ignore and ignore joints that were duped from them.
            # This is so that we can create new constraints on the driver_upperarm and driver_lowerarm joints for the rig.
            j = 0
            a = 0

            #while a < len(originalJnts):
            for a in range(0, len(originalJnts)):
                # Go through the inputs of the original joints and disconnect them
                origConn = cmds.listConnections(originalJnts[a],
                                                d=False,
                                                c=+ True,
                                                p=True)

                for j in range(0, len(origConn), 2):
                    cmds.disconnectAttr(origConn[j + 1], origConn[j])
                    nameList = origConn[j + 1].split(".")[0]
                    destConn = cmds.listConnections(nameList, s=False)
                    # Find out if the node that was an input to the original joint is also an output
                    if originalJnts[a] in destConn:
                        sourceConn = cmds.listConnections(nameList,
                                                          d=False,
                                                          c=True,
                                                          p=True)
                        for k in range(0, len(sourceConn), 2):
                            # Get the input connections to the node that are connected to the original joint
                            nameConnList = sourceConn[k + 1].split(".")
                            if (nameConnList[0] == originalJnts[a]):
                                # Disconnect from the original joint and connect to the blend joint
                                cmds.disconnectAttr(sourceConn[k + 1],
                                                    sourceConn[k])
                                nameConnList[0] = blendJnts[a]
                                cmds.connectAttr(
                                    nameConnList[0] + "." + nameConnList[-1],
                                    sourceConn[k])

            # create the manual twist control
            if i == 0:
                twistCtrl = utils.createControl("circle", 15,
                                                upperarm + "_twist_anim")
            else:
                twistCtrl = utils.createControl(
                    "circle", 15, upperarm + "_twist" + str(i + 1) + "_anim")
            cmds.setAttr(twistCtrl + ".ry", -90)
            cmds.setAttr(twistCtrl + ".sx", 0.8)
            cmds.setAttr(twistCtrl + ".sy", 0.8)
            cmds.setAttr(twistCtrl + ".sz", 0.8)
            cmds.makeIdentity(twistCtrl, r=1, s=1, apply=True)

            # move the manual control to the correct location
            constraint = cmds.parentConstraint(blend_driver_upperarm_twist,
                                               twistCtrl)[0]
            cmds.delete(constraint)

            # create a group for the manual control and parent the twist to it.
            twistCtrlGrp = cmds.group(empty=True, name=twistCtrl + "_grp")
            constraint = cmds.parentConstraint(blend_driver_upperarm_twist,
                                               twistCtrlGrp)[0]
            cmds.delete(constraint)
            cmds.parent(twistCtrl, twistCtrlGrp)
            cmds.parent(twistCtrlGrp, rollGrp)
            cmds.makeIdentity(twistCtrl, t=1, r=1, s=1, apply=True)
            cmds.parentConstraint(blend_driver_upperarm_twist, twistCtrlGrp)

            # set the manual controls visibility settings
            cmds.setAttr(twistCtrl + ".overrideEnabled", 1)
            cmds.setAttr(twistCtrl + ".overrideColor", color)
            for attr in [".sx", ".sy", ".sz"]:
                cmds.setAttr(twistCtrl + attr, lock=True, keyable=False)
            cmds.setAttr(twistCtrl + ".v", keyable=False)

            # add attr on rig settings for manual twist control visibility
            cmds.select("Rig_Settings")
            if i == 0:
                cmds.addAttr(longName=(name + "twistCtrlVisUpper"),
                             at='bool',
                             dv=0,
                             keyable=True)
            cmds.connectAttr("Rig_Settings." + name + "twistCtrlVisUpper",
                             twistCtrl + ".v")

            # add attr to rig settings for the twist ammount values
            cmds.select("Rig_Settings")
            cmds.addAttr(longName=(name + "UpperarmTwist" + str(i + 1) +
                                   "Amount"),
                         defaultValue=0.5,
                         minValue=0,
                         maxValue=1,
                         keyable=True)
            for u in range(int(i + 1)):
                cmds.setAttr(
                    "Rig_Settings." + name + "UpperarmTwist" + str(u + 1) +
                    "Amount", (1.0 / (i + 2.0) * ((2.0 - u) + (i - 1.0))))

            cmds.parent(blend_driver_upperarmParent, rollGrp)

            # Constrain the original joints to the blend joints
            cmds.orientConstraint(blend_driver_upperarm,
                                  driver_upperarm,
                                  n=driver_upperarm + "_0" + str(i + 1) +
                                  "_OrntCnst",
                                  mo=True,
                                  w=1)
            cmds.pointConstraint(blend_driver_upperarm,
                                 driver_upperarm,
                                 n=driver_upperarm + "_0" + str(i + 1) +
                                 "_PtCnst",
                                 mo=True,
                                 w=1)

            cmds.orientConstraint(blend_driver_lowerarm,
                                  driver_lowerarm,
                                  n=driver_lowerarm + "_0" + str(i + 1) +
                                  "_OrntCnst",
                                  mo=True,
                                  w=1)
            cmds.pointConstraint(blend_driver_lowerarm,
                                 driver_lowerarm,
                                 n=driver_lowerarm + "_0" + str(i + 1) +
                                 "_PtCnst",
                                 mo=True,
                                 w=1)

            cmds.orientConstraint(twistCtrl,
                                  driver_upperarm_twist,
                                  n=driver_upperarm_twist + "_0" + str(i + 1) +
                                  "_OrntCnst",
                                  mo=True,
                                  w=1)
            cmds.pointConstraint(twistCtrl,
                                 driver_upperarm_twist,
                                 n=driver_upperarm_twist + "_0" + str(i + 1) +
                                 "_PtCnst",
                                 mo=True,
                                 w=1)

            # Create a driver_upperarm_twist multiplier to multiply the driver_upperarm_twist values by -.5 to counter rotate the driver_upperarm_twist and driver_upperarm back from the overall limb's driver_upperarm_twist amount.
            twistMult = cmds.shadingNode("multiplyDivide",
                                         asUtility=True,
                                         name=blend_driver_upperarm_twist +
                                         "_0" + str(i + 1) + "_MDnode")
            twistMultDrive = cmds.shadingNode(
                "multiplyDivide",
                asUtility=True,
                name=blend_driver_upperarm_twist + "_0" + str(i + 1) +
                "_Drive_MDnode")
            twistMultDriveInv = cmds.shadingNode(
                "multiplyDivide",
                asUtility=True,
                name=blend_driver_upperarm_twist + "_0" + str(i + 1) +
                "_DriveInv_MDnode")
            twistMultMultiplier = cmds.shadingNode(
                "multiplyDivide",
                asUtility=True,
                name=blend_driver_upperarm_twist + "_0" + str(i + 1) +
                "_Multiplier_MDnode")
            twistMultMultiplierInv = cmds.shadingNode(
                "multiplyDivide",
                asUtility=True,
                name=blend_driver_upperarm_twist + "_0" + str(i + 1) +
                "_MultiplierInv_MDnode")
            twistReverse = cmds.shadingNode("reverse",
                                            asUtility=True,
                                            name=blend_driver_upperarm_twist +
                                            "_0" + str(i + 1) + "_REVnode")

            cmds.connectAttr(blend_driver_upperarmParent + ".rotateX",
                             twistMult + ".input1X",
                             force=True)
            cmds.connectAttr(
                "Rig_Settings." + name + "UpperarmTwist" + str(i + 1) +
                "Amount", twistReverse + ".inputX")
            cmds.connectAttr(
                "Rig_Settings." + name + "UpperarmTwist" + str(i + 1) +
                "Amount", twistMultMultiplierInv + ".input1X")
            cmds.connectAttr(twistReverse + ".outputX",
                             twistMultMultiplier + ".input1X",
                             force=True)
            cmds.connectAttr(twistMult + ".outputX",
                             twistMultDrive + ".input1X",
                             force=True)
            cmds.connectAttr(twistMultMultiplier + ".outputX",
                             twistMultDrive + ".input2X",
                             force=True)
            cmds.connectAttr(twistMult + ".outputX",
                             twistMultDriveInv + ".input1X",
                             force=True)
            cmds.connectAttr(twistMultMultiplierInv + ".outputX",
                             twistMultDriveInv + ".input2X",
                             force=True)
            cmds.connectAttr(twistMultDrive + ".outputX",
                             blend_driver_upperarm_twist + ".rotateX",
                             force=True)
            cmds.connectAttr(twistMultDriveInv + ".outputX",
                             blend_driver_upperarm + ".rotateX",
                             force=True)
            cmds.setAttr(twistMult + ".input2X", -0.5)
            cmds.setAttr(twistMult + ".input2X", l=True)

            cmds.setAttr(twistMultMultiplier + ".input2X", 2)
            cmds.setAttr(twistMultMultiplierInv + ".input2X", 2)

            cmds.select(blend_driver_upperarmParent)

            cmds.parentConstraint(driver_clavicle, rollGrp, mo=True)
    print ".END Building the " + suffix + " UPPER arm twists---------------------------------------"
예제 #36
0
 def Position_Fn(self):
     if self.Check_Selection():
         cmds.delete(cmds.parentConstraint( adv,Ziva_Rig[i] ))
     else:
         cmds.warning(u"q")
         cmds.headsUpMessage(u"请选择组进行获取")
예제 #37
0
    def connect(self):
        # Parent spine module
        mc.parentConstraint(self.com_rig['ctrl'],
                            self.spine_rig['module'].topGrp,
                            mo=True)

        # Parent leg module
        mc.parentConstraint('c_pelvis_IK_ctrl',
                            self.l_leg_rig['base_attach_grp'],
                            mo=True)
        mc.parentConstraint('c_pelvis_IK_ctrl',
                            self.r_leg_rig['base_attach_grp'],
                            mo=True)

        # Parent arm module

        mc.parentConstraint('c_spineEnd_IK_ctrl',
                            self.l_arm_rig['base_attach_grp'],
                            mo=True)
        mc.parentConstraint('c_spineEnd_IK_ctrl',
                            self.r_arm_rig['base_attach_grp'],
                            mo=True)

        # Parent hand module
        mc.parentConstraint('l_armEnd_result_jnt',
                            self.l_hand_rig['body_attach_grp'],
                            mo=True)
        mc.parentConstraint('r_armEnd_result_jnt',
                            self.r_hand_rig['body_attach_grp'],
                            mo=True)

        # Parent neck module
        mc.parentConstraint('c_spineEnd_IK_ctrl',
                            self.neck_rig['base_attach_grp'],
                            mo=True)

        # Parent head module
        mc.parentConstraint('c_head_ctrl',
                            self.head_rig['base_attach_grp'],
                            mo=True)
예제 #38
0
    def rigModule(self, *args):
        Base.StartClass.rigModule(self)
        # verify if the guide exists:
        if cmds.objExists(self.moduleGrp):
            try:
                hideJoints = cmds.checkBox('hideJointsCB',
                                           query=True,
                                           value=True)
            except:
                hideJoints = 1
            # create lists to be integrated:
            # start as no having mirror:
            sideList = [""]
            # analisys the mirror module:
            self.mirrorAxis = cmds.getAttr(self.moduleGrp + ".mirrorAxis")
            if self.mirrorAxis != 'off':
                # get rigs names:
                self.mirrorNames = cmds.getAttr(self.moduleGrp + ".mirrorName")
                # get first and last letters to use as side initials (prefix):
                sideList = [
                    self.mirrorNames[0] + '_',
                    self.mirrorNames[len(self.mirrorNames) - 1] + '_'
                ]
                for s, side in enumerate(sideList):
                    duplicated = cmds.duplicate(
                        self.moduleGrp,
                        name=side + self.userGuideName + '_Guide_Base')[0]
                    allGuideList = cmds.listRelatives(duplicated,
                                                      allDescendents=True)
                    for item in allGuideList:
                        cmds.rename(item,
                                    side + self.userGuideName + "_" + item)
                    self.mirrorGrp = cmds.group(name="Guide_Base_Grp",
                                                empty=True)
                    cmds.parent(side + self.userGuideName + '_Guide_Base',
                                self.mirrorGrp,
                                absolute=True)
                    # re-rename grp:
                    cmds.rename(
                        self.mirrorGrp,
                        side + self.userGuideName + '_' + self.mirrorGrp)
                    # do a group mirror with negative scaling:
                    if s == 1:
                        for axis in self.mirrorAxis:
                            cmds.setAttr(
                                side + self.userGuideName + '_' +
                                self.mirrorGrp + '.scale' + axis, -1)
                # joint labelling:
                jointLabelAdd = 1
            else:  # if not mirror:
                duplicated = cmds.duplicate(self.moduleGrp,
                                            name=self.userGuideName +
                                            '_Guide_Base')[0]
                allGuideList = cmds.listRelatives(duplicated,
                                                  allDescendents=True)
                for item in allGuideList:
                    cmds.rename(item, self.userGuideName + "_" + item)
                self.mirrorGrp = cmds.group(self.userGuideName + '_Guide_Base',
                                            name="Guide_Base_Grp",
                                            relative=True)
                # re-rename grp:
                cmds.rename(self.mirrorGrp,
                            self.userGuideName + '_' + self.mirrorGrp)
                # joint labelling:
                jointLabelAdd = 0
            # store the number of this guide by module type
            dpAR_count = utils.findModuleLastNumber(CLASS_NAME,
                                                    "dpAR_type") + 1
            # run for all sides
            for s, side in enumerate(sideList):
                # redeclaring variables:
                self.base = side + self.userGuideName + "_Guide_Base"
                self.cvFootLoc = side + self.userGuideName + "_Guide_Foot"
                self.cvRFALoc = side + self.userGuideName + "_Guide_RfA"
                self.cvRFBLoc = side + self.userGuideName + "_Guide_RfB"
                self.cvRFCLoc = side + self.userGuideName + "_Guide_RfC"
                self.cvRFDLoc = side + self.userGuideName + "_Guide_RfD"
                self.cvRFELoc = side + self.userGuideName + "_Guide_RfE"
                self.cvEndJoint = side + self.userGuideName + "_Guide_JointEnd"

                # declaring attributes reading from dictionary:
                ankleRFAttr = self.langDic[self.langName]['c009_leg_extrem']
                middleRFAttr = self.langDic[
                    self.langName]['c017_RevFoot_middle']
                outsideRFAttr = self.langDic[self.langName]['c010_RevFoot_A']
                insideRFAttr = self.langDic[self.langName]['c011_RevFoot_B']
                heelRFAttr = self.langDic[self.langName]['c012_RevFoot_C']
                toeRFAttr = self.langDic[self.langName]['c013_RevFoot_D']
                ballRFAttr = self.langDic[self.langName]['c014_RevFoot_E']
                footRFAttr = self.langDic[self.langName]['c015_RevFoot_F']
                sideRFAttr = self.langDic[self.langName]['c016_RevFoot_G']
                rfRoll = self.langDic[
                    self.langName]['c018_RevFoot_roll'].capitalize()
                rfSpin = self.langDic[
                    self.langName]['c019_RevFoot_spin'].capitalize()
                rfTurn = self.langDic[
                    self.langName]['c020_RevFoot_turn'].capitalize()
                rfAngle = self.langDic[
                    self.langName]['c102_angle'].capitalize()
                rfPlant = self.langDic[
                    self.langName]['c103_plant'].capitalize()
                showCtrlsAttr = self.langDic[
                    self.langName]['c021_showControls']

                # creating joints:
                cmds.select(clear=True)
                self.footJnt = cmds.joint(name=side + self.userGuideName +
                                          "_" + ankleRFAttr.capitalize() +
                                          "_Jnt")
                utils.setJointLabel(
                    self.footJnt, s + jointLabelAdd, 18,
                    self.userGuideName + "_" + ankleRFAttr.capitalize())
                self.middleFootJxt = cmds.joint(
                    name=side + self.userGuideName + "_" +
                    middleRFAttr.capitalize() + "_Jxt")
                self.endJnt = cmds.joint(name=side + self.userGuideName +
                                         "_JEnd")
                cmds.select(clear=True)
                self.middleFootJnt = cmds.joint(
                    name=side + self.userGuideName + "_" +
                    middleRFAttr.capitalize() + "_Jnt")
                utils.setJointLabel(
                    self.middleFootJnt, s + jointLabelAdd, 18,
                    self.userGuideName + "_" + middleRFAttr.capitalize())
                self.endBJnt = cmds.joint(name=side + self.userGuideName +
                                          "B_JEnd")
                cmds.parent(self.middleFootJnt, self.middleFootJxt)
                cmds.addAttr(self.footJnt,
                             longName='dpAR_joint',
                             attributeType='float',
                             keyable=False)
                cmds.addAttr(self.middleFootJnt,
                             longName='dpAR_joint',
                             attributeType='float',
                             keyable=False)
                cmds.select(clear=True)
                '''
                Deactivate the segment scale compensate on the bone to prevent scaling problem in maya 2016
                It will prevent a double scale problem that will come from the upper parent in the rig
                '''
                if (int(cmds.about(version=True)[:4]) >= 2016):
                    cmds.setAttr(self.footJnt + ".segmentScaleCompensate", 0)
                    cmds.setAttr(
                        self.middleFootJxt + ".segmentScaleCompensate", 0)
                    cmds.setAttr(
                        self.middleFootJnt + ".segmentScaleCompensate", 0)

                # reverse foot controls:
                self.RFACtrl = self.ctrls.cvControl(
                    "id_018_FootReverse",
                    side + self.userGuideName + "_" +
                    outsideRFAttr.capitalize() + "_Ctrl",
                    r=(self.ctrlRadius * 0.1),
                    d=self.curveDegree)
                self.RFBCtrl = self.ctrls.cvControl(
                    "id_018_FootReverse",
                    side + self.userGuideName + "_" +
                    insideRFAttr.capitalize() + "_Ctrl",
                    r=(self.ctrlRadius * 0.1),
                    d=self.curveDegree)
                self.RFCCtrl = self.ctrls.cvControl(
                    "id_018_FootReverse",
                    side + self.userGuideName + "_" + heelRFAttr.capitalize() +
                    "_Ctrl",
                    r=(self.ctrlRadius * 0.1),
                    d=self.curveDegree,
                    dir="+Y",
                    rot=(0, 90, 0))
                self.RFDCtrl = self.ctrls.cvControl(
                    "id_018_FootReverse",
                    side + self.userGuideName + "_" + toeRFAttr.capitalize() +
                    "_Ctrl",
                    r=(self.ctrlRadius * 0.1),
                    d=self.curveDegree,
                    dir="+Y",
                    rot=(0, 90, 0))
                self.RFECtrl = self.ctrls.cvControl(
                    "id_019_FootReverseE",
                    side + self.userGuideName + "_" + ballRFAttr.capitalize() +
                    "_Ctrl",
                    r=(self.ctrlRadius * 0.1),
                    d=self.curveDegree,
                    rot=(0, 90, 0))

                # reverse foot groups:
                self.RFAGrp = cmds.group(self.RFACtrl,
                                         name=self.RFACtrl + "_Grp")
                self.RFBGrp = cmds.group(self.RFBCtrl,
                                         name=self.RFBCtrl + "_Grp")
                self.RFCGrp = cmds.group(self.RFCCtrl,
                                         name=self.RFCCtrl + "_Grp")
                self.RFDGrp = cmds.group(self.RFDCtrl,
                                         name=self.RFDCtrl + "_Grp")
                self.RFEGrp = cmds.group(self.RFECtrl,
                                         name=self.RFECtrl + "_Grp")
                rfGrpList = [
                    self.RFAGrp, self.RFBGrp, self.RFCGrp, self.RFDGrp,
                    self.RFEGrp
                ]
                self.ballRFList.append(self.RFEGrp)

                # putting groups in the correct place:
                tempToDelA = cmds.parentConstraint(self.cvFootLoc,
                                                   self.footJnt,
                                                   maintainOffset=False)
                tempToDelB = cmds.parentConstraint(self.cvRFELoc,
                                                   self.middleFootJxt,
                                                   maintainOffset=False)
                tempToDelC = cmds.parentConstraint(self.cvEndJoint,
                                                   self.endJnt,
                                                   maintainOffset=False)
                tempToDelD = cmds.parentConstraint(self.cvEndJoint,
                                                   self.endBJnt,
                                                   maintainOffset=False)
                tempToDelE = cmds.parentConstraint(self.cvRFALoc,
                                                   self.RFAGrp,
                                                   maintainOffset=False)
                tempToDelF = cmds.parentConstraint(self.cvRFBLoc,
                                                   self.RFBGrp,
                                                   maintainOffset=False)
                tempToDelG = cmds.parentConstraint(self.cvRFCLoc,
                                                   self.RFCGrp,
                                                   maintainOffset=False)
                tempToDelH = cmds.parentConstraint(self.cvRFDLoc,
                                                   self.RFDGrp,
                                                   maintainOffset=False)
                tempToDelI = cmds.parentConstraint(self.cvRFELoc,
                                                   self.RFEGrp,
                                                   maintainOffset=False)
                cmds.delete(tempToDelA, tempToDelB, tempToDelC, tempToDelD,
                            tempToDelE, tempToDelF, tempToDelG, tempToDelH,
                            tempToDelI)

                # mounting hierarchy:
                cmds.parent(self.RFBGrp, self.RFACtrl)
                cmds.parent(self.RFCGrp, self.RFBCtrl)
                cmds.parent(self.RFDGrp, self.RFCCtrl)
                cmds.parent(self.RFEGrp, self.RFDCtrl)

                # reverse foot zero out groups:
                self.RFEZero = utils.zeroOut([self.RFEGrp])[0]
                self.RFEZeroExtra = utils.zeroOut([self.RFEZero])[0]
                self.RFDZero = utils.zeroOut([self.RFDGrp])[0]
                self.RFCZero = utils.zeroOut([self.RFCGrp])[0]
                self.RFBZero = utils.zeroOut([self.RFBGrp])[0]
                self.RFAZero = utils.zeroOut([self.RFAGrp])[0]
                self.RFAZeroExtra = utils.zeroOut([self.RFAZero])[0]
                rfJointZeroList = [
                    self.RFAZero, self.RFBZero, self.RFCZero, self.RFDZero,
                    self.RFEZero
                ]

                # fixing side rool rotation order:
                cmds.setAttr(self.RFBZero + ".rotateOrder", 5)

                # creating ikHandles:
                ikHandleAnkleList = cmds.ikHandle(
                    name=side + self.userGuideName + "_" +
                    ankleRFAttr.capitalize() + "_IkHandle",
                    startJoint=self.footJnt,
                    endEffector=self.middleFootJxt,
                    solver='ikSCsolver')
                ikHandleMiddleList = cmds.ikHandle(
                    name=side + self.userGuideName + "_" +
                    middleRFAttr.capitalize() + "_IkHandle",
                    startJoint=self.middleFootJxt,
                    endEffector=self.endJnt,
                    solver='ikSCsolver')
                cmds.rename(ikHandleAnkleList[1],
                            ikHandleAnkleList[0] + "_Effector")
                cmds.rename(ikHandleMiddleList[1],
                            ikHandleMiddleList[0] + "_Effector")
                cmds.setAttr(ikHandleAnkleList[0] + '.visibility', 0)
                cmds.setAttr(ikHandleMiddleList[0] + '.visibility', 0)

                # creating Fk controls:
                self.footCtrl = self.ctrls.cvControl(
                    "id_020_FootFk",
                    side + self.userGuideName + "_" +
                    self.langDic[self.langName]['c009_leg_extrem'] + "_Ctrl",
                    r=(self.ctrlRadius * 0.5),
                    d=self.curveDegree,
                    dir="+Z")
                self.footCtrlList.append(self.footCtrl)
                cmds.setAttr(self.footCtrl + ".rotateOrder", 1)

                self.revFootCtrlShapeList.append(
                    cmds.listRelatives(self.footCtrl,
                                       children=True,
                                       type='nurbsCurve')[0])

                self.middleFootCtrl = self.ctrls.cvControl(
                    "id_021_FootMiddle",
                    side + self.userGuideName + "_" + self.langDic[
                        self.langName]['c017_RevFoot_middle'].capitalize() +
                    "_Ctrl",
                    r=(self.ctrlRadius * 0.5),
                    d=self.curveDegree)
                cmds.setAttr(self.middleFootCtrl + '.overrideEnabled', 1)
                cmds.setAttr(self.middleFootCtrl + ".rotateOrder", 4)
                tempToDelA = cmds.parentConstraint(self.cvFootLoc,
                                                   self.footCtrl,
                                                   maintainOffset=False)
                tempToDelB = cmds.parentConstraint(self.cvRFELoc,
                                                   self.middleFootCtrl,
                                                   maintainOffset=False)
                cmds.delete(tempToDelA, tempToDelB)
                if s == 1:
                    cmds.setAttr(self.middleFootCtrl + ".scaleX", -1)
                    cmds.setAttr(self.middleFootCtrl + ".scaleY", -1)
                    cmds.setAttr(self.middleFootCtrl + ".scaleZ", -1)
                self.footCtrlZeroList = utils.zeroOut(
                    [self.footCtrl, self.middleFootCtrl])
                self.middleFootCtrlList.append(self.middleFootCtrl)

                # mount hierarchy:
                cmds.parent(self.footCtrlZeroList[1],
                            self.RFDCtrl,
                            absolute=True)
                cmds.parent(ikHandleMiddleList[0],
                            self.middleFootCtrl,
                            absolute=True)
                self.toLimbIkHandleGrp = cmds.group(
                    empty=True,
                    name=side + self.userGuideName + "_" +
                    self.langDic[self.langName]['c009_leg_extrem'] + "_Grp")
                self.toLimbIkHandleGrpList.append(self.toLimbIkHandleGrp)
                cmds.parent(ikHandleAnkleList[0],
                            self.toLimbIkHandleGrp,
                            self.RFECtrl,
                            absolute=True)
                cmds.makeIdentity(self.toLimbIkHandleGrp,
                                  apply=True,
                                  translate=True,
                                  rotate=True,
                                  scale=True)
                parentConst = cmds.parentConstraint(self.RFECtrl,
                                                    self.footJnt,
                                                    maintainOffset=True,
                                                    name=self.footJnt +
                                                    "_ParentConstraint")[0]
                self.parentConstList.append(parentConst)
                self.footJntList.append(self.footJnt)
                cmds.parent(self.RFAZeroExtra, self.footCtrl, absolute=True)

                scaleConst = cmds.scaleConstraint(self.footCtrl,
                                                  self.footJnt,
                                                  maintainOffset=True,
                                                  name=self.footJnt +
                                                  "_ScaleConstraint")
                self.scaleConstList.append(scaleConst)
                cmds.parentConstraint(self.middleFootCtrl,
                                      self.middleFootJnt,
                                      maintainOffset=True,
                                      name=self.middleFootJnt +
                                      "_ParentConstraint")
                cmds.scaleConstraint(self.middleFootCtrl,
                                     self.middleFootJnt,
                                     maintainOffset=True,
                                     name=self.middleFootJnt +
                                     "_ScaleConstraint")

                # add attributes to footCtrl and connect them to reverseFoot groups rotation:
                rfAttrList = [
                    outsideRFAttr, insideRFAttr, heelRFAttr, toeRFAttr,
                    ballRFAttr
                ]
                rfTypeAttrList = [rfRoll, rfSpin]
                for j, rfAttr in enumerate(rfAttrList):
                    for t, rfType in enumerate(rfTypeAttrList):
                        if t == 1 and j == (len(rfAttrList) -
                                            1):  # create turn attr to ball
                            cmds.addAttr(self.footCtrl,
                                         longName=rfAttr + rfTurn,
                                         attributeType='float',
                                         keyable=True)
                            cmds.connectAttr(self.footCtrl + "." + rfAttr +
                                             rfTurn,
                                             rfGrpList[j] + ".rotateZ",
                                             force=True)
                            self.reverseFootAttrList.append(rfAttr + rfTurn)
                        cmds.addAttr(self.footCtrl,
                                     longName=rfAttr + rfType,
                                     attributeType='float',
                                     keyable=True)
                        self.reverseFootAttrList.append(rfAttr + rfType)
                        if t == 0:
                            if j > 1:
                                cmds.connectAttr(self.footCtrl + "." + rfAttr +
                                                 rfType,
                                                 rfGrpList[j] + ".rotateX",
                                                 force=True)
                            else:
                                cmds.connectAttr(self.footCtrl + "." + rfAttr +
                                                 rfType,
                                                 rfGrpList[j] + ".rotateZ",
                                                 force=True)
                        else:
                            cmds.connectAttr(self.footCtrl + "." + rfAttr +
                                             rfType,
                                             rfGrpList[j] + ".rotateY",
                                             force=True)

                # creating the originedFrom attributes (in order to permit integrated parents in the future):
                utils.originedFrom(objName=self.footCtrl,
                                   attrString=self.base + ";" +
                                   self.cvFootLoc + ";" + self.cvRFALoc + ";" +
                                   self.cvRFBLoc + ";" + self.cvRFCLoc + ";" +
                                   self.cvRFDLoc)
                utils.originedFrom(objName=self.middleFootCtrl,
                                   attrString=self.cvRFELoc + ";" +
                                   self.cvEndJoint)

                # creating pre-defined attributes for footRoll and sideRoll attributes, also rollAngle:
                cmds.addAttr(self.footCtrl,
                             longName=footRFAttr + rfRoll,
                             attributeType='float',
                             keyable=True)
                cmds.addAttr(self.footCtrl,
                             longName=footRFAttr + rfRoll + rfAngle,
                             attributeType='float',
                             defaultValue=30,
                             keyable=True)
                cmds.addAttr(self.footCtrl,
                             longName=footRFAttr + rfRoll + rfPlant,
                             attributeType='float',
                             defaultValue=0,
                             keyable=True)
                cmds.addAttr(self.footCtrl,
                             longName=sideRFAttr + rfRoll,
                             attributeType='float',
                             keyable=True)

                # create clampNodes in order to limit the side rotations:
                sideClamp = cmds.createNode("clamp",
                                            name=side + self.userGuideName +
                                            "_Side_Clp")
                # outside values in R
                cmds.setAttr(sideClamp + ".minR", -360)
                # inside values in G
                cmds.setAttr(sideClamp + ".maxG", 360)
                # inverting sideRoll values:
                sideMD = cmds.createNode("multiplyDivide",
                                         name=side + self.userGuideName +
                                         "_Side_MD")
                cmds.setAttr(sideMD + ".input2X", -1)
                # connections:
                cmds.connectAttr(self.footCtrl + "." + sideRFAttr + rfRoll,
                                 sideMD + ".input1X",
                                 force=True)
                cmds.connectAttr(sideMD + ".outputX",
                                 sideClamp + ".inputR",
                                 force=True)
                cmds.connectAttr(sideMD + ".outputX",
                                 sideClamp + ".inputG",
                                 force=True)
                cmds.connectAttr(sideClamp + ".outputR",
                                 self.RFAZero + ".rotateZ",
                                 force=True)
                cmds.connectAttr(sideClamp + ".outputG",
                                 self.RFBZero + ".rotateZ",
                                 force=True)

                # for footRoll:
                footHeelClp = cmds.createNode("clamp",
                                              name=side + self.userGuideName +
                                              "_Roll_Heel_Clp")
                # heel values in R
                cmds.setAttr(footHeelClp + ".minR", -360)
                cmds.connectAttr(self.footCtrl + "." + footRFAttr + rfRoll,
                                 footHeelClp + ".inputR",
                                 force=True)
                cmds.connectAttr(footHeelClp + ".outputR",
                                 self.RFCZero + ".rotateX",
                                 force=True)

                # footRoll with angle limit:
                footPMA = cmds.createNode("plusMinusAverage",
                                          name=side + self.userGuideName +
                                          "_Roll_PMA")
                footSR = cmds.createNode("setRange",
                                         name=side + self.userGuideName +
                                         "_Roll_SR")
                cmds.setAttr(footSR + ".oldMaxY", 180)
                cmds.setAttr(footPMA + ".input1D[0]", 180)
                cmds.setAttr(footPMA + ".operation", 2)  #substract
                cmds.connectAttr(self.footCtrl + "." + footRFAttr + rfRoll,
                                 footSR + ".valueX",
                                 force=True)
                cmds.connectAttr(self.footCtrl + "." + footRFAttr + rfRoll,
                                 footSR + ".valueY",
                                 force=True)
                cmds.connectAttr(self.footCtrl + "." + footRFAttr + rfRoll +
                                 rfAngle,
                                 footSR + ".maxX",
                                 force=True)
                cmds.connectAttr(self.footCtrl + "." + footRFAttr + rfRoll +
                                 rfAngle,
                                 footSR + ".oldMinY",
                                 force=True)
                cmds.connectAttr(self.footCtrl + "." + footRFAttr + rfRoll +
                                 rfAngle,
                                 footSR + ".oldMaxX",
                                 force=True)
                cmds.connectAttr(self.footCtrl + "." + footRFAttr + rfRoll +
                                 rfAngle,
                                 footPMA + ".input1D[1]",
                                 force=True)
                cmds.connectAttr(footPMA + ".output1D",
                                 footSR + ".maxY",
                                 force=True)

                # plant angle for foot roll:
                footPlantClp = cmds.createNode("clamp",
                                               name=side + self.userGuideName +
                                               "_Roll_Plant_Clp")
                footPlantCnd = cmds.createNode("condition",
                                               name=side + self.userGuideName +
                                               "_Roll_Plant_Cnd")
                cmds.setAttr(footPlantCnd + ".operation", 4)  #less than
                cmds.connectAttr(self.footCtrl + "." + footRFAttr + rfRoll,
                                 footPlantClp + ".inputR",
                                 force=True)
                cmds.connectAttr(self.footCtrl + "." + footRFAttr + rfRoll +
                                 rfPlant,
                                 footPlantClp + ".maxR",
                                 force=True)
                cmds.connectAttr(footPlantClp + ".outputR",
                                 footPlantCnd + ".firstTerm",
                                 force=True)
                cmds.connectAttr(footPlantClp + ".outputR",
                                 footPlantCnd + ".colorIfTrueR",
                                 force=True)
                cmds.connectAttr(self.footCtrl + "." + footRFAttr + rfRoll +
                                 rfPlant,
                                 footPlantCnd + ".secondTerm",
                                 force=True)
                cmds.connectAttr(self.footCtrl + "." + footRFAttr + rfRoll +
                                 rfPlant,
                                 footPlantCnd + ".colorIfFalseR",
                                 force=True)

                # back to zero footRoll when greather then angle plus plant values:
                anglePlantPMA = cmds.createNode(
                    "plusMinusAverage",
                    name=side + self.userGuideName + "_AnglePlant_PMA")
                anglePlantMD = cmds.createNode("multiplyDivide",
                                               name=side + self.userGuideName +
                                               "_AnglePlant_MD")
                anglePlantRmV = cmds.createNode(
                    "remapValue",
                    name=side + self.userGuideName + "_AnglePlant_RmV")
                anglePlantCnd = cmds.createNode(
                    "condition",
                    name=side + self.userGuideName + "_AnglePlant_Cnd")
                cmds.setAttr(anglePlantMD + ".input2X", -1)
                cmds.setAttr(anglePlantRmV + ".inputMax", 90)
                cmds.setAttr(anglePlantRmV + ".value[0].value_Interp",
                             3)  #spline
                cmds.setAttr(anglePlantRmV + ".value[1].value_Interp",
                             3)  #spline
                cmds.setAttr(anglePlantCnd + ".operation", 2)  #greather than
                cmds.connectAttr(self.footCtrl + "." + footRFAttr + rfRoll +
                                 rfAngle,
                                 anglePlantPMA + ".input1D[0]",
                                 force=True)
                cmds.connectAttr(self.footCtrl + "." + footRFAttr + rfRoll +
                                 rfPlant,
                                 anglePlantPMA + ".input1D[1]",
                                 force=True)
                cmds.connectAttr(self.footCtrl + "." + footRFAttr + rfRoll,
                                 anglePlantCnd + ".firstTerm",
                                 force=True)
                cmds.connectAttr(anglePlantPMA + ".output1D",
                                 anglePlantCnd + ".secondTerm",
                                 force=True)
                cmds.connectAttr(anglePlantPMA + ".output1D",
                                 anglePlantMD + ".input1X",
                                 force=True)
                cmds.connectAttr(anglePlantPMA + ".output1D",
                                 anglePlantRmV + ".inputMin",
                                 force=True)
                cmds.connectAttr(anglePlantMD + ".outputX",
                                 anglePlantRmV + ".outputMax",
                                 force=True)
                cmds.connectAttr(self.footCtrl + "." + footRFAttr + rfRoll,
                                 anglePlantRmV + ".inputValue",
                                 force=True)
                cmds.connectAttr(anglePlantRmV + ".outColorR",
                                 anglePlantCnd + ".colorIfTrueR",
                                 force=True)
                cmds.connectAttr(anglePlantCnd + ".outColorR",
                                 self.RFEZeroExtra + ".rotateX",
                                 force=True)

                # connect to groups in order to rotate them:
                cmds.connectAttr(footSR + ".outValueY",
                                 self.RFDZero + ".rotateX",
                                 force=True)
                cmds.connectAttr(footSR + ".outValueX",
                                 self.RFEZero + ".rotateX",
                                 force=True)
                if s == 0:  #left
                    cmds.connectAttr(footPlantCnd + ".outColorR",
                                     self.footCtrlZeroList[1] + ".rotateX",
                                     force=True)
                else:  #fix right side mirror
                    footPlantInvMD = cmds.createNode(
                        "multiplyDivide",
                        name=side + self.userGuideName + "_Plant_Inv_MD")
                    cmds.setAttr(footPlantInvMD + ".input2X", -1)
                    cmds.connectAttr(footPlantCnd + ".outColorR",
                                     footPlantInvMD + ".input1X",
                                     force=True)
                    cmds.connectAttr(footPlantInvMD + ".outputX",
                                     self.footCtrlZeroList[1] + ".rotateX",
                                     force=True)

                # organizing keyable attributes:
                self.ctrls.setLockHide([self.middleFootCtrl, self.footCtrl],
                                       ['v'],
                                       l=False)

                # show or hide reverseFoot controls:
                cmds.addAttr(self.footCtrl,
                             longName=showCtrlsAttr,
                             attributeType='long',
                             min=0,
                             max=1,
                             defaultValue=1)
                cmds.setAttr(self.footCtrl + "." + showCtrlsAttr,
                             keyable=False,
                             channelBox=True)
                showHideCtrlList = [
                    self.RFACtrl, self.RFBCtrl, self.RFCCtrl, self.RFDCtrl
                ]
                for rfCtrl in showHideCtrlList:
                    rfCtrlShape = cmds.listRelatives(rfCtrl,
                                                     children=True,
                                                     type='nurbsCurve')[0]
                    cmds.connectAttr(self.footCtrl + "." + showCtrlsAttr,
                                     rfCtrlShape + ".visibility",
                                     force=True)

                # create a masterModuleGrp to be checked if this rig exists:
                self.toCtrlHookGrp = cmds.group(
                    self.footCtrlZeroList[0],
                    name=side + self.userGuideName + "_Control_Grp")
                self.revFootCtrlGrpFinalList.append(self.toCtrlHookGrp)

                self.toScalableHookGrp = cmds.createNode(
                    "transform", name=side + self.userGuideName + "_Joint_Grp")
                mWorldFoot = cmds.getAttr(self.footJnt + ".worldMatrix")
                cmds.xform(self.toScalableHookGrp,
                           matrix=mWorldFoot,
                           worldSpace=True)
                cmds.parent(self.footJnt,
                            self.toScalableHookGrp,
                            absolute=True)
                #Remove the Joint orient to make sure the bone is at the same orientation than it's parent
                cmds.setAttr(self.footJnt + ".jointOrientX", 0)
                cmds.setAttr(self.footJnt + ".jointOrientY", 0)
                cmds.setAttr(self.footJnt + ".jointOrientZ", 0)
                self.aScalableGrp.append(self.toScalableHookGrp)

                self.toStaticHookGrp = cmds.group(self.toCtrlHookGrp,
                                                  self.toScalableHookGrp,
                                                  name=side +
                                                  self.userGuideName + "_Grp")
                cmds.addAttr(self.toStaticHookGrp,
                             longName="dpAR_name",
                             dataType="string")
                cmds.addAttr(self.toStaticHookGrp,
                             longName="dpAR_type",
                             dataType="string")
                cmds.setAttr(self.toStaticHookGrp + ".dpAR_name",
                             self.userGuideName,
                             type="string")
                cmds.setAttr(self.toStaticHookGrp + ".dpAR_type",
                             CLASS_NAME,
                             type="string")
                # add module type counter value
                cmds.addAttr(self.toStaticHookGrp,
                             longName='dpAR_count',
                             attributeType='long',
                             keyable=False)
                cmds.setAttr(self.toStaticHookGrp + '.dpAR_count', dpAR_count)
                # create a locator in order to avoid delete static group
                loc = cmds.spaceLocator(name=side + self.userGuideName +
                                        "_DO_NOT_DELETE")[0]
                cmds.parent(loc, self.toStaticHookGrp, absolute=True)
                cmds.setAttr(loc + ".visibility", 0)
                self.ctrls.setLockHide([loc], [
                    'tx', 'ty', 'tz', 'rx', 'ry', 'rz', 'sx', 'sy', 'sz', 'v'
                ])
                # add hook attributes to be read when rigging integrated modules:
                utils.addHook(objName=self.toCtrlHookGrp, hookType='ctrlHook')
                utils.addHook(objName=self.toScalableHookGrp,
                              hookType='scalableHook')
                utils.addHook(objName=self.toStaticHookGrp,
                              hookType='staticHook')
                if hideJoints:
                    cmds.setAttr(self.toScalableHookGrp + ".visibility", 0)

                # delete duplicated group for side (mirror):
                cmds.delete(side + self.userGuideName + '_' + self.mirrorGrp)
            # finalize this rig:
            self.integratingInfo()
            cmds.select(clear=True)
        # delete UI (moduleLayout), GUIDE and moduleInstance namespace:
        self.deleteModule()
예제 #39
0
    def install(self, *args):
        # Collect layout info
        print "Install"
        sel = cmds.ls(sl=True)

        userDefinedName = sel[0].partition('PartRoot_')[0]

        lytObs = part_utils.collectLayoutInfo(sel)

        # Find the side we are on
        #side = part_utils.getSide(self.lyt_info['layoutRoot'])
        # Create an rig joint chain
        self.jnt_info['rigJnts'] = part_utils.createJoints('rigj_', lytObs)
        # Create an ik joint chain
        self.jnt_info['iksJnts'] = part_utils.createJoints('ikSj_', lytObs)
        self.jnt_info['ikrJnts'] = part_utils.createJoints('ikRj_', lytObs)
        #self.jnt_info['ikJnts'] = part_utils.createJoints('ikj_', lytObs)

        spl = len(self.jnt_info['iksJnts']) - 1

        # Create a new joint at the root and the top of the iksJoint chain.
        rootJointList = ([
            'ikBRoot_' + userDefinedName,
            cmds.xform(self.jnt_info['iksJnts'][0], q=True, ws=True, t=True)
        ], [
            'ikTRoot_' + userDefinedName,
            cmds.xform(self.jnt_info['iksJnts'][spl], q=True, ws=True, t=True)
        ])

        rootJoints = []
        for i in rootJointList:
            cmds.select(d=True)
            rootJoints.append(cmds.joint(n=i[0], p=i[1]))
            cmds.select(d=True)
        self.jnt_info['rootJnts'] = rootJoints

        # Define names for components involved in ik setup
        #ikHandleName = "ikHandle_%s_leg" % (side)
        ikHandleName = userDefinedName + 'ikh'
        #ctrlName = "ctrl_%s_leg" % (side)
        ctrlName = userDefinedName + 'ctrl'

        # Draw a splineIK from the root to the last iksJnt.
        ikSol = cmds.ikHandle(n='iks_spine_Ik',
                              solver='ikSplineSolver',
                              sj=self.jnt_info['iksJnts'][0],
                              ee=self.jnt_info['iksJnts'][spl],
                              ccv=True)
        cmds.select(d=True)
        # Bind the splineIK curve to those 2 new joints.
        cmds.select('curve1', rootJoints)
        cmds.skinCluster(tsb=True)
        #Rename the curve
        cmds.rename('curve1', userDefinedName + '_aSpine_curve')

        # Draw an iKhandle between each self.jnt_info['ikrJnts']
        ikHandles = []
        for j in range(spl):
            if j < spl:
                ikh = cmds.ikHandle(n='ikH_' + self.jnt_info['ikrJnts'][j],
                                    sol='ikRPsolver',
                                    sj=self.jnt_info['ikrJnts'][j],
                                    ee=self.jnt_info['ikrJnts'][j + 1])
                cmds.parent(ikh, self.jnt_info['iksJnts'][j])
                ikHandles.append(ikh)

        # Point constrain 1st iks to 1st ikb
        for j in range(spl + 1):
            cmds.pointConstraint(self.jnt_info['iksJnts'][j],
                                 self.jnt_info['ikrJnts'][j],
                                 mo=True)
            cmds.pointConstraint(self.jnt_info['ikrJnts'][j],
                                 self.jnt_info['rigJnts'][j],
                                 mo=True)

        # Create a locator for each ikh
        locator_groups = []
        for i in range(spl + 1):
            bPos = cmds.xform(self.jnt_info['iksJnts'][i],
                              q=True,
                              ws=True,
                              t=True)
            nPos = [bPos[0], bPos[1], bPos[2] + 1.0]
            lctr = cmds.spaceLocator(name='lctr_' +
                                     self.jnt_info['iksJnts'][i],
                                     a=True)
            cmds.xform(lctr, ws=True, t=nPos)
            grp = cmds.group(name='grp_lctr_' + self.jnt_info['iksJnts'][i],
                             em=True)
            cmds.xform(grp, ws=True, t=bPos)
            cmds.parent(lctr, grp)
            # Create pole vector constraints
            if i < spl:
                cmds.poleVectorConstraint(lctr, ikHandles[i][0])
            cmds.parent(grp, self.jnt_info['iksJnts'][i])
            cmds.makeIdentity(grp, apply=True)
            locator_groups.append(grp)
            self.jnt_info['locator_groups'] = locator_groups

        # Create PMA nodes to control the twist
        # NOTE:  This is tricky if we want to allow for more joints.  For now I am coding for 5 but need a solution for more.
        pma_nodes = []
        for i in range(spl + 1):
            if spl > 5:
                print " I currently only support 5 joints"
                return
            else:
                pmaNode_Name = self.jnt_info['iksJnts'][i].replace(
                    'ikSj', 'pmaTwist_')
                pma = cmds.shadingNode("plusMinusAverage",
                                       asUtility=True,
                                       n=pmaNode_Name)
                cmds.setAttr(pma + '.operation', 3)  #average
                pma_nodes.append(pma)

        # Now connect the Pma
        self.jnt_info['twistPma'] = pma_nodes
        cmds.connectAttr(self.jnt_info['rootJnts'][0] + '.ry',
                         self.jnt_info['twistPma'][2] + '.input1D[0]')
        cmds.connectAttr(self.jnt_info['rootJnts'][1] + '.ry',
                         self.jnt_info['twistPma'][2] + '.input1D[1]')
        cmds.connectAttr(self.jnt_info['twistPma'][2] + '.output1D',
                         self.jnt_info['locator_groups'][2] + '.rx')

        cmds.connectAttr(self.jnt_info['twistPma'][0] + '.output1D',
                         self.jnt_info['twistPma'][1] + '.input1D[0]')
        cmds.connectAttr(self.jnt_info['rootJnts'][0] + '.ry',
                         self.jnt_info['twistPma'][1] + '.input1D[1]')
        cmds.connectAttr(self.jnt_info['twistPma'][1] + '.output1D',
                         self.jnt_info['locator_groups'][1] + '.rx')

        cmds.connectAttr(self.jnt_info['rootJnts'][0] + '.ry',
                         self.jnt_info['twistPma'][0] + '.input1D[0]')
        cmds.connectAttr(self.jnt_info['twistPma'][0] + '.output1D',
                         self.jnt_info['locator_groups'][0] + '.rx')

        cmds.connectAttr(self.jnt_info['rootJnts'][0] + '.ry',
                         self.jnt_info['twistPma'][3] + '.input1D[0]')
        cmds.connectAttr(self.jnt_info['twistPma'][2] + '.output1D',
                         self.jnt_info['twistPma'][3] + '.input1D[1]')
        cmds.connectAttr(self.jnt_info['twistPma'][3] + '.output1D',
                         self.jnt_info['locator_groups'][3] + '.rx')

        cmds.connectAttr(self.jnt_info['rootJnts'][1] + '.ry',
                         self.jnt_info['twistPma'][4] + '.input1D[0]')
        cmds.connectAttr(self.jnt_info['twistPma'][4] + '.output1D',
                         self.jnt_info['locator_groups'][4] + '.ry')

        # Make the spine stretch.
        # NOTE: Try the expression method
        # NOTE: Add stretch ammount attribute.
        #cmds.expression( s= 'surface1.sx = %s.arcLength' %  curveInfoNode )
        curveInfoNode = cmds.arclen(userDefinedName + '_aSpine_curve', ch=True)
        mdsNode_Name = self.jnt_info['iksJnts'][0].replace('ikSj', 'mdStretch')

        mds = cmds.shadingNode("multiplyDivide",
                               asUtility=True,
                               n=mdsNode_Name)

        cmds.setAttr(mds + '.operation', 2)  #divide
        cmds.connectAttr(curveInfoNode + '.arcLength', mds + '.input1X')
        #cmds.connectAttr(curveInfoNode+'.arcLength', mda+'.input2X')
        crvLen = cmds.getAttr(curveInfoNode + '.arcLength')
        print crvLen
        cmds.setAttr(mds + '.input2X', crvLen)

        # Connect stretch to joints
        for i in range(len(self.jnt_info['iksJnts']) - 1):
            cmds.connectAttr(mds + '.outputX',
                             self.jnt_info['iksJnts'][i] + '.sx')

        cmds.rename(curveInfoNode, userDefinedName + '_curveInfo')

        # Setup controls
        suffix = userDefinedName
        ctrlAttrs = []

        for i in range(len(self.jnt_info['rootJnts'])):
            ctrlName = userDefinedName + 'ctrl_' + str(i)
            ctrlPos = cmds.xform(self.jnt_info['rootJnts'][i],
                                 q=True,
                                 ws=True,
                                 t=True)
            # NOTE: Dynamically generate the control objects
            spineControl = part_utils.setupControlObject(
                "SpineControl.ma", ctrlName, ctrlAttrs, ctrlPos,
                os.environ['Parts_Maya_Controls'])
            cmds.parentConstraint(spineControl, self.jnt_info['rootJnts'][i])
예제 #40
0
 def createGuide(self, *args):
     Base.StartClass.createGuide(self)
     # Custom GUIDE:
     cmds.setAttr(self.moduleGrp + ".moduleNamespace",
                  self.moduleGrp[:self.moduleGrp.rfind(":")],
                  type='string')
     # create cvJointLoc and cvLocators:
     self.cvFootLoc, shapeSizeCH = self.ctrls.cvJointLoc(
         ctrlName=self.guideName + "_Foot", r=0.3, d=1, guide=True)
     self.connectShapeSize(shapeSizeCH)
     self.cvRFALoc, shapeSizeCH = self.ctrls.cvLocator(
         ctrlName=self.guideName + "_RfA", r=0.3, d=1, guide=True)
     self.connectShapeSize(shapeSizeCH)
     self.cvRFBLoc, shapeSizeCH = self.ctrls.cvLocator(
         ctrlName=self.guideName + "_RfB", r=0.3, d=1, guide=True)
     self.connectShapeSize(shapeSizeCH)
     self.cvRFCLoc, shapeSizeCH = self.ctrls.cvLocator(
         ctrlName=self.guideName + "_RfC", r=0.3, d=1, guide=True)
     self.connectShapeSize(shapeSizeCH)
     self.cvRFDLoc, shapeSizeCH = self.ctrls.cvLocator(
         ctrlName=self.guideName + "_RfD", r=0.3, d=1, guide=True)
     self.connectShapeSize(shapeSizeCH)
     self.cvRFELoc, shapeSizeCH = self.ctrls.cvLocator(
         ctrlName=self.guideName + "_RfE", r=0.3, d=1, guide=True)
     self.connectShapeSize(shapeSizeCH)
     # create jointGuides:
     self.jGuideFoot = cmds.joint(name=self.guideName + "_JGuideFoot",
                                  radius=0.001)
     self.jGuideRFE = cmds.joint(name=self.guideName + "_JGuideRfE",
                                 radius=0.001)
     cmds.select(clear=True)
     self.jGuideRFA = cmds.joint(name=self.guideName + "_JGuideRfA",
                                 radius=0.001)
     self.jGuideRFD = cmds.joint(name=self.guideName + "_JGuideRfD",
                                 radius=0.001)
     self.jGuideRFB = cmds.joint(name=self.guideName + "_JGuideRfB",
                                 radius=0.001)
     self.jGuideRFC = cmds.joint(name=self.guideName + "_JGuideRfC",
                                 radius=0.001)
     self.jGuideRFAC = cmds.joint(name=self.guideName + "_JGuideRfAC",
                                  radius=0.001)
     # set jointGuides as templates:
     cmds.setAttr(self.jGuideFoot + ".template", 1)
     cmds.setAttr(self.jGuideRFA + ".template", 1)
     cmds.setAttr(self.jGuideRFB + ".template", 1)
     cmds.setAttr(self.jGuideRFC + ".template", 1)
     cmds.setAttr(self.jGuideRFD + ".template", 1)
     cmds.setAttr(self.jGuideRFE + ".template", 1)
     cmds.parent(self.jGuideFoot,
                 self.jGuideRFA,
                 self.moduleGrp,
                 relative=True)
     # create cvEnd:
     self.cvEndJoint, shapeSizeCH = self.ctrls.cvLocator(
         ctrlName=self.guideName + "_JointEnd", r=0.1, d=1, guide=True)
     self.connectShapeSize(shapeSizeCH)
     cmds.parent(self.cvEndJoint, self.cvRFELoc)
     cmds.setAttr(self.cvEndJoint + ".tz", 1.3)
     self.jGuideEnd = cmds.joint(name=self.guideName + "_JGuideEnd",
                                 radius=0.001)
     cmds.setAttr(self.jGuideEnd + ".template", 1)
     cmds.parent(self.jGuideEnd, self.jGuideRFE)
     # make parents between cvLocs:
     cmds.parent(self.cvFootLoc, self.cvRFALoc, self.cvRFBLoc,
                 self.cvRFCLoc, self.cvRFDLoc, self.moduleGrp)
     cmds.parent(self.cvRFELoc, self.cvFootLoc)
     # connect cvLocs in jointGuides:
     self.ctrls.directConnect(self.cvFootLoc, self.jGuideFoot,
                              ['tx', 'ty', 'tz', 'rx', 'ry', 'rz'])
     cmds.parentConstraint(self.cvRFALoc,
                           self.jGuideRFA,
                           maintainOffset=False,
                           name=self.jGuideRFA + "_ParentConstraint")
     cmds.parentConstraint(self.cvRFBLoc,
                           self.jGuideRFB,
                           maintainOffset=False,
                           name=self.jGuideRFB + "_ParentConstraint")
     cmds.parentConstraint(self.cvRFCLoc,
                           self.jGuideRFC,
                           maintainOffset=False,
                           name=self.jGuideRFC + "_ParentConstraint")
     cmds.parentConstraint(self.cvRFDLoc,
                           self.jGuideRFD,
                           maintainOffset=False,
                           name=self.jGuideRFD + "_ParentConstraint")
     cmds.parentConstraint(self.cvRFELoc,
                           self.jGuideRFE,
                           maintainOffset=False,
                           name=self.jGuideRFE + "_ParentConstraint")
     cmds.parentConstraint(self.cvRFALoc,
                           self.jGuideRFAC,
                           maintainOffset=False,
                           name=self.jGuideRFAC + "_ParentConstraint")
     self.ctrls.directConnect(self.cvEndJoint, self.jGuideEnd,
                              ['tx', 'ty', 'tz', 'rx', 'ry', 'rz'])
     # limit, lock and hide cvEnd:
     cmds.transformLimits(self.cvEndJoint, tz=(0.01, 1), etz=(True, False))
     self.ctrls.setLockHide(
         [self.cvEndJoint],
         ['tx', 'ty', 'rx', 'ry', 'rz', 'sx', 'sy', 'sz'])
     # transform cvLocs in order to put as a good foot guide:
     cmds.setAttr(self.cvFootLoc + ".translateZ", 2)
     cmds.setAttr(self.cvFootLoc + ".rotateX", 90)
     cmds.setAttr(self.cvFootLoc + ".rotateZ", -90)
     cmds.setAttr(self.cvRFELoc + ".translateY", -1)
     cmds.setAttr(self.cvRFELoc + ".translateZ", 2.5)
     cmds.setAttr(self.cvRFALoc + ".translateX", -0.6)
     cmds.setAttr(self.cvRFALoc + ".translateY", -1)
     cmds.setAttr(self.cvRFALoc + ".rotateX", 90)
     cmds.setAttr(self.cvRFALoc + ".rotateZ", -90)
     cmds.setAttr(self.cvRFBLoc + ".translateX", -0.6)
     cmds.setAttr(self.cvRFBLoc + ".translateY", 1)
     cmds.setAttr(self.cvRFBLoc + ".rotateX", 90)
     cmds.setAttr(self.cvRFBLoc + ".rotateZ", -90)
     cmds.setAttr(self.cvRFCLoc + ".translateX", 1)
     cmds.setAttr(self.cvRFCLoc + ".rotateX", 90)
     cmds.setAttr(self.cvRFCLoc + ".rotateZ", -90)
     cmds.setAttr(self.cvRFDLoc + ".translateX", -3.5)
     cmds.setAttr(self.cvRFDLoc + ".rotateX", 90)
     cmds.setAttr(self.cvRFDLoc + ".rotateZ", -90)
     cmds.setAttr(self.moduleGrp + ".rotateX", -90)
     cmds.setAttr(self.moduleGrp + ".rotateY", 90)
예제 #41
0
    def bakeOffsets(self):
        """
        Tales selected modules listed in the QListWidget and bakes the offset mover values up to the global mover
        parent. This is achieved by creating a locator in the space of the offset mover, zeroing the offset mover
        out, and constraining the global mover to the constraint. Finally, the constraints are removed and the
        locators deleted.

        """

        selected = self.bakeOffsetsWin_moduleList.selectedItems()
        items = []
        for each in selected:
            items.append(each.text())

        constraints = []
        locators = []

        # go through each module and create the locators for the offset movers
        for each in self.mainUI.moduleInstances:
            name = each.name
            if name in items:

                # get movers
                jointMovers = each.returnJointMovers

                # separate mover lists
                globalMovers = jointMovers[0]
                offsetMovers = jointMovers[1]

                # create locators for the offsetMovers, then zero out offset mover
                for mover in offsetMovers:
                    locatorName = mover.partition("_offset")[0] + "_loc"
                    loc = cmds.spaceLocator(name=locatorName)[0]

                    # constrain locator
                    constraint = cmds.parentConstraint(mover, loc)[0]
                    cmds.delete(constraint)

                    # parent locator under a copy of the locatorName
                    parentLoc = cmds.duplicate(loc)[0]
                    cmds.parent(loc, parentLoc)
                    locators.append(parentLoc)

                for mover in offsetMovers:
                    for attr in [".tx", ".ty", ".tz", ".rx", ".ry", ".rz"]:
                        try:
                            cmds.setAttr(mover + attr, 0)
                        except:
                            pass

        # now, for each global mover, find child groups that are constrained to them
        for each in self.mainUI.moduleInstances:
            name = each.name
            if name in items:
                # get movers
                jointMovers = each.returnJointMovers

                # separate mover lists
                globalMovers = jointMovers[0]
                offsetMovers = jointMovers[1]

                childGrps = []

                for mover in globalMovers:
                    try:

                        # find the mover group constrained to this mover (if any)
                        connection = cmds.listConnections(
                            mover, type="parentConstraint")[0]
                        grp = cmds.listConnections(connection +
                                                   ".constraintRotateX")[0]
                        if grp.find("_mover_grp") != -1:
                            childGrps.append([mover, grp])

                        # now take this group and delete the constraints
                        cmds.select(grp)
                        cmds.delete(constraints=True)

                    except Exception, e:
                        print e
예제 #42
0
def Ribbon_Leg_L():
    Scale_Guide=cmds.xform('Guide_Scale_Grp',ws=True, q=True, s=True )[0]
    Create_Nurb_Rib_Leg_L= cmds.nurbsPlane(n="Rib_Leg_L",p=[0,0,0],ax=[0,0,1],w=6,lr=0.167,d=3,u=6,v=1,ch=1)#CREAR PLANO_Leg
    Get_Trans_Rot('J_Leg_Neutral_L')
    Set_Trans_Rot(Create_Nurb_Rib_Leg_L)
    cmds.parent("Rib_Leg_L","J_Leg_Neutral_L")
    cmds.rename('makeNurbPlane1', 'makeRib_Leg_L')
    Extract_TransX_ForeLeg_L = cmds.getAttr ("J_ForeLeg_Neutral_L.translateX")
    Divide_TransX_ForeLeg_L= ((Extract_TransX_ForeLeg_L)/2)
    Move_TransX_RibLeg_L = cmds.setAttr ("Rib_Leg_L.translateX",Divide_TransX_ForeLeg_L)
    Scale_Nurb_Rib_Leg_L= cmds.setAttr ("makeRib_Leg_L.width", Extract_TransX_ForeLeg_L)      
    Create_Nurb_Rib_ForeLeg_L= cmds.nurbsPlane(n="Rib_ForeLeg_L",p=[0,0,0],ax=[0,0,1],w=6,lr=0.167,d=3,u=6,v=1,ch=1)#CREAR PLANO_FORELeg
    Get_Trans_Rot('J_ForeLeg_Neutral_L')
    Set_Trans_Rot(Create_Nurb_Rib_ForeLeg_L)
    Parent_J_ForeLeg_Neutral_L=cmds.parent("Rib_ForeLeg_L","J_ForeLeg_Neutral_L")
    Rename_MakeNurb=cmds.rename('makeNurbPlane1', 'makeRib_ForeLeg_L')
    Extract_TransX_Ankle_L = cmds.getAttr ("J_Ankle_Neutral_L.translateX")
    Divide_TransX_Ankle_L= ((Extract_TransX_Ankle_L)/2)
    Move_TransX_RibForeLeg_L = cmds.setAttr ("Rib_ForeLeg_L.translateX",Divide_TransX_Ankle_L)
    Scale_Nurb_Rib_ForeLeg_L= cmds.setAttr ("makeRib_ForeLeg_L.width", Extract_TransX_Ankle_L)
    cmds.parent("Rib_Leg_L",w=True)
    cmds.parent("Rib_ForeLeg_L",w=True) 
    cmds.select(cl=True)
    List_Pos_J_Legs=['J_Leg_Neutral_L','J_ForeLeg_Neutral_L']
    Joints=('J_ForeLeg_Neutral_L')
    for J_1 in List_Pos_J_Legs:#FOR PARA POSICIONAR Y ORIENTAR LOS CTRLS BENDY
        N = J_1.split("_Neutral_L")[0]
        New_Name=N.split("J_")[1]
        cmds.joint(n='J_Bendy_1_'+New_Name+'_L',r=True,rad=1*Scale_Guide)#1
        cmds.group(n='Z_J_Bendy_1_'+New_Name+'_L')
        cmds.hide('Z_J_Bendy_1_'+New_Name+'_L')
        cmds.select(cl=True)        
        cmds.parent('Z_J_Bendy_1_'+New_Name+'_L','L_Bendy'+New_Name+'_01_CTL')
        cmds.select(cl=True)
        Get_Trans_Rot(J_1)
        Set_Trans_Rot('P_L_Bendy'+New_Name+'_01_CTL')
        cmds.joint(n='J_Bendy_2_'+New_Name+'_L',r=True,rad=1*Scale_Guide)#2
        cmds.group(n='Z_J_Bendy_2_'+New_Name+'_L')
        cmds.hide('Z_J_Bendy_2_'+New_Name+'_L')
        cmds.parent('Z_J_Bendy_2_'+New_Name+'_L','L_Bendy'+New_Name+'_02_CTL')
        cmds.select(cl=True)
        Get_Trans_Rot(J_1)
        Set_Trans_Rot('P_L_Bendy'+New_Name+'_02_CTL')
        cmds.parent('P_L_Bendy'+New_Name+'_02_CTL',J_1)
        cmds.setAttr ('P_L_Bendy'+New_Name+'_02_CTL.translateX',Divide_TransX_ForeLeg_L)
        cmds.parent('P_L_Bendy'+New_Name+'_02_CTL',w=True) 
        cmds.select(cl=True)   
        cmds.joint(n='J_Bendy_3_'+New_Name+'_L',r=True,rad=1*Scale_Guide)#3
        cmds.group(n='Z_J_Bendy_3_'+New_Name+'_L')     
        cmds.parent('Z_J_Bendy_3_'+New_Name+'_L','L_Bendy'+New_Name+'_03_CTL')
        cmds.select(cl=True)
        Get_Trans_Rot(Joints)
        Set_Trans_Rot('P_L_Bendy'+New_Name+'_03_CTL')
        Joints=('J_Ankle_Neutral_L')
        Divide_TransX_ForeLeg_L=Divide_TransX_Ankle_L
    Get_Trans_Rot('J_ForeLeg_Neutral_L')
    Set_Trans_Rot('P_L_BendyMasterLeg_CTL')
    Skn_Leg_Rib_L=cmds.skinCluster('J_Bendy_1_Leg_L', 'J_Bendy_2_Leg_L','J_Bendy_3_Leg_L', 'Rib_Leg_L',dr=4,tsb=True,mi=4)[0]
    Skn_For_ForeLeg_L=cmds.skinCluster('J_Bendy_1_ForeLeg_L','J_Bendy_2_ForeLeg_L','J_Bendy_3_ForeLeg_L', 'Rib_ForeLeg_L',dr=4,tsb=True,mi=4)[0]
    List_J_Bendys_Leg=[Skn_Leg_Rib_L,Skn_For_ForeLeg_L]#LISTA DE LOS NOMBRES DE LOS SKINS DE LOS PLANOS
    Name_Nurb='Rib_Leg_L'
    Joint_Skin='Leg_'
    for Skn in List_J_Bendys_Leg:#FOR PARA LIMPIAR LOS PESOS DEL SKIN DE LOS PLANOS
        cmds.skinPercent(Skn,Name_Nurb+'.cv[0][0:3]',tv=['J_Bendy_1_'+Joint_Skin+'L',1])
        cmds.skinPercent(Skn,Name_Nurb+'.cv[1][0:3]',tv=['J_Bendy_2_'+Joint_Skin+'L',0.2])
        cmds.skinPercent(Skn,Name_Nurb+'.cv[1][0:3]',tv=['J_Bendy_3_'+Joint_Skin+'L',0])
        cmds.skinPercent(Skn,Name_Nurb+'.cv[2][0:3]',tv=['J_Bendy_2_'+Joint_Skin+'L',0.6])
        cmds.skinPercent(Skn,Name_Nurb+'.cv[2][0:3]',tv=['J_Bendy_2_'+Joint_Skin+'L',0.6])
        cmds.skinPercent(Skn,Name_Nurb+'.cv[2][0:3]',tv=['J_Bendy_3_'+Joint_Skin+'L',0])
        cmds.skinPercent(Skn,Name_Nurb+'.cv[3][0:3]',tv=['J_Bendy_2_'+Joint_Skin+'L',0.9])
        cmds.skinPercent(Skn,Name_Nurb+'.cv[3][0:3]',tv=['J_Bendy_3_'+Joint_Skin+'L',0])
        cmds.skinPercent(Skn,Name_Nurb+'.cv[4][0:3]',tv=['J_Bendy_2_'+Joint_Skin+'L',1])
        cmds.skinPercent(Skn,Name_Nurb+'.cv[5][0:3]',tv=['J_Bendy_1_'+Joint_Skin+'L',0])
        cmds.skinPercent(Skn,Name_Nurb+'.cv[5][0:3]',tv=['J_Bendy_2_'+Joint_Skin+'L',0.9])
        cmds.skinPercent(Skn,Name_Nurb+'.cv[6][0:3]',tv=['J_Bendy_1_'+Joint_Skin+'L',0])
        cmds.skinPercent(Skn,Name_Nurb+'.cv[6][0:3]',tv=['J_Bendy_2_'+Joint_Skin+'L',0.6]) 
        cmds.skinPercent(Skn,Name_Nurb+'.cv[7][0:3]',tv=['J_Bendy_1_'+Joint_Skin+'L',0])
        cmds.skinPercent(Skn,Name_Nurb+'.cv[7][0:3]',tv=['J_Bendy_2_'+Joint_Skin+'L',0.2])
        cmds.skinPercent(Skn,Name_Nurb+'.cv[8][0:3]',tv=['J_Bendy_3_'+Joint_Skin+'L',1])
        Name_Nurb='Rib_ForeLeg_L'
        Joint_Skin='ForeLeg_'
    Point_Cons('L_BendyMasterLeg_CTL','Z_L_BendyLeg_03_CTL')
    Point_Cons('L_BendyMasterLeg_CTL','Z_L_BendyForeLeg_01_CTL')
    Point_Cons('L_BendyMasterLeg_CTL','Z_L_BendyForeLeg_02_CTL')
    Point_Cons('L_BendyMasterLeg_CTL','Z_L_BendyLeg_02_CTL')
    Point_Cons('L_BendyForeLeg_03_CTL','Z_L_BendyForeLeg_02_CTL')
    Point_Cons('L_BendyLeg_01_CTL','Z_L_BendyLeg_02_CTL')
    XYZ=['X','Y','Z']
    Ctrls_Bendy=['L_BendyForeLeg_01_CTL','L_BendyLeg_03_CTL']
    for Ctrl in Ctrls_Bendy: #FOR PARA CONECTAR LAS ROTATICIONES DEL CTR_BENDY_MASTER A LOS CONTROLES 1_FORELeg Y 3_Leg
        for xyz in XYZ:
            cmds.connectAttr('L_BendyMasterLeg_CTL.rotate'+xyz,Ctrl+'.rotate'+xyz, f=True)
    cmds.hide('L_BendyLeg_03_CTL','L_BendyLeg_01_CTL','L_BendyForeLeg_01_CTL','L_BendyForeLeg_03_CTL','L_BendyForeLeg_01_CTL')
    #FOR PARA CONTRAINTS AIMS
    Joints=['Leg','ForeLeg']
    Valor_Pos=1
    Valor_Neg=-1
    Num_Ctrl_Father='1'
    Num_Ctrl_Children_1='3'
    Num_Ctrl_Children_2='1'
    Num_Ctrl_Children_3='2'
    for Ctrl in Joints:  
        cmds.aimConstraint('L_Bendy'+Ctrl+'_0'+Num_Ctrl_Father+'_CTL','Z_L_Bendy'+Ctrl+'_0'+Num_Ctrl_Children_1+'_CTL',mo=True,aim=[Valor_Neg,0,0],u=[1,0,0],wu=[0,1,0],wut="objectrotation",worldUpObject='L_Bendy'+Ctrl+'_0'+Num_Ctrl_Father+'_CTL')
        cmds.aimConstraint('L_BendyMasterLeg_CTL','Z_L_Bendy'+Ctrl+'_0'+Num_Ctrl_Children_2+'_CTL',mo=True,aim=[Valor_Pos,0,0],u=[1,0,0],wu=[0,1,0],wut="objectrotation",worldUpObject='L_BendyMasterLeg_CTL')
        cmds.aimConstraint('L_BendyMasterLeg_CTL','Z_L_Bendy'+Ctrl+'_0'+Num_Ctrl_Children_3+'_CTL',mo=True,aim=[Valor_Pos,0,0],u=[1,0,0],wu=[0,1,0],wut="objectrotation",worldUpObject='L_BendyMasterLeg_CTL') 
        Valor_Pos=-1
        Valor_Neg=1
        Num_Ctrl_Father='3'
        Num_Ctrl_Children_1='1'
        Num_Ctrl_Children_2='2'
        Num_Ctrl_Children_3='3'
   #FOR PARA CONTRAINTS AIMS
    cmds.group(n='Z_Ribs_Nurb_Leg_L',em=True)
    cmds.parent('Rib_ForeLeg_L','Z_Ribs_Nurb_Leg_L')
    cmds.parent('Rib_Leg_L','Z_Ribs_Nurb_Leg_L')
    cmds.select(cl=True) 
    cmds.select('Rib_Leg_L','Rib_ForeLeg_L')
    sel= cmds.ls (selection=True)
    lsel= len(sel)
    for nurb in range(lsel):#FOR PARA LOS RIVETS DE LOS RIBBON
        cmds.group(n=('Locs_'+(sel[nurb])),em=True)
        Gett_Spans_Nurb=cmds.getAttr(sel[nurb]+'.spansU')
        print Gett_Spans_Nurb
        if Gett_Spans_Nurb>1:
            U='U'
            V='V'
            maxValue=cmds.getAttr(sel[nurb]+'.minMaxRangeU.maxValue'+U)
        else:
            U='V'
            V='U'
            maxValue=cmds.getAttr(sel[nurb]+'.minMaxRangeV.maxValue'+U)
            Gett_Spans_Nurb=cmds.getAttr(sel[nurb]+'.spansV')          
        Distancia=1/float(Gett_Spans_Nurb)*maxValue
        Repeticiones=Distancia/2
        num=0
        XYZ=['X','Y','Z']
        XYZ_min=['x','y','z']
        for Loc in range(Gett_Spans_Nurb):
            Change_Name=sel[nurb].split('Rib_')[1]
            Locator_Create=cmds.spaceLocator(n='Loc_Rivet_'+(sel[nurb])+'_0'+str(num),a=True)[0]
            cmds.joint(Locator_Create,n='J_Bind_'+str(num)+'_'+Change_Name,rad=.4*Scale_Guide)
            cmds.parent(Locator_Create,('Locs_'+(sel[nurb])))
            Node_POS=cmds.shadingNode('pointOnSurfaceInfo',n='POS',au=True)
            SetPU=cmds.setAttr((Node_POS)+'.parameter'+(U),Repeticiones)
            SetPV=cmds.setAttr((Node_POS)+'.parameter'+(V),.5)
            Node_FBFM=cmds.shadingNode('fourByFourMatrix',n='FBFM',au=True)
            Node_DCM=cmds.shadingNode('decomposeMatrix',n='DCM',au=True)
            Num30=30
            Num0=0
            for xyz in XYZ:
                cmds.connectAttr((Node_POS)+'.position'+xyz,(Node_FBFM)+'.in'+str(Num30),f=True)
                cmds.connectAttr((Node_POS)+'.normal'+xyz,(Node_FBFM)+'.in0'+str(Num0),f=True)
                Num30=Num30+1
                Num0=Num0+1
            Num10=10
            Num20=20
            for xyz2 in XYZ_min:
                cmds.connectAttr((Node_POS)+'.tangentU'+xyz2,(Node_FBFM)+'.in'+str(Num10),f=True)
                cmds.connectAttr((Node_POS)+'.tangentV'+xyz2,(Node_FBFM)+'.in'+str(Num20),f=True)
                Num10=Num10+1
                Num20=Num20+1
            cmds.connectAttr((Node_FBFM)+'.output',(Node_DCM)+'.inputMatrix',f=True)
            cmds.connectAttr((sel[nurb])+'.worldSpace',(Node_POS)+'.inputSurface',f=True)
            cmds.connectAttr((Node_DCM)+'.outputRotate',(Locator_Create)+'.rotate',f=True)
            cmds.connectAttr((Node_DCM)+'.outputTranslate',(Locator_Create)+'.translate',f=True)
            Repeticiones=Repeticiones+Distancia
            num=num+1
            print Repeticiones   
    cmds.select(d=True)
    cmds.connectAttr('J_Leg_Neutral_L.scale','J_Bendy_2_Leg_L.scale')
    cmds.connectAttr('J_ForeLeg_Neutral_L.scale','J_Bendy_2_ForeLeg_L.scale')
    cmds.parentConstraint('J_ForeLeg_Neutral_L','P_L_BendyMasterLeg_CTL',mo=True)
    cmds.parentConstraint('J_ForeLeg_Neutral_L','P_L_BendyForeLeg_01_CTL',mo=True)
    cmds.parentConstraint('J_Ankle_Neutral_L','P_L_BendyForeLeg_03_CTL',mo=True)
    cmds.parentConstraint('J_Leg_Neutral_L','P_L_BendyLeg_01_CTL',mo=True)
    List=['Leg','ForeLeg']
    for J in List:
        cmds.orientConstraint('J_'+J+'_Neutral_L','P_L_Bendy'+J+'_02_CTL',mo=True)
        if J=='ForeLeg':
            print 'no'
        else:
            cmds.orientConstraint('J_'+J+'_Neutral_L','P_L_Bendy'+J+'_03_CTL',mo=True)
    cmds.select(d=True)
예제 #43
0
    def buildFKSpine(self):

        #find the number of spine bones from the skeleton settings
        spineJoints = self.getSpineJoints()
        fkControls = []
        parent = None

        for joint in spineJoints:
            if joint == "spine_01":
                #add space switcher node to base of spine
                spaceSwitcherFollow = cmds.group(empty=True,
                                                 name=joint +
                                                 "_space_switcher_follow")
                constraint = cmds.parentConstraint(joint,
                                                   spaceSwitcherFollow)[0]
                cmds.delete(constraint)
                spaceSwitcher = cmds.duplicate(spaceSwitcherFollow,
                                               name=joint +
                                               "_space_switcher")[0]
                cmds.parent(spaceSwitcher, spaceSwitcherFollow)

            #create an empty group in the same space as the joint
            group = cmds.group(empty=True, name=joint + "_anim_grp")
            constraint = cmds.parentConstraint(joint, group)[0]
            cmds.delete(constraint)

            #create an additional layer of group that has zeroed attrs
            offsetGroup = cmds.group(empty=True,
                                     name=joint + "_anim_offset_grp")
            constraint = cmds.parentConstraint(joint, offsetGroup)[0]
            cmds.delete(constraint)
            cmds.parent(offsetGroup, group)

            #create a control object in the same space as the joint
            control = utils.createControl("circle", 45, joint + "_anim")
            tempDupe = cmds.duplicate(control)[0]
            constraint = cmds.parentConstraint(joint, control)[0]
            cmds.delete(constraint)
            fkControls.append(control)

            #parent the control object to the group
            cmds.parent(control, offsetGroup)
            constraint = cmds.orientConstraint(tempDupe,
                                               control,
                                               skip=["x", "z"])[0]
            cmds.delete(constraint)
            cmds.makeIdentity(control, t=1, r=1, s=1, apply=True)

            #setup hierarchy
            if parent != None:
                cmds.parent(group, parent, absolute=True)

            else:
                cmds.parent(group, spaceSwitcher)
                cmds.parent(spaceSwitcherFollow, "body_anim")

            #set the parent to be the current spine control
            parent = control

            #clean up
            cmds.delete(tempDupe)

            for attr in [".v"]:
                cmds.setAttr(control + attr, lock=True, keyable=False)

            #set the control's color
            cmds.setAttr(control + ".overrideEnabled", 1)
            cmds.setAttr(control + ".overrideColor", 18)

        return fkControls
예제 #44
0
def smallIKStretch(*args):
    """
    create the 2 joint chain at the start and end of the shock/spring/whatever. select the base joint and run this.Then you'll hook up the top/bottom locators to whatever they're connected to (parentConstraint, etc) and hook the geo onto the original joints (parentConstraint, etc)
    """

    #select the joint, give as arg the name(?) of the setup
    sel = cmds.ls(sl=True)
    origJnt = sel[0]
    #get child joint of this joint
    origChild = cmds.listRelatives(origJnt, c=True)[0]

    #create locators at joint start and end positions
    orig1Pos = cmds.xform(origJnt, ws=True, q=True, rp=True)
    orig2Pos = cmds.xform(origChild, ws=True, q=True, rp=True)
    orig1Loc = cmds.spaceLocator(n="%s_LOC" % origJnt)[0]
    orig2Loc = cmds.spaceLocator(n="%s_LOC" % origChild)[0]
    cmds.xform(orig1Loc, ws=True, t=orig1Pos)
    cmds.xform(orig2Loc, ws=True, t=orig2Pos)

    #dupe the joint, rename it, measure it
    dupeJnts = cmds.duplicate(origJnt)
    mJnt1Orig = dupeJnts[0]
    mJnt1 = cmds.rename(mJnt1Orig, "measure_%s" % origJnt)

    mJnt2orig = cmds.listRelatives(mJnt1, c=True, f=True)[0]
    mJnt2 = cmds.rename(mJnt2orig, "measure_%s" % origChild)

    #create IK handles on orig joints, parent handle to second loc
    ik = cmds.ikHandle(n="%s_IK" % origJnt, sj=origJnt, ee=origChild)[0]
    cmds.parent(ik, orig2Loc)

    print orig2Loc
    #measure from the base measure joint to the ik handle
    origM = rig.measureDistance((origJnt + "orig_dist"), mJnt1, mJnt2)
    activeM = rig.measureDistance((origJnt + "active_dist"), mJnt1, orig2Loc)
    #create mult node to compare the two measures
    mult = cmds.shadingNode("multiplyDivide",
                            asUtility=True,
                            n="%s_mult" % origJnt)
    cmds.setAttr("%s.operation" % mult, 2)
    cmds.connectAttr("%s.distance" % activeM, "%s.input1X" % mult)
    cmds.connectAttr("%s.distance" % origM, "%s.input2X" % mult)

    #---use this code if you want to set up a non-scaling piston geo
    # #create a condition node to tell when to use what value
    # cond = cmds.shadingNode("condition", asUtility=True, n="%s_cond"%origJnt)
    # cmds.setAttr("%s.secondTerm"%cond, 1)
    # cmds.setAttr("%s.operation"%cond, 2)
    # cmds.connectAttr("%s.outputX"%mult, "%s.firstTerm"%cond)
    # cmds.connectAttr("%s.outputX"%mult, "%s.colorIfTrueR"%cond)
    # cmds.setAttr("%s.colorIfFalseR"%cond, 1)

    # #hook the condition node into the scale of the ik joint (in x for now)
    # cmds.connectAttr("%s.outColorR"%cond, "%s.sx"%origJnt)

    #hook the mult into the scale of the joint (comment this line out if you use the commented code above)
    cmds.connectAttr("%s.outputX" % mult, "%s.sx" % origJnt)

    #connect the orig joint to the base of the setup (loc)
    cmds.parentConstraint(orig1Loc, origJnt, mo=True)

    #hide measure joints
    cmds.setAttr("%s.visibility" % mJnt1, 0)

    #package up objects in group
    group = cmds.group(empty=True, n="%s_GRP" % origJnt)
    cmds.parent(mJnt1, origJnt, orig1Loc)
    cmds.parent(orig1Loc, orig2Loc, group)
예제 #45
0
def mkTwistSplineControllers(pfx, numCVs, spread, closed=False):
    """ Make and position all the controller objects

	Arguments:
		pfx (str): The user name of the spline. Will be formatted into the given naming convention
		numCVs (int): The number of CVs to create for a spline
		spread (float): The distance between each controller (including tangents)
		closed (bool): Whether the spline forms a closed loop

	Returns:
		[str, ...]: All the CV's
		[str, ...]: All the CV Buffers
		[str, ...]: All the Out-Tangents
		[str, ...]: All the In-Tangents
		[str, ...]: All the Auto-Out-Tangents
		[str, ...]: All the Auto-In-Tangents
		[str, ...]: All the Twisters
		[str, ...]: All the Twister Buffers
		str: The base controller
	"""

    # Make bases for the controllers
    cvCtrl, outTanCtrl, inTanCtrl, twistCtrl, masterCtrl = _mkMasterControllers(
    )

    master = cmds.duplicate(masterCtrl, name=MASTER_FMT.format(pfx))[0]
    cmds.addAttr(master,
                 longName="Offset",
                 attributeType='double',
                 defaultValue=0.0)
    cmds.setAttr(master + '.Offset', edit=True, keyable=True)
    cmds.addAttr(master,
                 longName="Stretch",
                 attributeType='double',
                 defaultValue=1.0,
                 minValue=0.0001)
    cmds.setAttr(master + '.Stretch', edit=True, keyable=True)

    # make the requested number of CV's
    # don't hide the .rx attribute
    cvs, tws, cvBfrs, twBfrs = [], [], [], []
    controlsGrp = cmds.createNode("transform", name=CTRL_ORG_FMT.format(pfx))
    cmds.parentConstraint(master, controlsGrp, mo=True)
    cmds.scaleConstraint(master, controlsGrp, mo=True)

    for i in range(numCVs):
        cvBfr = cmds.createNode("transform",
                                name=BFR_CV_FMT.format(pfx, i + 1),
                                parent=controlsGrp)
        cv = cmds.duplicate(cvCtrl, name=CTRL_CV_FMT.format(pfx, i + 1))[0]
        twBfr = cmds.createNode("transform",
                                name=BFR_TWIST_FMT.format(pfx, i + 1),
                                parent=controlsGrp)
        tw = cmds.duplicate(twistCtrl, name=CTRL_TWIST_FMT.format(pfx,
                                                                  i + 1))[0]

        cmds.addAttr(cv,
                     longName="Pin",
                     attributeType='double',
                     defaultValue=0.0,
                     minValue=0.0,
                     maxValue=1.0)
        cmds.setAttr(cv + '.Pin', edit=True, keyable=True)
        cmds.addAttr(cv,
                     longName="PinParam",
                     attributeType='double',
                     defaultValue=0.0,
                     minValue=0.0)
        cmds.setAttr(cv + '.PinParam', edit=True, keyable=True)

        for h in [
                '.tx', '.ty', '.tz', '.ry', '.rz', '.sx', '.sy', '.sz', '.v'
        ]:
            cmds.setAttr(tw + h, lock=True, keyable=False, channelBox=False)
        cmds.addAttr(tw,
                     longName="UseTwist",
                     attributeType='double',
                     defaultValue=0.0,
                     minValue=0.0,
                     maxValue=1.0)
        cmds.setAttr(tw + '.UseTwist', edit=True, keyable=True)
        cv, = cmds.parent(cv, cvBfr)
        twBfr, = cmds.parent(twBfr, cv)
        tw, = cmds.parent(tw, twBfr)
        cmds.xform(cvBfr, translation=(spread * 3 * i, 0, 0))
        cvs.append(cv)
        tws.append(tw)
        cvBfrs.append(cvBfr)
        twBfrs.append(twBfr)

    # make the tangents and auto-tangents
    oTans, iTans, aoTans, aiTans = [], [], [], []

    segments = numCVs if closed else numCVs - 1
    for i in range(segments):
        # make oTan, and iTan
        otNum = i
        itNum = (i + 1) % numCVs

        oTan = cmds.duplicate(outTanCtrl,
                              name=CTRL_OUTTAN_FMT.format(pfx, otNum + 1))[0]
        iTan = cmds.duplicate(inTanCtrl,
                              name=CTRL_INTAN_FMT.format(pfx, itNum + 1))[0]
        for ndTan in [oTan, iTan]:
            cmds.addAttr(ndTan,
                         longName="Auto",
                         attributeType='double',
                         defaultValue=1.0,
                         minValue=0.0,
                         maxValue=1.0)
            cmds.setAttr(ndTan + '.Auto', edit=True, keyable=True)
            cmds.addAttr(ndTan,
                         longName="Smooth",
                         attributeType='double',
                         defaultValue=1.0,
                         minValue=0.0,
                         maxValue=1.0)
            cmds.setAttr(ndTan + '.Smooth', edit=True, keyable=True)
            cmds.addAttr(ndTan,
                         longName="Weight",
                         attributeType='double',
                         defaultValue=1.0,
                         minValue=0.0001,
                         maxValue=5.0)
            cmds.setAttr(ndTan + '.Weight', edit=True, keyable=True)

        cmds.xform(oTan, translation=(spread * (3 * otNum + 1), 0, 0))
        cmds.xform(iTan, translation=(spread * (3 * itNum - 1), 0, 0))

        aoTan = cmds.createNode("transform",
                                name=BFR_AOUTTAN_FMT.format(pfx, otNum + 1),
                                parent=cvs[otNum])
        aiTan = cmds.createNode("transform",
                                name=BFR_AINTAN_FMT.format(pfx, itNum + 1),
                                parent=cvs[itNum])

        cmds.xform(aoTan, translation=(spread * (3 * otNum + 1), 0, 0))
        cmds.xform(aiTan, translation=(spread * (3 * itNum - 1), 0, 0))
        oTan = cmds.parent(oTan, cvs[otNum])[0]
        iTan = cmds.parent(iTan, cvs[itNum])[0]

        oTans.append(oTan)
        iTans.append(iTan)
        aoTans.append(aoTan)
        aiTans.append(aiTan)

        for nd in [aiTan, aoTan]:
            cmds.setAttr(nd + ".overrideEnabled", 1)
            cmds.setAttr(nd + ".overrideDisplayType", 2)
            cmds.setAttr(nd + ".visibility", 0)

        makeLinkLine(aoTan, cvs[otNum], selectNode=oTan)
        makeLinkLine(aiTan, cvs[itNum], selectNode=iTan)

    cmds.delete((cvCtrl, outTanCtrl, inTanCtrl, twistCtrl, masterCtrl))
    return cvs, cvBfrs, oTans, iTans, aoTans, aiTans, tws, twBfrs, master
예제 #46
0
class ART_BakeOffsets():
    """
    This clas builds a UI that allows the rigger to select modules to bake offset mover values up to the global mover
    controls, making the offset movers no longer offset from their global mover parents. It can be found on the rig
    creator toolbar with the following icon:
        .. image:: /images/bakeOffsetsButton.png

    The full interface looks like this, listing found modules in the scene to select and bake offsets down to.
        .. image:: /images/bakeOffsets.png

    """
    def __init__(self, mainUI):
        """
        Instantiates the class, getting the QSettings and then calling on ART_BakeOffsetsUI.buildBakeOffsetsUI to
        create the interface.

        :param mainUI: The instance of the Rig Creator UI where this class was called from.

        .. seealso:: ART_BakeOffsetsUI.buildBakeOffsetsUI

        """

        # get the directory path of the tools
        settings = QtCore.QSettings("Epic Games", "ARTv2")
        self.toolsPath = settings.value("toolsPath")
        self.iconsPath = settings.value("iconPath")
        self.mainUI = mainUI

        # build the UI
        self.buildBakeOffsetsUI()

    # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
    # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
    # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
    # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
    # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
    # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
    def buildBakeOffsetsUI(self):
        """
        Builds the interface, finding all modules and listing them for selection.

        """

        if cmds.window("ART_BakeOffsetsWin", exists=True):
            cmds.deleteUI("ART_BakeOffsetsWin", wnd=True)

        # launch a UI to get the name information
        self.bakeOffsetsWin = QtWidgets.QMainWindow(self.mainUI)

        # load stylesheet
        styleSheetFile = utils.returnNicePath(
            self.toolsPath,
            "Core/Scripts/Interfaces/StyleSheets/mainScheme.qss")
        f = open(styleSheetFile, "r")
        self.style = f.read()
        f.close()

        self.bakeOffsetsWin.setStyleSheet(self.style)

        # size policies
        mainSizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed,
                                               QtWidgets.QSizePolicy.Fixed)

        # create the main widget
        self.bakeOffsetsWin_mainWidget = QtWidgets.QWidget()
        self.bakeOffsetsWin.setCentralWidget(self.bakeOffsetsWin_mainWidget)

        # set qt object name
        self.bakeOffsetsWin.setObjectName("ART_BakeOffsetsWin")
        self.bakeOffsetsWin.setWindowTitle("Bake Offsets")

        # create the mainLayout for the rig creator UI
        self.bakeOffsetsWin_mainLayout = QtWidgets.QVBoxLayout(
            self.bakeOffsetsWin_mainWidget)
        self.bakeOffsetsWin_mainLayout.setContentsMargins(0, 0, 0, 0)

        self.bakeOffsetsWin.resize(400, 250)
        self.bakeOffsetsWin.setSizePolicy(mainSizePolicy)
        self.bakeOffsetsWin.setMinimumSize(QtCore.QSize(400, 250))
        self.bakeOffsetsWin.setMaximumSize(QtCore.QSize(400, 250))

        # create the background
        self.bakeOffsetsWin_frame = QtWidgets.QFrame()
        self.bakeOffsetsWin_mainLayout.addWidget(self.bakeOffsetsWin_frame)

        # create the layout for the widgets
        self.bakeOffsetsWin_widgetLayout = QtWidgets.QHBoxLayout(
            self.bakeOffsetsWin_frame)
        self.bakeOffsetsWin_widgetLayout.setContentsMargins(5, 5, 5, 5)

        # add the QListWidget Frame
        self.bakeOffsetsWin_moduleListFrame = QtWidgets.QFrame()
        self.bakeOffsetsWin_moduleListFrame.setMinimumSize(
            QtCore.QSize(265, 200))
        self.bakeOffsetsWin_moduleListFrame.setMaximumSize(
            QtCore.QSize(265, 200))
        self.bakeOffsetsWin_moduleListFrame.setContentsMargins(20, 0, 20, 0)

        # create the list widget
        self.bakeOffsetsWin_moduleList = QtWidgets.QListWidget(
            self.bakeOffsetsWin_moduleListFrame)
        self.bakeOffsetsWin_widgetLayout.addWidget(
            self.bakeOffsetsWin_moduleListFrame)
        self.bakeOffsetsWin_moduleList.setMinimumSize(QtCore.QSize(265, 200))
        self.bakeOffsetsWin_moduleList.setMaximumSize(QtCore.QSize(265, 200))
        self.bakeOffsetsWin_moduleList.setSelectionMode(
            QtWidgets.QAbstractItemView.MultiSelection)
        self.bakeOffsetsWin_moduleList.setSpacing(3)

        # add the layout for the buttons
        self.bakeOffsetsWin_buttonLayoutAll = QtWidgets.QVBoxLayout()
        self.bakeOffsetsWin_widgetLayout.addLayout(
            self.bakeOffsetsWin_buttonLayoutAll)
        self.bakeOffsetsWin_buttonLayoutAll.setContentsMargins(5, 20, 5, 20)

        # add the selection buttons
        self.bakeOffsetsWin_selectionButtonLayout = QtWidgets.QVBoxLayout()
        self.bakeOffsetsWin_buttonLayoutAll.addLayout(
            self.bakeOffsetsWin_selectionButtonLayout)
        self.bakeOffsetsWin_selectAllButton = QtWidgets.QPushButton(
            "Select All")
        self.bakeOffsetsWin_selectAllButton.setMinimumSize(
            QtCore.QSize(115, 25))
        self.bakeOffsetsWin_selectAllButton.setMaximumSize(
            QtCore.QSize(115, 25))
        self.bakeOffsetsWin_selectionButtonLayout.addWidget(
            self.bakeOffsetsWin_selectAllButton)
        self.bakeOffsetsWin_selectAllButton.clicked.connect(
            self.bakeOffsetsWin_moduleList.selectAll)
        self.bakeOffsetsWin_selectAllButton.setObjectName("blueButton")

        self.bakeOffsetsWin_selectNoneButton = QtWidgets.QPushButton(
            "Clear Selection")
        self.bakeOffsetsWin_selectNoneButton.setMinimumSize(
            QtCore.QSize(115, 25))
        self.bakeOffsetsWin_selectNoneButton.setMaximumSize(
            QtCore.QSize(115, 25))
        self.bakeOffsetsWin_selectionButtonLayout.addWidget(
            self.bakeOffsetsWin_selectNoneButton)
        self.bakeOffsetsWin_selectNoneButton.clicked.connect(
            self.bakeOffsetsWin_moduleList.clearSelection)
        self.bakeOffsetsWin_selectNoneButton.setObjectName("blueButton")

        # spacer
        spacerItem = QtWidgets.QSpacerItem(20, 80,
                                           QtWidgets.QSizePolicy.Minimum,
                                           QtWidgets.QSizePolicy.Expanding)
        self.bakeOffsetsWin_selectionButtonLayout.addItem(spacerItem)

        # add the buttons for reset settings and reset transforms
        self.bakeOffsetsWin_bakeOFfsetsBtn = QtWidgets.QPushButton(
            "Bake Offsets")
        self.bakeOffsetsWin_bakeOFfsetsBtn.setMinimumSize(QtCore.QSize(
            115, 25))
        self.bakeOffsetsWin_bakeOFfsetsBtn.setMaximumSize(QtCore.QSize(
            115, 25))
        self.bakeOffsetsWin_selectionButtonLayout.addWidget(
            self.bakeOffsetsWin_bakeOFfsetsBtn)
        self.bakeOffsetsWin_bakeOFfsetsBtn.setToolTip(
            "Turn on Aim Mode for selected modules.")
        self.bakeOffsetsWin_bakeOFfsetsBtn.clicked.connect(
            partial(self.bakeOffsets))
        self.bakeOffsetsWin_bakeOFfsetsBtn.setObjectName("blueButton")

        # populate the list widget
        modules = utils.returnRigModules()
        for module in modules:
            # get module name
            moduleName = cmds.getAttr(module + ".moduleName")
            if moduleName != "root":
                self.bakeOffsetsWin_moduleList.addItem(moduleName)

        # show the window
        self.bakeOffsetsWin.show()

    # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
    # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
    # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
    # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
    # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
    # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
    def bakeOffsets(self):
        """
        Tales selected modules listed in the QListWidget and bakes the offset mover values up to the global mover
        parent. This is achieved by creating a locator in the space of the offset mover, zeroing the offset mover
        out, and constraining the global mover to the constraint. Finally, the constraints are removed and the
        locators deleted.

        """

        selected = self.bakeOffsetsWin_moduleList.selectedItems()
        items = []
        for each in selected:
            items.append(each.text())

        constraints = []
        locators = []

        # go through each module and create the locators for the offset movers
        for each in self.mainUI.moduleInstances:
            name = each.name
            if name in items:

                # get movers
                jointMovers = each.returnJointMovers

                # separate mover lists
                globalMovers = jointMovers[0]
                offsetMovers = jointMovers[1]

                # create locators for the offsetMovers, then zero out offset mover
                for mover in offsetMovers:
                    locatorName = mover.partition("_offset")[0] + "_loc"
                    loc = cmds.spaceLocator(name=locatorName)[0]

                    # constrain locator
                    constraint = cmds.parentConstraint(mover, loc)[0]
                    cmds.delete(constraint)

                    # parent locator under a copy of the locatorName
                    parentLoc = cmds.duplicate(loc)[0]
                    cmds.parent(loc, parentLoc)
                    locators.append(parentLoc)

                for mover in offsetMovers:
                    for attr in [".tx", ".ty", ".tz", ".rx", ".ry", ".rz"]:
                        try:
                            cmds.setAttr(mover + attr, 0)
                        except:
                            pass

        # now, for each global mover, find child groups that are constrained to them
        for each in self.mainUI.moduleInstances:
            name = each.name
            if name in items:
                # get movers
                jointMovers = each.returnJointMovers

                # separate mover lists
                globalMovers = jointMovers[0]
                offsetMovers = jointMovers[1]

                childGrps = []

                for mover in globalMovers:
                    try:

                        # find the mover group constrained to this mover (if any)
                        connection = cmds.listConnections(
                            mover, type="parentConstraint")[0]
                        grp = cmds.listConnections(connection +
                                                   ".constraintRotateX")[0]
                        if grp.find("_mover_grp") != -1:
                            childGrps.append([mover, grp])

                        # now take this group and delete the constraints
                        cmds.select(grp)
                        cmds.delete(constraints=True)

                    except Exception, e:
                        print e

        # now snap global movers to offset movers
        for each in self.mainUI.moduleInstances:
            name = each.name
            if name in items:
                # get movers
                jointMovers = each.returnJointMovers

                # separate mover lists
                globalMovers = jointMovers[0]
                offsetMovers = jointMovers[1]

                for mover in globalMovers:
                    if cmds.objExists(mover + "_loc"):
                        constraint = cmds.parentConstraint(
                            mover + "_loc", mover)[0]
                        constraints.append(constraint)

        # now remove all locs
        for const in constraints:
            cmds.delete(const)

        for loc in locators:
            cmds.delete(loc)

        # finally, reconstrain mover_grps to their movers
        cmds.refresh(force=True)
        for group in childGrps:
            cmds.parentConstraint(group[0], group[1], mo=True)
            cmds.scaleConstraint(group[0], group[1])

        cmds.select(clear=True)
예제 #47
0
파일: arm_rig.py 프로젝트: AlisaGf/AutoRig
    def make_ik_joint_chain(self, side, shoulder, knee, elbow_end, wrist,
                            color):
        # make ik handle and control
        cmds.ikHandle(n='ik_arm_' + side,
                      sj=shoulder,
                      ee=elbow_end,
                      sol='ikRPsolver')
        ik_arm = 'ik_arm_' + side
        cmds.parent(ik_arm, 'IKs')
        c = custom_controls.create_custom_controls()
        arm_control = c.cube_curve('ANIM_arm_' + side)
        cmds.setAttr(arm_control + '.lineWidth', 2)
        self.l.override_colors(arm_control, color)
        cmds.xform(arm_control, cp=True)
        arm_control_grp = cmds.group(arm_control, n='grp_ANIM_arm_' + side)
        cmds.matchTransform(arm_control_grp, elbow_end, pos=True, rot=True)
        self.controls.append(arm_control_grp)
        cmds.parent(arm_control_grp, 'controls')
        cmds.parentConstraint(arm_control, 'ik_arm_' + side)

        #create a pole vector
        pv = self.l.create_pole_vector(side, shoulder, knee, elbow_end, 'arm',
                                       'ik_arm_' + side, color)
        orient_constraint_wrist = cmds.orientConstraint(arm_control, wrist)[0]
        cmds.setDrivenKeyframe(orient_constraint_wrist + '.' + wrist + '_Ctl' +
                               'W0',
                               cd=self.ik_fk_control + '.ikfk',
                               v=0,
                               dv=0)
        cmds.setDrivenKeyframe(orient_constraint_wrist + '.' + wrist + '_Ctl' +
                               'W0',
                               cd=self.ik_fk_control + '.ikfk',
                               v=1,
                               dv=1)

        cmds.setDrivenKeyframe(orient_constraint_wrist + '.ANIM_arm_' + side +
                               'W1',
                               cd=self.ik_fk_control + '.ikfk',
                               v=1,
                               dv=0)
        cmds.setDrivenKeyframe(orient_constraint_wrist + '.ANIM_arm_' + side +
                               'W1',
                               cd=self.ik_fk_control + '.ikfk',
                               v=0,
                               dv=1)

        #hide visiblity
        condition = cmds.shadingNode('condition',
                                     asUtility=True,
                                     n='condition_node' + arm_control)
        cmds.connectAttr(self.ik_fk_control + '.ikfk',
                         condition + '.firstTerm')
        cmds.connectAttr(condition + '.outColorR', arm_control + '.visibility')
        cmds.connectAttr(condition + '.outColorR', pv + '.visibility')

        cmds.setAttr(condition + '.colorIfTrueR', 1)
        cmds.setAttr(condition + '.colorIfFalseR', 0)

        #make a joint for stretching
        self.stretchy_joint = cmds.joint()
        cmds.setAttr(self.stretchy_joint + '.drawStyle', 2)
        cmds.matchTransform(self.stretchy_joint, arm_control)
        cmds.parent(self.stretchy_joint, arm_control)
예제 #48
0
    def rigModule(self, *args):
        Base.StartClass.rigModule(self)
        # verify if the guide exists:
        if cmds.objExists(self.moduleGrp):
            try:
                hideJoints = cmds.checkBox('hideJointsCB', query=True, value=True)
            except:
                hideJoints = 1
            # declare lists to store names and attributes:
            self.worldRefList, self.headCtrlList = [], []
            self.aCtrls, self.aLCtrls, self.aRCtrls = [], [], []
            # start as no having mirror:
            sideList = [""]
            # analisys the mirror module:
            self.mirrorAxis = cmds.getAttr(self.moduleGrp+".mirrorAxis")
            if self.mirrorAxis != 'off':
                # get rigs names:
                self.mirrorNames = cmds.getAttr(self.moduleGrp+".mirrorName")
                # get first and last letters to use as side initials (prefix):
                sideList = [ self.mirrorNames[0]+'_', self.mirrorNames[len(self.mirrorNames)-1]+'_' ]
                for s, side in enumerate(sideList):
                    duplicated = cmds.duplicate(self.moduleGrp, name=side+self.userGuideName+'_Guide_Base')[0]
                    allGuideList = cmds.listRelatives(duplicated, allDescendents=True)
                    for item in allGuideList:
                        cmds.rename(item, side+self.userGuideName+"_"+item)
                    self.mirrorGrp = cmds.group(name="Guide_Base_Grp", empty=True)
                    cmds.parent(side+self.userGuideName+'_Guide_Base', self.mirrorGrp, absolute=True)
                    # re-rename grp:
                    cmds.rename(self.mirrorGrp, side+self.userGuideName+'_'+self.mirrorGrp)
                    # do a group mirror with negative scaling:
                    if s == 1:
                        for axis in self.mirrorAxis:
                            cmds.setAttr(side+self.userGuideName+'_'+self.mirrorGrp+'.scale'+axis, -1)
            else: # if not mirror:
                duplicated = cmds.duplicate(self.moduleGrp, name=self.userGuideName+'_Guide_Base')[0]
                allGuideList = cmds.listRelatives(duplicated, allDescendents=True)
                for item in allGuideList:
                    cmds.rename(item, self.userGuideName+"_"+item)
                self.mirrorGrp = cmds.group(self.userGuideName+'_Guide_Base', name="Guide_Base_Grp", relative=True)
                # re-rename grp:
                cmds.rename(self.mirrorGrp, self.userGuideName+'_'+self.mirrorGrp)
            # store the number of this guide by module type
            dpAR_count = utils.findModuleLastNumber(CLASS_NAME, "dpAR_type") + 1
            # run for all sides
            for s, side in enumerate(sideList):
                # redeclaring variables:
                self.base       = side+self.userGuideName+"_Guide_Base"
                self.cvNeckLoc  = side+self.userGuideName+"_Guide_neck"
                self.cvHeadLoc  = side+self.userGuideName+"_Guide_head"
                self.cvJawLoc   = side+self.userGuideName+"_Guide_jaw"
                self.cvChinLoc  = side+self.userGuideName+"_Guide_chin"
                self.cvLLipLoc  = side+self.userGuideName+"_Guide_lLip"
                self.cvRLipLoc  = side+self.userGuideName+"_Guide_rLip"
                self.cvEndJoint = side+self.userGuideName+"_Guide_JointEnd"
                
                # creating joints:
                self.neckJnt = cmds.joint(name=side+self.userGuideName+"_"+self.langDic[self.langName]['c_neck']+"_Jnt")
                self.headJxt = cmds.joint(name=side+self.userGuideName+"_"+self.langDic[self.langName]['c_head']+"_Jxt")
                cmds.select(clear=True)
                self.headJnt = cmds.joint(name=side+self.userGuideName+"_"+self.langDic[self.langName]['c_head']+"_Jnt", scaleCompensate=False)
                self.jawJnt  = cmds.joint(name=side+self.userGuideName+"_"+self.langDic[self.langName]['c_jaw']+"_Jnt", scaleCompensate=False)
                self.chinJnt = cmds.joint(name=side+self.userGuideName+"_"+self.langDic[self.langName]['c_chin']+"_Jnt", scaleCompensate=False)
                self.endJnt  = cmds.joint(name=side+self.userGuideName+"_JEnd", scaleCompensate=False)
                cmds.select(clear=True)
                self.lLipJnt = cmds.joint(name=side+self.userGuideName+"_"+self.langDic[self.langName]['p002_left']+"_"+self.langDic[self.langName]['c_lip']+"_Jnt", scaleCompensate=False)
                cmds.select(clear=True)
                self.rLipJnt = cmds.joint(name=side+self.userGuideName+"_"+self.langDic[self.langName]['p003_right']+"_"+self.langDic[self.langName]['c_lip']+"_Jnt", scaleCompensate=False)
                dpARJointList = [self.neckJnt, self.headJnt, self.jawJnt, self.chinJnt, self.lLipJnt, self.rLipJnt]
                for dpARJoint in dpARJointList:
                    cmds.addAttr(dpARJoint, longName='dpAR_joint', attributeType='float', keyable=False)
                # creating controls:
                self.neckCtrl = ctrls.cvNeck(ctrlName=side+self.userGuideName+"_"+self.langDic[self.langName]['c_neck']+"_Ctrl", r=self.ctrlRadius/2.0)
                self.headCtrl = ctrls.cvHead(ctrlName=side+self.userGuideName+"_"+self.langDic[self.langName]['c_head']+"_Ctrl", r=self.ctrlRadius/2.0)
                self.jawCtrl  = ctrls.cvJaw( ctrlName=side+self.userGuideName+"_"+self.langDic[self.langName]['c_jaw']+"_Ctrl",  r=self.ctrlRadius/2.0)
                self.chinCtrl = ctrls.cvChin(ctrlName=side+self.userGuideName+"_"+self.langDic[self.langName]['c_chin']+"_Ctrl", r=self.ctrlRadius/2.0)
                self.lLipCtrl = cmds.circle(name=self.langDic[self.langName]['p002_left']+"_"+side+self.userGuideName+"_"+self.langDic[self.langName]['c_lip']+"_Ctrl", ch=False, o=True, nr=(0, 0, 1), d=3, s=8, radius=(self.ctrlRadius * 0.25))[0]
                self.rLipCtrl = cmds.circle(name=self.langDic[self.langName]['p003_right']+"_"+side+self.userGuideName+"_"+self.langDic[self.langName]['c_lip']+"_Ctrl", ch=False, o=True, nr=(0, 0, 1), d=3, s=8, radius=(self.ctrlRadius * 0.25))[0]
                self.headCtrlList.append(self.headCtrl)
                self.aCtrls.append([self.neckCtrl, self.headCtrl, self.jawCtrl, self.chinCtrl])
                self.aLCtrls.append([self.lLipCtrl])
                self.aRCtrls.append([self.rLipCtrl])
                
                #Setup Axis Order
                if self.rigType == Base.RigType.quadruped:
                    cmds.setAttr(self.neckCtrl + ".rotateOrder", 1)
                    cmds.setAttr(self.headCtrl + ".rotateOrder", 1)
                    cmds.setAttr(self.jawCtrl + ".rotateOrder", 1)
                else:
                    cmds.setAttr(self.neckCtrl + ".rotateOrder", 3)
                    cmds.setAttr(self.headCtrl + ".rotateOrder", 3)
                    cmds.setAttr(self.jawCtrl + ".rotateOrder", 3)

                # creating the originedFrom attributes (in order to permit integrated parents in the future):
                utils.originedFrom(objName=self.neckCtrl, attrString=self.base+";"+self.cvNeckLoc)
                utils.originedFrom(objName=self.headCtrl, attrString=self.cvHeadLoc)
                utils.originedFrom(objName=self.jawCtrl, attrString=self.cvJawLoc)
                utils.originedFrom(objName=self.chinCtrl, attrString=self.cvChinLoc+";"+self.cvEndJoint)
                
                # edit the mirror shape to a good direction of controls:
                ctrlList = [ self.neckCtrl, self.headCtrl, self.jawCtrl, self.chinCtrl ]
                if s == 1:
                    for ctrl in ctrlList:
                        if self.mirrorAxis == 'X':
                            cmds.setAttr(ctrl+'.rotateY', 180)
                        elif self.mirrorAxis == 'Y':
                            cmds.setAttr(ctrl+'.rotateY', 180)
                        elif self.mirrorAxis == 'Z':
                            cmds.setAttr(ctrl+'.rotateX', 180)
                            cmds.setAttr(ctrl+'.rotateZ', 180)
                        elif self.mirrorAxis == 'XYZ':
                            cmds.setAttr(ctrl+'.rotateX', 180)
                            cmds.setAttr(ctrl+'.rotateZ', 180)
                    cmds.makeIdentity(ctrlList, apply=True, translate=False, rotate=True, scale=False)

                # temporary parentConstraints:
                tempDelNeck = cmds.parentConstraint(self.cvNeckLoc, self.neckCtrl, maintainOffset=False)
                tempDelHead = cmds.parentConstraint(self.cvHeadLoc, self.headCtrl, maintainOffset=False)
                tempDelJaw  = cmds.parentConstraint(self.cvJawLoc, self.jawCtrl, maintainOffset=False)
                tempDelChin = cmds.parentConstraint(self.cvChinLoc, self.chinCtrl, maintainOffset=False)
                tempDelLLip = cmds.parentConstraint(self.cvLLipLoc, self.lLipCtrl, maintainOffset=False)
                tempDelRLip = cmds.parentConstraint(self.cvRLipLoc, self.rLipCtrl, maintainOffset=False)
                cmds.delete(tempDelNeck, tempDelHead, tempDelJaw, tempDelChin, tempDelLLip, tempDelRLip)
                
                # zeroOut controls:
                self.zeroLipCtrlList = utils.zeroOut([self.lLipCtrl, self.rLipCtrl])
                self.lLipGrp = cmds.group(self.lLipCtrl, name=self.lLipCtrl+"_Grp")
                self.rLipGrp = cmds.group(self.rLipCtrl, name=self.rLipCtrl+"_Grp")
                self.zeroCtrlList = utils.zeroOut([self.neckCtrl, self.headCtrl, self.jawCtrl, self.chinCtrl, self.zeroLipCtrlList[0], self.zeroLipCtrlList[1]])

                # make joints be ride by controls:
                cmds.makeIdentity(self.neckJnt, self.headJxt, self.headJnt, self.jawJnt, self.chinJnt, self.endJnt, rotate=True, apply=True)
                cmds.parentConstraint(self.neckCtrl, self.neckJnt, maintainOffset=False, name=self.neckJnt+"_ParentConstraint")
                cmds.scaleConstraint(self.neckCtrl, self.neckJnt, maintainOffset=False, name=self.neckJnt+"_ScaleConstraint")
                cmds.delete(cmds.parentConstraint(self.headCtrl, self.headJxt, maintainOffset=False))
                cmds.parentConstraint(self.headCtrl, self.headJnt, maintainOffset=False, name=self.headJnt+"_ParentConstraint")
                cmds.parentConstraint(self.jawCtrl, self.jawJnt, maintainOffset=False, name=self.jawJnt+"_ParentConstraint")
                cmds.parentConstraint(self.chinCtrl, self.chinJnt, maintainOffset=False, name=self.chinJnt+"_ParentConstraint")
                cmds.parentConstraint(self.lLipCtrl, self.lLipJnt, maintainOffset=False, name=self.lLipJnt+"_ParentConstraint")
                cmds.parentConstraint(self.rLipCtrl, self.rLipJnt, maintainOffset=False, name=self.rLipJnt+"_ParentConstraint")
                cmds.scaleConstraint(self.headCtrl, self.headJnt, maintainOffset=False, name=self.headJnt+"_ScaleConstraint")
                cmds.scaleConstraint(self.jawCtrl, self.jawJnt, maintainOffset=False, name=self.jawJnt+"_ScaleConstraint")
                cmds.scaleConstraint(self.chinCtrl, self.chinJnt, maintainOffset=False, name=self.chinJnt+"_ScaleConstraint")
                cmds.scaleConstraint(self.lLipCtrl, self.lLipJnt, maintainOffset=False, name=self.lLipJnt+"_ScaleConstraint")
                cmds.scaleConstraint(self.rLipCtrl, self.rLipJnt, maintainOffset=False, name=self.rLipJnt+"_ScaleConstraint")
                cmds.delete(cmds.parentConstraint(self.cvEndJoint, self.endJnt, maintainOffset=False))
                cmds.setAttr(self.jawJnt+".segmentScaleCompensate", 0)
                cmds.setAttr(self.chinJnt+".segmentScaleCompensate", 0)

                # create interations between neck and head:
                self.grpNeck = cmds.group(self.zeroCtrlList[0], name=self.neckCtrl+"_Grp")
                self.grpHeadA = cmds.group(empty=True, name=self.headCtrl+"_A_Grp")
                self.grpHead = cmds.group(self.grpHeadA, name=self.headCtrl+"_Grp")
                # arrange pivots:
                self.neckPivot = cmds.xform(self.neckCtrl, query=True, worldSpace=True, translation=True)
                self.headPivot = cmds.xform(self.headCtrl, query=True, worldSpace=True, translation=True)
                cmds.xform(self.grpNeck, pivots=(self.neckPivot[0], self.neckPivot[1], self.neckPivot[2]))
                cmds.xform(self.grpHead, self.grpHeadA, pivots=(self.headPivot[0], self.headPivot[1], self.headPivot[2]))
                
                self.worldRef = cmds.group(empty=True, name=side+self.userGuideName+"_WorldRef")
                self.worldRefList.append(self.worldRef)
                cmds.delete(cmds.parentConstraint(self.neckCtrl, self.worldRef, maintainOffset=False))
                cmds.parentConstraint(self.neckCtrl, self.grpHeadA, maintainOffset=True, skipRotate=["x", "y", "z"], name=self.grpHeadA+"_ParentConstraint")
                orientConst = cmds.orientConstraint(self.neckCtrl, self.worldRef, self.grpHeadA, maintainOffset=False, name=self.grpHeadA+"_OrientConstraint")[0]
                cmds.scaleConstraint(self.neckCtrl, self.grpHeadA, maintainOffset=True, name=self.grpHeadA+"_ScaleConstraint")
                cmds.parent(self.zeroCtrlList[1], self.grpHeadA, absolute=True)

                # connect reverseNode:
                cmds.addAttr(self.headCtrl, longName=self.langDic[self.langName]['c_Follow'], attributeType='float', minValue=0, maxValue=1, keyable=True)
                cmds.connectAttr(self.headCtrl+'.'+self.langDic[self.langName]['c_Follow'], orientConst+"."+self.neckCtrl+"W0", force=True)
                self.headRevNode = cmds.createNode('reverse', name=side+self.userGuideName+"_Rev")
                cmds.connectAttr(self.headCtrl+'.'+self.langDic[self.langName]['c_Follow'], self.headRevNode+".inputX", force=True)
                cmds.connectAttr(self.headRevNode+'.outputX', orientConst+"."+self.worldRef+"W1", force=True)
                
                # mount controls hierarchy:
                cmds.parent(self.zeroCtrlList[3], self.jawCtrl, absolute=True)
                
                # jaw follow head or root ctrl (using worldRef)
                jawParentConst = cmds.parentConstraint(self.headCtrl, self.worldRef, self.zeroCtrlList[2], maintainOffset=True, name=self.zeroCtrlList[2]+"_ParentConstraint")[0]
                cmds.setAttr(jawParentConst+".interpType", 2) #Shortest, no flip cause problem with scrubing
                cmds.addAttr(self.jawCtrl, longName=self.langDic[self.langName]['c_Follow'], attributeType="float", minValue=0, maxValue=1, defaultValue=1, keyable=True)
                cmds.connectAttr(self.jawCtrl+"."+self.langDic[self.langName]['c_Follow'], jawParentConst+"."+self.headCtrl+"W0", force=True)
                jawFollowRev = cmds.createNode("reverse", name=self.jawCtrl+"_Rev")
                cmds.connectAttr(self.jawCtrl+"."+self.langDic[self.langName]['c_Follow'], jawFollowRev+".inputX", force=True)
                cmds.connectAttr(jawFollowRev+".outputX", jawParentConst+"."+self.worldRef+"W1", force=True)
                cmds.scaleConstraint(self.headCtrl, self.zeroCtrlList[2], maintainOffset=True, name=self.zeroCtrlList[2]+"_ScaleConstraint")[0]

                # setup jaw auto translation
                self.jawSdkGrp = cmds.group(self.jawCtrl, name=self.jawCtrl+"_SDK_Grp")
                cmds.addAttr(self.jawCtrl, longName=self.langDic[self.langName]['c_moveIntensity']+"Y", attributeType='float', keyable=True)
                cmds.addAttr(self.jawCtrl, longName=self.langDic[self.langName]['c_moveIntensity']+"Z", attributeType='float', keyable=True)
                cmds.addAttr(self.jawCtrl, longName=self.langDic[self.langName]['c_moveStartRotation'], attributeType='float', keyable=True)
                cmds.setAttr(self.jawCtrl+"."+self.langDic[self.langName]['c_moveIntensity']+"Y", keyable=False, channelBox=True)
                cmds.setAttr(self.jawCtrl+"."+self.langDic[self.langName]['c_moveIntensity']+"Z", keyable=False, channelBox=True)
                cmds.setAttr(self.jawCtrl+"."+self.langDic[self.langName]['c_moveStartRotation'], keyable=False, channelBox=True)
                cmds.setAttr(self.jawCtrl+"."+self.langDic[self.langName]['c_moveIntensity']+"Y", 1)
                cmds.setAttr(self.jawCtrl+"."+self.langDic[self.langName]['c_moveIntensity']+"Z", 2)
                cmds.setAttr(self.jawCtrl+"."+self.langDic[self.langName]['c_moveStartRotation'], 10)
                self.jawIntensityFixUnitMD = cmds.createNode('multiplyDivide', name="JawMoveIntensityFixUnit_MD")
                self.jawIntensityMD = cmds.createNode('multiplyDivide', name="JawMoveIntensity_MD")
                self.jawIntensityZMD = cmds.createNode('multiplyDivide', name="JawMoveIntensityZ_MD")
                self.jawStartIntensityMD = cmds.createNode('multiplyDivide', name="JawMoveIntensityStart_MD")
                self.jawIntensityPMA = cmds.createNode('plusMinusAverage', name="JawMoveIntensity_PMA")
                self.jawIntensityCnd = cmds.createNode('condition', name="JawMoveIntensity_Cnd")
                cmds.connectAttr(self.jawCtrl+".rotateX", self.jawIntensityMD+".input1Y", force=True)
                cmds.connectAttr(self.jawCtrl+"."+self.langDic[self.langName]['c_moveIntensity']+"Y", self.jawIntensityFixUnitMD+".input1Y", force=True)
                cmds.connectAttr(self.jawIntensityFixUnitMD+".outputY", self.jawIntensityMD+".input2Y", force=True)
                cmds.setAttr(self.jawIntensityFixUnitMD+".input2Y", -0.01)
                cmds.connectAttr(self.jawIntensityFixUnitMD+".outputY", self.jawStartIntensityMD+".input1X", force=True)
                cmds.connectAttr(self.jawCtrl+"."+self.langDic[self.langName]['c_moveStartRotation'], self.jawStartIntensityMD+".input2X", force=True)
                cmds.setAttr(self.jawIntensityPMA+".operation", 2)
                cmds.connectAttr(self.jawIntensityMD+".outputY", self.jawIntensityPMA+".input1D[0]", force=True)
                cmds.connectAttr(self.jawStartIntensityMD+".outputX", self.jawIntensityPMA+".input1D[1]", force=True)
                cmds.connectAttr(self.jawIntensityPMA+".output1D", self.jawIntensityCnd+".colorIfTrueG", force=True)
                cmds.connectAttr(self.jawCtrl+".rotateX", self.jawIntensityCnd+".firstTerm", force=True)
                cmds.connectAttr(self.jawCtrl+"."+self.langDic[self.langName]['c_moveStartRotation'], self.jawIntensityCnd+".secondTerm", force=True)
                cmds.setAttr(self.jawIntensityCnd+".operation", 2)
                cmds.setAttr(self.jawIntensityCnd+".colorIfFalseG", 0)
                cmds.connectAttr(self.jawIntensityCnd+".outColorG", self.jawSdkGrp+".translateY", force=True)
                cmds.connectAttr(self.jawIntensityCnd+".outColorG", self.jawIntensityZMD+".input1Z", force=True)
                cmds.connectAttr(self.jawCtrl+"."+self.langDic[self.langName]['c_moveIntensity']+"Z", self.jawIntensityFixUnitMD+".input1Z", force=True)
                cmds.setAttr(self.jawIntensityFixUnitMD+".input2Z", -0.1)
                cmds.connectAttr(self.jawIntensityFixUnitMD+".outputZ", self.jawIntensityZMD+".input2Z", force=True)
                cmds.connectAttr(self.jawIntensityZMD+".outputZ", self.jawSdkGrp+".translateZ", force=True)

                # create lip setup:
                # left side lip:
                lLipParentConst = cmds.parentConstraint(self.jawCtrl, self.headCtrl, self.lLipGrp, maintainOffset=True, name=self.lLipGrp+"_ParentConstraint")[0]
                cmds.setAttr(lLipParentConst+".interpType", 2)
                cmds.addAttr(self.lLipCtrl, longName=self.langDic[self.langName]['c_Follow'], attributeType='float', minValue=0, maxValue=1, defaultValue=0.5, keyable=True)
                cmds.connectAttr(self.lLipCtrl+'.'+self.langDic[self.langName]['c_Follow'], lLipParentConst+"."+self.jawCtrl+"W0", force=True)
                self.lLipRevNode = cmds.createNode('reverse', name=side+self.userGuideName+"_"+self.langDic[self.langName]['p002_left']+"_"+self.langDic[self.langName]['c_lip']+"_Rev")
                cmds.connectAttr(self.lLipCtrl+'.'+self.langDic[self.langName]['c_Follow'], self.lLipRevNode+".inputX", force=True)
                cmds.connectAttr(self.lLipRevNode+'.outputX', lLipParentConst+"."+self.headCtrl+"W1", force=True)
                cmds.scaleConstraint(self.headCtrl, self.lLipGrp, maintainOffset=True, name=self.lLipGrp+"_ScaleConstraint")[0]
                # right side lip:
                rLipParentConst = cmds.parentConstraint(self.jawCtrl, self.headCtrl, self.rLipGrp, maintainOffset=True, name=self.rLipGrp+"_ParentConstraint")[0]
                cmds.setAttr(rLipParentConst+".interpType", 2)
                cmds.addAttr(self.rLipCtrl, longName=self.langDic[self.langName]['c_Follow'], attributeType='float', minValue=0, maxValue=1, defaultValue=0.5, keyable=True)
                cmds.connectAttr(self.rLipCtrl+'.'+self.langDic[self.langName]['c_Follow'], rLipParentConst+"."+self.jawCtrl+"W0", force=True)
                self.rLipRevNode = cmds.createNode('reverse', name=side+self.userGuideName+"_"+self.langDic[self.langName]['p003_right']+"_"+self.langDic[self.langName]['c_lip']+"_Rev")
                cmds.connectAttr(self.rLipCtrl+'.'+self.langDic[self.langName]['c_Follow'], self.rLipRevNode+".inputX", force=True)
                cmds.connectAttr(self.rLipRevNode+'.outputX', rLipParentConst+"."+self.headCtrl+"W1", force=True)
                cmds.scaleConstraint(self.headCtrl, self.rLipGrp, maintainOffset=True, name=self.rLipGrp+"_ScaleConstraint")[0]
                
                # create a locator in order to avoid delete static group
                loc = cmds.spaceLocator(name=side+self.userGuideName+"_DO_NOT_DELETE")[0]
                cmds.parent(loc, self.worldRef, absolute=True)
                cmds.setAttr(loc+".visibility", 0)
                ctrls.setLockHide([loc], ['tx', 'ty', 'tz', 'rx', 'ry', 'rz', 'sx', 'sy', 'sz', 'v'])
                
                # hiding visibility attributes:
                ctrls.setLockHide([self.headCtrl, self.neckCtrl, self.jawCtrl, self.chinCtrl], ['v'], l=False)
                
                # create a masterModuleGrp to be checked if this rig exists:
                self.toCtrlHookGrp     = cmds.group(self.grpNeck, self.grpHead, self.zeroCtrlList[2], self.zeroCtrlList[4], self.zeroCtrlList[5], name=side+self.userGuideName+"_Control_Grp")
                self.toScalableHookGrp = cmds.group(self.neckJnt, self.headJnt, self.lLipJnt, self.rLipJnt, name=side+self.userGuideName+"_Joint_Grp")
                self.toStaticHookGrp   = cmds.group(self.toCtrlHookGrp, self.toScalableHookGrp, self.grpHead, self.worldRef, name=side+self.userGuideName+"_Grp")
                cmds.addAttr(self.toStaticHookGrp, longName="dpAR_name", dataType="string")
                cmds.addAttr(self.toStaticHookGrp, longName="dpAR_type", dataType="string")
                cmds.setAttr(self.toStaticHookGrp+".dpAR_name", self.userGuideName, type="string")
                cmds.setAttr(self.toStaticHookGrp+".dpAR_type", CLASS_NAME, type="string")
                # add module type counter value
                cmds.addAttr(self.toStaticHookGrp, longName='dpAR_count', attributeType='long', keyable=False)
                cmds.setAttr(self.toStaticHookGrp+'.dpAR_count', dpAR_count)
                # add hook attributes to be read when rigging integrated modules:
                utils.addHook(objName=self.toCtrlHookGrp, hookType='ctrlHook')
                utils.addHook(objName=self.grpHead, hookType='rootHook')
                utils.addHook(objName=self.toScalableHookGrp, hookType='scalableHook')
                utils.addHook(objName=self.toStaticHookGrp, hookType='staticHook')

                #Ensure head Jxt matrix
                mHead = cmds.getAttr(self.headCtrl + ".worldMatrix")
                cmds.xform(self.headJxt, m=mHead, ws=True)

                if hideJoints:
                    cmds.setAttr(self.toScalableHookGrp+".visibility", 0)
                
                # delete duplicated group for side (mirror):
                cmds.delete(side+self.userGuideName+'_'+self.mirrorGrp)
            # finalize this rig:
            self.integratingInfo()
            cmds.select(clear=True)
        # delete UI (moduleLayout), GUIDE and moduleInstance namespace:
        self.deleteModule()
예제 #49
0
파일: twist.py 프로젝트: fsanges/glTools-1
def build_hip(hip,
              pelvis,
              numJoints=4,
              hipAim='x',
              hipFront='y',
              pelvisAim='x',
              pelvisFront='y',
              enableCtrl=False,
              prefix=''):
    '''
	Build hip twist using custom hipConstraint node
	@param hip: Hip or upper leg joint 
	@type hip: str
	@param pelvis: Pelvis joint 
	@type pelvis: str
	@param numJoint: Number of twist joints to generate 
	@type numJoint: int
	@param hipAim: Axis along the length of the hip/leg joint 
	@type hipAim: list or tuple
	@param hipFront: Forward facing axis of the hip/leg joint 
	@type hipFront: list or tuple
	@param pelvisAim: Axis along the length of the pelvis joint 
	@type pelvisAim: list or tuple
	@param pelvisFront: Forward facing axis of the pelvis joint 
	@type pelvisFront: list or tuple
	@param enableCtrl: Enable the twist child joint as a control 
	@type enableCtrl: bool
	@param prefix: Naming prefix for created nodes
	@type prefix: str
	'''
    # ==========
    # - Checks -
    # ==========

    # Define Axis Dictionary
    axisDict = {
        'x': (1, 0, 0),
        'y': (0, 1, 0),
        'z': (0, 0, 1),
        '-x': (-1, 0, 0),
        '-y': (0, -1, 0),
        '-z': (0, 0, -1)
    }

    if not mc.objExists(hip):
        raise Exception('Hip joint "' + hip + '" does not exist!')
    if not mc.objExists(pelvis):
        raise Exception('Pelvis joint "' + pelvis + '" does not exist!')

    if not axisDict.has_key(hipAim):
        raise Exception('Invalid hip aim axis value! ("' + hipAim + '")')
    if not axisDict.has_key(hipFront):
        raise Exception('Invalid hip front axis value! ("' + hipFront + '")')
    if not axisDict.has_key(pelvisAim):
        raise Exception('Invalid pelvis aim axis value! ("' + pelvisAim + '")')
    if not axisDict.has_key(pelvisFront):
        raise Exception('Invalid pelvis front axis value! ("' + pelvisFront +
                        '")')

    if not prefix: prefix = glTools.utils.stringUtils.stripSuffix(hip)

    # Check Plugin
    if not mc.pluginInfo('twistConstraint', q=True, l=True):
        try:
            mc.loadPlugin('twistConstraint')
        except:
            raise Exception('Unable to load plugin "twistConstraint"!')

    # ======================
    # - Configure Modifier -
    # ======================

    twistCtrlScale = 0.2
    ctrlBuilder = glTools.tools.controlBuilder.ControlBuilder()

    # =======================
    # - Create Twist Joints -
    # =======================

    twistJoints = createTwistJoints(joint=hip,
                                    numTwistJoints=numJoints,
                                    offsetAxis=hipAim[-1],
                                    prefix=prefix)
    # Reverse twist joint list
    twistJoints.reverse()

    # Create Twist Driver Joint
    mc.select(cl=True)
    hipTwist = mc.joint(n=prefix + '_twistDrive_jnt')
    hipTwistGrp = glTools.utils.joint.group(hipTwist)
    mc.delete(mc.parentConstraint(hip, hipTwistGrp))
    mc.parent(hipTwistGrp, hip)
    glTools.utils.base.displayOverride(hipTwist,
                                       overrideEnable=1,
                                       overrideDisplay=2,
                                       overrideLOD=0)

    # Create Hip Twist Joints
    twistJointGrps = []
    twistFactor = 1.0 / (len(twistJoints) - 1)
    jntLen = glTools.utils.joint.length(hip)
    for i in range(len(twistJoints)):

        # Add Twist Control Attribute
        mc.addAttr(twistJoints[i],
                   ln='twist',
                   min=-1.0,
                   max=1.0,
                   dv=twistFactor * i)

        # Add Twist Joint Group
        twistJointGrp = glTools.utils.joint.group(twistJoints[i],
                                                  indexStr='Twist')
        twistJointGrps.append(twistJointGrp)

        # Tag Bind Joint
        glTools.rig.utils.tagBindJoint(twistJoints[i], True)

        # Create Joint Control
        if enableCtrl:
            glTools.rig.utils.tagCtrl(twistJoints[i], 'tertiary')
            ctrlBuilder.controlShape(transform=twistJoints[i],
                                     controlType='sphere',
                                     controlScale=twistCtrlScale)

        # Set Display Override
        if enableCtrl:
            glTools.utils.base.displayOverride(twistJoints[i],
                                               overrideEnable=1,
                                               overrideDisplay=0,
                                               overrideLOD=1)
        else:
            glTools.utils.base.displayOverride(twistJoints[i],
                                               overrideEnable=1,
                                               overrideDisplay=2,
                                               overrideLOD=0)

    # Create Twist Group
    twistGrp = mc.joint(n=prefix + '_twistJoint_grp')
    glTools.utils.base.displayOverride(twistGrp,
                                       overrideEnable=1,
                                       overrideLOD=1)
    glTools.utils.transform.match(twistGrp, hip)
    mc.setAttr(twistGrp + '.segmentScaleCompensate', 0)
    mc.setAttr(twistGrp + '.drawStyle', 2)  # None
    mc.setAttr(twistGrp + '.radius', 0)
    mc.parent(twistGrp, hip)
    mc.parent(twistJointGrps, twistGrp)

    # Connect Inverse Scale
    for twistJointGrp in twistJointGrps:
        mc.connectAttr(hip + '.scale', twistJointGrp + '.inverseScale', f=True)

    # ==========================
    # - Create Hip Twist Setup -
    # ==========================

    # Create hipConstraint node
    hipCon = mc.createNode('hipConstraint', n=prefix + '_hipConstraint')

    # Set and connect hipConstraint attributes
    mc.connectAttr(hip + '.worldMatrix[0]', hipCon + '.hip', f=True)
    mc.connectAttr(pelvis + '.worldMatrix[0]', hipCon + '.pelvis', f=True)
    mc.connectAttr(hipTwist + '.parentInverseMatrix[0]',
                   hipCon + '.parentInverseMatrix',
                   f=True)
    mc.connectAttr(hipTwist + '.rotateOrder', hipCon + '.rotateOrder', f=True)
    mc.connectAttr(hipTwist + '.jointOrient', hipCon + '.jointOrient', f=True)
    mc.setAttr(hipCon + '.hipAim', *axisDict[hipAim])
    mc.setAttr(hipCon + '.hipFront', *axisDict[hipFront])
    mc.setAttr(hipCon + '.pelvisAim', *axisDict[pelvisAim])
    mc.setAttr(hipCon + '.pelvisFront', *axisDict[pelvisFront])

    # Connect to hip twist joint
    mc.connectAttr(hipCon + '.outRotate', hipTwist + '.rotate', f=True)

    # Correct initial offset
    twistOffset = mc.getAttr(hipTwist + '.r' + hipAim[-1])
    mc.setAttr(hipTwist + '.jo' + hipAim[-1], twistOffset)

    # ========================
    # - Connect Twist Joints -
    # ========================

    twistMultNode = []
    for i in range(len(twistJoints)):

        alphaInd = glTools.utils.stringUtils.alphaIndex(i, upper=True)
        twistMult = mc.createNode('multDoubleLinear',
                                  n=prefix + '_twist' + alphaInd +
                                  '_multDoubleLinear')
        mc.connectAttr(hipTwist + '.r' + hipAim[-1],
                       twistMult + '.input1',
                       f=True)
        mc.connectAttr(twistJoints[i] + '.twist',
                       twistMult + '.input2',
                       f=True)
        mc.connectAttr(twistMult + '.output',
                       twistJointGrps[i] + '.r' + hipAim[-1],
                       f=True)
        twistMultNode.append(twistMult)

    # Reverse twist joint list
    twistJoints.reverse()

    # ======================
    # - Set Channel States -
    # ======================

    chStateUtil = glTools.utils.channelState.ChannelState()
    chStateUtil.setFlags([2, 2, 2, 2, 2, 2, 2, 2, 2, 1], objectList=[twistGrp])
    chStateUtil.setFlags([0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
                         objectList=twistJoints)
    chStateUtil.setFlags([2, 2, 2, 2, 2, 2, 2, 2, 2, 1],
                         objectList=twistJointGrps)
    chStateUtil.setFlags([2, 2, 2, 2, 2, 2, 2, 2, 2, 1],
                         objectList=[hipTwistGrp])
    chStateUtil.setFlags([2, 2, 2, 1, 1, 1, 2, 2, 2, 1], objectList=[hipTwist])

    # =================
    # - Return Result -
    # =================

    result = {}
    result['twistGrp'] = twistGrp
    result['twistJoints'] = twistJoints
    result['twistJointGrps'] = twistJointGrps
    result['twistDriveJoint'] = hipTwist
    result['twistConstraint'] = hipCon
    result['twistMultNodes'] = twistMultNode
    return result
예제 #50
0
파일: arm_rig.py 프로젝트: AlisaGf/AutoRig
    def make_arm_rig(self, side, clavicle, shoulder, elbow, wrist, color):
        #variables
        if not cmds.objExists('joints'):
            cmds.group(em=True, n='joints')
            cmds.group(em=True, n='controls')
            cmds.group(em=True, n='IKs')
        else:
            pass
        self.controls = []

        # disconnect shoulder joint
        cmds.disconnectJoint(shoulder)
        new_joint = cmds.pickWalk(clavicle, d='down')
        clavicle_end = cmds.rename(new_joint, clavicle + '_end')

        cmds.disconnectJoint(wrist)
        new_joint = cmds.pickWalk(elbow, d='down')
        elbow_end = cmds.rename(new_joint, elbow + '_end')

        # duplicate arm
        cmds.duplicate(shoulder, n='shoulder_' + side + '_ik')
        cmds.duplicate(shoulder, n='shoulder_' + side + '_fk')

        # variables for fk chain
        fk_shoulder = 'shoulder_' + side + '_fk'
        temp = cmds.pickWalk(fk_shoulder, d='down')
        fk_elbow = cmds.rename(temp, 'elbow_' + side + '_fk')
        temp = cmds.pickWalk(fk_elbow, d='down')
        fk_elbow_end = cmds.rename(temp, 'elbow_' + side + '_end_fk')
        cmds.parent(fk_shoulder, clavicle_end)

        # variables for ik chain
        ik_shoulder = 'shoulder_' + side + '_ik'
        temp = cmds.pickWalk(ik_shoulder, d='down')
        ik_elbow = cmds.rename(temp, 'elbow_' + side + '_ik')
        temp = cmds.pickWalk(ik_elbow, d='down')
        ik_elbow_end = cmds.rename(temp, 'elbow_' + side + '_end_ik')

        # create ik_fk_switch control
        legs = leg_rig.create_rig()
        legs.create_ik_fk_switch(side, 'wrist_' + side + '_bind', 'arm', color,
                                 0, 0, -5, [0, 1, 0])
        cmds.matchTransform('ik_fk_arm_' + side + '_Grp', wrist)
        self.ik_fk_control = 'ik_fk_arm_' + side

        cmds.parent(wrist, elbow_end)
        #create ik fk chains
        self.make_fk_joint_chain(fk_shoulder, fk_elbow, wrist, color)
        cmds.parent(fk_shoulder, w=True)
        self.make_ik_joint_chain(side, ik_shoulder, ik_elbow, ik_elbow_end,
                                 wrist, color)

        # create ikfk switch
        self.ik_fk_switch(fk_shoulder, ik_shoulder, shoulder)
        self.ik_fk_switch(fk_elbow, ik_elbow, elbow)

        # make clavicle controls
        self.make_clavicle_controls(clavicle, side, color)
        cmds.parentConstraint(cmds.pickWalk(clavicle, d='down'), ik_shoulder)

        # parent everything to groups
        cmds.parent(fk_shoulder, ik_shoulder, shoulder, 'joints')
        self.l.stretchy(ik_shoulder, wrist, 'arm_stretchy_curve_' + side, side,
                        shoulder, elbow, self.stretchy_joint,
                        self.ik_fk_control)
예제 #51
0
def intersect():
    activeSelList = om.MGlobal.getActiveSelectionList()
    selListIt = om.MItSelectionList(activeSelList)

    sportLightTransformNode = None
    # spotLightDP = None
    # meshTransformNode = None
    meshDP = None

    while not selListIt.isDone():
        nodeDP = selListIt.getDagPath()
        if nodeDP.apiType() == om.MFn.kTransform:
            dagNodeFn = om.MFnDagNode(nodeDP)
            nodeDP = dagNodeFn.child(0)

        if nodeDP.apiType() == om.MFn.kSpotLight:
            # spotLightDP = nodeDP
            sportLightTransformNode = dagNodeFn
        elif nodeDP.apiType() == om.MFn.kMesh:
            meshDP = nodeDP
            # meshTransformNode = dagNodeFn
        selListIt.next()

    tx = sportLightTransformNode.findPlug('tx', False).asFloat()
    ty = sportLightTransformNode.findPlug('ty', False).asFloat()
    tz = sportLightTransformNode.findPlug('tz', False).asFloat()

    fpSource = om.MFloatPoint(tx, ty, tz)
    fvRayDir = getLightDirection(sportLightTransformNode.name())

    meshFn = om.MFnMesh(om.MDagPath.getAPathTo(meshDP))
    mmAccelParams = meshFn.autoUniformGridParams()
    hitPoint, hitRayParam, hitFace, hitTriangle, hitBary1, hitBary2 = meshFn.anyIntersection(
        fpSource,
        fvRayDir,
        om.MSpace.kWorld,
        9999.,
        False,
        accelParams=mmAccelParams,
        tolerance=float(1e-6))

    if hitRayParam == 0.0:
        print('There were no intersection points detected')
        return

    hitPoints, hitRayParams, hitFaces, hitTriangles, hitBary1s, hitBary2s = meshFn.allIntersections(
        fpSource, fvRayDir, om.MSpace.kWorld, 9999., False, tolerance=0.000001)

    normals = meshFn.getNormals(om.MSpace.kWorld)
    i = 0
    for hp in hitPoints:
        arrow = RayArrow()
        constraint = cmds.pointConstraint(sportLightTransformNode.name(),
                                          arrow.botHandle)
        cmds.delete(constraint)
        cube = cmds.polyCube()
        cmds.move(hp.x, hp.y, hp.z, ws=1)
        constraint = cmds.pointConstraint(cube[0], arrow.topHandle)
        cmds.delete(cube + constraint)
        arrow.orient()

        # reflection
        # R = 2(N dot L)N - L
        # L: fvRayDir
        faceId = hitFaces[i]

        # N
        faceNormal = normals[meshFn.getFaceNormalIds(faceId)[0]]

        # R
        refl = 2 * (faceNormal * fvRayDir) * faceNormal - fvRayDir

        # reflection arrow
        arrowRefl = RayArrow()
        constraint = cmds.pointConstraint(arrow.topHandle, arrowRefl.botHandle)
        cmds.delete(constraint)

        selListIt = om.MSelectionList()
        selListIt.add(arrowRefl.botHandle)
        selListIt.add(arrowRefl.topHandle)

        # move and rotate botHandle
        reflBotTran = om.MFnTransform(selListIt.getDagPath(0))
        reflBotTran.setRotation(om.MEulerRotation(refl), om.MSpace.kTransform)

        # move and rotate topHandle
        constraint = cmds.parentConstraint(arrowRefl.botHandle,
                                           arrowRefl.topHandle,
                                           mo=0)
        cmds.delete(constraint)
        # reflTopTran = om.MFnTransform(selListIt.getDagPath(1))
        # #reflTopTran.setRotation(om.MEulerRotation(refl), om.MSpace.kTransform)
        # # topMove = om.MVector(refl)
        # #topMove = om.MVector(refl + om.MFloatVector(0, 6, 0)) * reflTopTran.transformationMatrix()
        # topMove = om.MVector(refl * om.MFloatVector(1, 6, 1)) * reflBotTran.transformationMatrix()
        # # topMove.y += 6
        # reflTopTran.setTranslation(topMove, om.MSpace.kTransform)

        cmds.move(0, 6, 0, arrowRefl.topHandle, r=1, os=1, wd=1)

        arrowRefl.orient()

        # refraction arrow
        # T = ((1/fl*N) dot L) - sqrt(1 - 1/(fl*fl)*(1 - (N dot L)*(N dot L))) * N - 1/fl * L
        fl = .750
        fl2 = 0.5627813555039173

        a = (fl * faceNormal) * fvRayDir
        b = math.sqrt(1 - fl2 * abs(1 - math.pow(faceNormal * fvRayDir, 2)))
        c = a - b
        refr = c * faceNormal - fl * fvRayDir

        refrArrow = RayArrow()
        constraint = cmds.pointConstraint(arrow.topHandle, refrArrow.botHandle)
        cmds.delete(constraint)

        selListIt = om.MSelectionList()
        selListIt.add(refrArrow.botHandle)
        selListIt.add(refrArrow.topHandle)

        # move and rotate botHandle
        reflBotTran = om.MFnTransform(selListIt.getDagPath(0))
        reflBotTran.setRotation(om.MEulerRotation(refr), om.MSpace.kTransform)

        # move and rotate topHandle
        constraint = cmds.parentConstraint(refrArrow.botHandle,
                                           refrArrow.topHandle,
                                           mo=0)
        cmds.delete(constraint)

        cmds.move(0, -6, 0, refrArrow.topHandle, r=1, os=1, wd=1)

        refrArrow.orient()

        i += 1
예제 #52
0
 def _Parent_Controller(self,light,obj,*argv):
     print 'parent',light,obj
     if light:
         for l in light:
             cmds.parentConstraint(obj,l,mo=1)
 def Position_Fn(self):
     self.Check_Selection
     cmds.delete(cmds.parentConstraint(adv, Ziva_Rig[i]))
예제 #54
0
def VK_system(num_ctr=1, num_jt=20, fk=True):
    """
	final assembly of the entire system
	"""
    fk_hide_attr = lambda node, b: [
        cmds.setAttr('%s.%s' % (node, a), l=b, k=not b)
        for a in 'tx,ty,tz,sx,sy,sz,v'.split(',')
    ]
    ik_hide_attr = lambda node, b: [
        cmds.setAttr('%s.%s' % (node, a), l=b, k=not b)
        for a in 'tx,ty,tz,ry,rz,sx,sy,sz,v'.split(',')
    ]
    ctrl_hide_attr = lambda node, b: [
        cmds.setAttr('%s.%s' % (node, a), l=b, k=not b)
        for a in 'rx,ry,rz,sx,sy,sz,v'.split(',')
    ]

    orig_cu = setup.get_curve()[0]
    cu = cmds.duplicate(orig_cu, n='vks_curve#')[0]
    jts = setup.chain(cu, num_jt, 'vks_orig_joint')
    d_jts = setup.chain(cu, num_jt, 'vks_skin_joint')
    cmds.toggle(d_jts, localAxis=True)
    parameter_attr(jts)
    #loft,skin
    surf = create_loft(jts, 'vks_lofted_mesh')
    surf_s = cmds.listRelatives(surf, c=1)[0]
    #hierarchical groups
    vks_grp = cmds.group(surf, name='VariableKinematicsSystem#')
    mov_grp = cmds.group(em=True, parent=vks_grp, name='vks_move_grp#')
    rig_grp = cmds.group(em=True, parent=vks_grp, name='vks_rig_grp#')
    flc_grp = cmds.group(em=True, parent=rig_grp, name='vks_follice_grp#')
    setup.lock_attr(flc_grp, 1)
    setup.off_vis(rig_grp)

    #create vks controls
    vks_ctr = []
    vks_ctr_grp = []
    for i in range(num_ctr):
        #create follice
        vPos = setup.linstep(0., num_ctr - 1, i)
        flc = setup.create_follicle(surf_s, 0.5, vPos, 'vks_follice')
        flc_tr = cmds.listRelatives(flc, p=1)[0]
        cmds.parent(flc_tr, flc_grp)
        #create control
        vkss = create_control(flc, 'vks_parametric')
        vks_ctr_grp.append(vkss[0])
        vks_ctr.append(vkss[-1])
    #ikspline
    ikhnd = cmds.ikHandle(sj=jts[0],
                          ee=jts[-1],
                          c=cu,
                          ccv=False,
                          sol='ikSplineSolver')
    #create joint orig group
    org_grp = cmds.group(jts[0], parent=rig_grp, n='vks_orig_grp#')
    rot = cmds.xform(jts[0], q=True, ws=True, ro=True)
    cmds.xform(org_grp, ws=True, ro=(rot[0], rot[1], rot[2]), piv=(0, 0, 0))
    cmds.parent(cu, ikhnd[0], rig_grp)

    #building explicit control
    m_ctr = setup.ctrl_cube('vks_explicit#', sz=2)
    cmds.parent(m_ctr, vks_grp)
    tr = cmds.xform(jts[0], q=True, ws=True, t=True)
    cmds.xform(m_ctr, ws=True, t=tr)
    cmds.makeIdentity(m_ctr, apply=1, t=1, r=1, s=1, n=0)
    cmds.parent(vks_ctr_grp, m_ctr)

    cmds.parentConstraint(m_ctr, org_grp, mo=1)
    cmds.parentConstraint(m_ctr, mov_grp, mo=1)
    cmds.scaleConstraint(m_ctr, mov_grp)

    if fk:  #FK module
        for c in vks_ctr:
            fk_hide_attr(c, 1)
            for j in jts:
                jgroup = cmds.group(j, n='%s_%s' % (j, c))
                piv = cmds.xform(j, q=True, ws=True, piv=True)
                cmds.xform(jgroup, ws=True, piv=(piv[0], piv[1], piv[2]))
                connection(c, j, jgroup)

        for n, j in enumerate(jts):
            cmds.parentConstraint(j, d_jts[n])
        #fk length
        cmds.addAttr(m_ctr, ln='length', at='double', k=1, min=0, max=10, dv=1)
        v_tx = cmds.getAttr('%s.tx' % jts[1])
        pma = cmds.createNode('plusMinusAverage',
                              n='vfk_lengthConversion_%s' % m_ctr)
        cmds.setAttr("%s.input1D[0]" % pma, -1)
        cmds.setAttr("%s.input1D[1]" % pma, v_tx)
        cmds.connectAttr('%s.length' % m_ctr, '%s.input1D[2]' % pma)
        for j in jts[1:-1]:
            cmds.connectAttr('%s.output1D' % pma, '%s.tx' % j)

        cmds.scaleConstraint(m_ctr, org_grp)
        cmds.parent(d_jts[0], mov_grp)
        cmds.delete(ikhnd)
    if not fk:  #IK module
        jj = [j for j in jts]
        for c in vks_ctr:
            ik_hide_attr(c, 1)
            for n, j in enumerate(jts):
                jgroup = cmds.group(em=True, n='%s_%s' % (j, c), parent=jj[n])
                jj[n] = jgroup
                connection(c, j, jgroup)
        for n in range(num_jt):
            cmds.parentConstraint(jj[n], d_jts[n])
        #ik stretch
        cu_sc = ik_stretch(ikhnd[0])
        cmds.addAttr(m_ctr,
                     ln="stretch",
                     at='double',
                     k=1,
                     min=0,
                     max=10,
                     dv=10)
        ucn = setup.onetenthNode(m_ctr, 'stretch')
        cmds.connectAttr('%s.output' % ucn, '%s.ik_stretch' % ikhnd[0])

        cls_grp = cmds.group(em=True, name='vks_cluster_grp#')
        setup.off_vis(cls_grp)
        ik_cls = cluster_on_curve(cu)
        for ik_cl in ik_cls:
            l_ctrl, l_null = setup.local_cluster_control2(ik_cl)
            ctrl_hide_attr(l_ctrl, 1)
            cmds.parent(l_ctrl, m_ctr)
            cmds.parent(ik_cl, l_null, cls_grp)
        cmds.parent(d_jts[0], cls_grp, cu_sc, mov_grp)

    cmds.select(cl=True)
예제 #55
0
    def publishAsset(self, iAObj=None):
        '''Publish the asset defined by the provided *iAObj*.'''
        pubMessage = 'Published cameraasset asset'

        # Only export selection when exporting camera
        iAObj.options['exportMode'] = 'Selection'
        publishedComponents = []

        totalSteps = self.getTotalSteps(steps=[
            iAObj.options['cameraBake'], iAObj.options['cameraMaya'],
            iAObj.options['cameraAlembic'], iAObj.options['mayaPublishScene']
        ])
        panelComInstance = panelcom.PanelComInstance.instance()
        panelComInstance.setTotalExportSteps(totalSteps + 1)

        # Get original selection
        nodes = mc.ls(sl=True)

        # Get camera shape and parent transforms
        cameraShape = ''
        for node in nodes:
            if mc.nodeType(node) == 'camera':
                cameraShape = node
            else:
                cameraShapes = mc.listRelatives(node,
                                                allDescendents=True,
                                                type='camera')
                if len(cameraShapes) > 0:
                    # We only care about one camera
                    cameraShape = cameraShapes[0]

        if cameraShape == '':
            return None, 'No camera selected'

        cameraTransform = mc.listRelatives(cameraShape,
                                           type='transform',
                                           parent=True)
        cameraTransform = cameraTransform[0]

        if iAObj.options['cameraBake']:
            tmpCamComponents = mc.duplicate(cameraTransform, un=1, rc=1)
            if mc.nodeType(tmpCamComponents[0]) == 'transform':
                tmpCam = tmpCamComponents[0]
            else:
                tmpCam = mc.ls(tmpCamComponents, type='transform')[0]
            pConstraint = mc.parentConstraint(cameraTransform, tmpCam)
            try:
                mc.parent(tmpCam, world=True)
            except RuntimeError:
                print 'camera already in world space'

            mc.bakeResults(tmpCam,
                           simulation=True,
                           t=(float(iAObj.options['frameStart']),
                              float(iAObj.options['frameEnd'])),
                           sb=1,
                           at=['tx', 'ty', 'tz', 'rx', 'ry', 'rz'],
                           hi='below')

            mc.delete(pConstraint)
            cameraTransform = tmpCam
            panelComInstance.emitPublishProgressStep()

        if iAObj.options['cameraLock']:
            # Get original lock values so we can revert after exporting
            origCamLocktx = mc.getAttr('{0}.tx'.format(cameraTransform),
                                       l=True)
            origCamLockty = mc.getAttr('{0}.ty'.format(cameraTransform),
                                       l=True)
            origCamLocktz = mc.getAttr('{0}.tz'.format(cameraTransform),
                                       l=True)
            origCamLockrx = mc.getAttr('{0}.rx'.format(cameraTransform),
                                       l=True)
            origCamLockry = mc.getAttr('{0}.ry'.format(cameraTransform),
                                       l=True)
            origCamLockrz = mc.getAttr('{0}.rz'.format(cameraTransform),
                                       l=True)
            origCamLocksx = mc.getAttr('{0}.sx'.format(cameraTransform),
                                       l=True)
            origCamLocksy = mc.getAttr('{0}.sy'.format(cameraTransform),
                                       l=True)
            origCamLocksz = mc.getAttr('{0}.sz'.format(cameraTransform),
                                       l=True)

            # Lock transform
            mc.setAttr('{0}.tx'.format(cameraTransform), l=True)
            mc.setAttr('{0}.ty'.format(cameraTransform), l=True)
            mc.setAttr('{0}.tz'.format(cameraTransform), l=True)
            mc.setAttr('{0}.rx'.format(cameraTransform), l=True)
            mc.setAttr('{0}.ry'.format(cameraTransform), l=True)
            mc.setAttr('{0}.rz'.format(cameraTransform), l=True)
            mc.setAttr('{0}.sx'.format(cameraTransform), l=True)
            mc.setAttr('{0}.sy'.format(cameraTransform), l=True)
            mc.setAttr('{0}.sz'.format(cameraTransform), l=True)

        if iAObj.options['cameraMaya']:
            iAObj.setTotalSteps = False
            mayaComponents, message = GenericAsset.publishAsset(self, iAObj)
            publishedComponents += mayaComponents

        if iAObj.options['cameraAlembic']:
            mc.loadPlugin('AbcExport.so', qt=1)
            temporaryPath = HelpFunctions.temporaryFile(suffix='.abc')
            publishedComponents.append(
                FTComponent(componentname='alembic', path=temporaryPath))

            alembicJobArgs = ''
            alembicJobArgs += '-fr {0} {1}'.format(iAObj.options['frameStart'],
                                                   iAObj.options['frameEnd'])
            objCommand = '-root ' + cameraTransform + ' '
            alembicJobArgs += ' ' + objCommand + '-file ' + temporaryPath
            alembicJobArgs += ' -step ' + str(iAObj.options['alembicSteps'])
            try:
                mc.AbcExport(j=alembicJobArgs)
            except:
                import traceback
                var = traceback.format_exc()
                return None, var
            panelComInstance.emitPublishProgressStep()

        if iAObj.options['cameraLock']:
            # Revert camera locks to original
            mc.setAttr('{0}.tx'.format(cameraTransform), l=origCamLocktx)
            mc.setAttr('{0}.ty'.format(cameraTransform), l=origCamLockty)
            mc.setAttr('{0}.tz'.format(cameraTransform), l=origCamLocktz)
            mc.setAttr('{0}.rx'.format(cameraTransform), l=origCamLockrx)
            mc.setAttr('{0}.ry'.format(cameraTransform), l=origCamLockry)
            mc.setAttr('{0}.rz'.format(cameraTransform), l=origCamLockrz)
            mc.setAttr('{0}.sx'.format(cameraTransform), l=origCamLocksx)
            mc.setAttr('{0}.sy'.format(cameraTransform), l=origCamLocksy)
            mc.setAttr('{0}.sz'.format(cameraTransform), l=origCamLocksz)

        if iAObj.options['cameraBake']:
            mc.delete(cameraTransform)
        # Set back original selection
        mc.select(nodes)
        panelComInstance.emitPublishProgressStep()

        if iAObj.options['mayaPublishScene']:
            iAObjCopy = self.getSceneSettingsObj(iAObj)
            sceneComponents, message = GenericAsset.publishAsset(
                self, iAObjCopy)
            publishedComponents += sceneComponents

        return publishedComponents, pubMessage
예제 #56
0
import maya.cmds as cmds

def RunAutoRig(radioBtn):
    print (radioBtn)
    if radioBtn == 1:
        selected = cmds.ls(selection = True)
        parents = []
        children = []
        for i in range(0, len(selected):
            if i % 2:
                parents.append(selected[i])
            else :
                children.append(selected[i])
        for j in range(0,len(selected) / 2):
            cmds.parentConstraint(parents[j],children[j])
    if radioBtn == 2:
       selected = cmds.ls(selection = True)
       parents = []
       children = []
       for i in range(0, len(selected)):
           if i <= len()selected) / 2 -1:
           else:
               children.append(select[i])
       for j in range(0,len(selected) / 2):
           cmds.parentConstraint(parents[j],children[j])
예제 #57
0
    def _createHockIkHierarchy(self):
        """Create IK hock control hierarchy. """

        ik_hock_ctl = mc.circle(n="{}_{}_hockIk_ctl_{}".format(self.side, self.name, self.instance_num), r=1)[0]
        ik_hock_grp = mc.group(ik_hock_ctl, n=ik_hock_ctl.replace("ctl", "grp"))
        ik_hock_zero = mc.group(ik_hock_grp, n=ik_hock_ctl.replace("ctl", "zero"))
        inverse_hock_grp = mc.group(n=ik_hock_ctl.replace("_ctl", "_Inverse_grp"), em=1)
        inverse_hock_zero = mc.group(inverse_hock_grp, n=ik_hock_ctl.replace("_ctl", "_Inverse_zero"))

        mc.setAttr(inverse_hock_grp + ".rotateOrder", 5)

        mc.connectAttr(self.ik_controllers["hindleg"] + ".ikFk", ik_hock_zero + ".v")

        mc.parent(inverse_hock_zero, ik_hock_ctl)
        mc.parent(ik_hock_zero, self.mod_dict["IKcontrol"])

        mc.xform(ik_hock_zero, ws=1, matrix=self.guides["foot"][2])

        par_del = mc.parentConstraint(self.ik_controllers["footIk"], inverse_hock_zero)
        mc.delete(par_del)

        mult = mc.createNode("multiplyDivide", n=inverse_hock_grp.replace("grp", "mdn"))
        mc.setAttr(mult + ".input2X", -1)
        mc.setAttr(mult + ".input2Y", -1)
        mc.setAttr(mult + ".input2Z", -1)

        mc.connectAttr(self.misc["hockslave1"] + ".r", mult + ".input1")
        mc.connectAttr(mult + ".output", inverse_hock_grp + ".r")

        hock_grp = mc.listRelatives(self.ik_controllers["footIkOffset"], ad=1)[1]
        rjc.constrain_object(hock_grp, ik_hock_zero, "parent", 1)

        rollIn_grp = mc.group(n=ik_hock_ctl.replace("ctl", "rollIn_org"), em=1)
        rollOut_grp = mc.group(n=ik_hock_ctl.replace("ctl", "rollOut_org"), em=1)

        rollHeel_ctl = mc.circle(n=ik_hock_ctl.replace("ctl", "rollHeel_ctl"), r=.4)[0]
        rollHeel_cth = mc.group(rollHeel_ctl, n=ik_hock_ctl.replace("ctl", "rollHeel_cth"))
        rollHeel_org = mc.group(rollHeel_cth, n=ik_hock_ctl.replace("ctl", "rollHeel_org"))

        rollToe_ctl = mc.circle(n=ik_hock_ctl.replace("ctl", "rollToe_ctl"), r=.4)[0]
        rollToe_cth = mc.group(rollToe_ctl, n=ik_hock_ctl.replace("ctl", "rollToe_cth"))
        rollToe_org = mc.group(rollToe_cth, n=ik_hock_ctl.replace("ctl", "rollToe_org"))

        ballIk_ctl = mc.circle(n=ik_hock_ctl.replace("hockIk_ctl", "ballIk_ctl"), r=.4)[0]
        ballIk_cth = mc.group(ballIk_ctl, n=ballIk_ctl.replace("ctl", "cth"))
        ballIk_org = mc.group(ballIk_cth, n=ballIk_ctl.replace("ctl", "org"))

        footIk_grp = mc.group(n=ik_hock_ctl.replace("ctl", "footHook_grp"), em=1)
        footIk_cth = mc.group(footIk_grp, n=footIk_grp.replace("grp", "cth"))
        footIk_org = mc.group(footIk_cth, n=footIk_grp.replace("grp", "org"))
        footIkRev_org = mc.group(footIk_org, n=footIk_grp.replace("_grp", "Inverse_org"))
        footIkAttr_org = mc.group(footIkRev_org, n=footIk_grp.replace("_grp", "Attr_org"))

        mc.xform(rollIn_grp, ws=1, t=self.guides["rollIn"][1])
        mc.xform(rollOut_grp, ws=1, t=self.guides["rollOut"][1])
        mc.xform(rollHeel_org, ws=1, t=self.guides["rollHeel"][1])
        mc.xform(rollToe_org, ws=1, t=self.guides["toeEnd"][1])
        mc.xform(ballIk_org, ws=1, t=self.guides["ball"][1])
        mc.xform(footIkAttr_org, ws=1, t=self.guides["ball"][1])
        mc.xform(footIk_org, ws=1, matrix=self.guides["foot"][2])

        mc.parent(rollIn_grp, inverse_hock_grp)
        mc.parent(rollOut_grp, rollIn_grp)
        mc.parent(rollHeel_org, rollOut_grp)
        mc.parent(rollToe_org, rollHeel_ctl)
        mc.parent(ballIk_org, rollToe_ctl)
        mc.parent(footIkAttr_org, ballIk_ctl)

        mc.connectAttr(self.misc["hockslave1"] + ".r", footIkRev_org + ".r")
        mc.parentConstraint(ballIk_cth, self.joint_dict["ball" + "IK"], n=ballIk_cth.replace("cth", "prc"), mo=1)

        par = mc.parentConstraint(ballIk_cth, self.joint_dict["ball" + "FK"], self.joint_dict["ball" + "FINAL"],
                                  n=self.joint_dict["ball" + "FK"].replace("jnt", "prc").replace("parentConstraint1",
                                                                                                 ""), mo=1)[0]
        mc.connectAttr(self.ik_controllers["hindleg"] + ".ikFk", par + "." + ballIk_cth + "W0")

        rev = mc.createNode("reverse", n=self.joint_dict["ball" + "FK"].replace("jnt", "rev"))
        mc.connectAttr(self.ik_controllers["hindleg"] + ".ikFk", rev + ".inputX")
        mc.connectAttr(rev + ".outputX", par + "." + self.joint_dict["ball" + "FK"] + "W1")

        self.misc["footHook"] = footIk_grp
        self.misc["footHookCth"] = footIk_cth
        self.misc["footHookAttr"] = footIkAttr_org
        self.misc["rollToe"] = rollToe_cth
        self.misc["rollHeel"] = rollHeel_cth
        self.misc["rollIn"] = rollIn_grp
        self.misc["rollOut"] = rollOut_grp
    def __init__(self, ctrlGrp, neckJnt, headJnt, headUpJnt, headLowJnt,
                 jawJnt, noseJnt, eyebrowJnt, upperTeethJnt, lowerTeethJnt,
                 tongue01Jnt, tongue02Jnt, tongue03Jnt, tongue04Jnt, earLFTJnt,
                 earRGTJnt, noseTipJnt, chinJnt, throatJnt, scale,
                 nostrilLFTJnt, cheekUpLFTJnt, cheekUpOutLFTJnt,
                 cheekDownLFTJnt, eyebrowInLFTJnt, eyebrowMidLFTJnt,
                 eyebrowOutLFTJnt, browInUpLFTJnt, browMidUpLFTJnt,
                 browOutUpLFTJnt, eyelidPinchInLFTJnt, browInDownLFTJnt,
                 browMidDownLFTJnt, browOutDownLFTJnt, eyelidPinchOutLFTJnt,
                 nostrilRGTJnt, cheekUpRGTJnt, cheekUpOutRGTJnt,
                 cheekDownRGTJnt, eyebrowInRGTJnt, eyebrowMidRGTJnt,
                 eyebrowOutRGTJnt, browInUpRGTJnt, browMidUpRGTJnt,
                 browOutUpRGTJnt, eyelidPinchInRGTJnt, browInDownRGTJnt,
                 browMidDownRGTJnt, browOutDownRGTJnt, eyelidPinchOutRGTJnt,
                 sideLFT, sideRGT, eyeballJntLFT, eyeballJntRGT,
                 prefixEyeballAim, positionEyeAimCtrl, objectFolMesh,
                 directionBrowIn, directionBrowMid, directionBrowOut,
                 directionBrowPinchIn, directionBrowPinchOut, headCtrlSSNode):

        # BUILD CONTROLLER
        ctrlFaceGroup = mc.group(em=1, n='faceCtrl_grp')

        main = mn.Build(
            ctrlGrp=ctrlGrp,
            objectFolMesh=objectFolMesh,
            neckJnt=neckJnt,
            headJnt=headJnt,
            noseJnt=noseJnt,
            headUpJnt=headUpJnt,
            headLowJnt=headLowJnt,
            eyebrowJnt=eyebrowJnt,
            jawJnt=jawJnt,
            upperTeethJnt=upperTeethJnt,
            lowerTeethJnt=lowerTeethJnt,
            tongue01Jnt=tongue01Jnt,
            tongue02Jnt=tongue02Jnt,
            tongue03Jnt=tongue03Jnt,
            tongue04Jnt=tongue04Jnt,
            noseTipJnt=noseTipJnt,
            chinJnt=chinJnt,
            throatJnt=throatJnt,
            scale=scale,
            eyeballJntLFT=eyeballJntLFT,
            eyeballJntRGT=eyeballJntRGT,
            prefixEyeballAim=prefixEyeballAim,
            positionEyeAimCtrl=positionEyeAimCtrl,
            headCtrlSSNode=headCtrlSSNode,
        )

        secLFT = sc.Build(objectFolMesh=objectFolMesh,
                          nostrilJnt=nostrilLFTJnt,
                          earJnt=earLFTJnt,
                          headCtrl=main.headCtrl,
                          headUpCtrl=main.headUpCtrl,
                          headLowCtrl=main.headLowCtrl,
                          cheekUpJnt=cheekUpLFTJnt,
                          cheekUpOutJnt=cheekUpOutLFTJnt,
                          cheekDownJnt=cheekDownLFTJnt,
                          eyebrowInJnt=eyebrowInLFTJnt,
                          eyebrowMidJnt=eyebrowMidLFTJnt,
                          eyebrowOutJnt=eyebrowOutLFTJnt,
                          browInUpJnt=browInUpLFTJnt,
                          browMidUpJnt=browMidUpLFTJnt,
                          browOutUpJnt=browOutUpLFTJnt,
                          eyelidPinchInJnt=eyelidPinchInLFTJnt,
                          browInDownJnt=browInDownLFTJnt,
                          browMidDownJnt=browMidDownLFTJnt,
                          browOutDownJnt=browOutDownLFTJnt,
                          eyelidPinchOutJnt=eyelidPinchOutLFTJnt,
                          sideRGT=sideRGT,
                          sideLFT=sideLFT,
                          scale=scale,
                          side=sideLFT,
                          directionBrowIn=directionBrowIn,
                          directionBrowMid=directionBrowMid,
                          directionBrowOut=directionBrowOut,
                          directionBrowPinchIn=directionBrowPinchIn,
                          directionBrowPinchOut=directionBrowPinchOut)

        secRGT = sc.Build(objectFolMesh=objectFolMesh,
                          nostrilJnt=nostrilRGTJnt,
                          earJnt=earRGTJnt,
                          cheekUpJnt=cheekUpRGTJnt,
                          cheekUpOutJnt=cheekUpOutRGTJnt,
                          headCtrl=main.headCtrl,
                          headUpCtrl=main.headUpCtrl,
                          headLowCtrl=main.headLowCtrl,
                          cheekDownJnt=cheekDownRGTJnt,
                          eyebrowInJnt=eyebrowInRGTJnt,
                          eyebrowMidJnt=eyebrowMidRGTJnt,
                          eyebrowOutJnt=eyebrowOutRGTJnt,
                          browInUpJnt=browInUpRGTJnt,
                          browMidUpJnt=browMidUpRGTJnt,
                          browOutUpJnt=browOutUpRGTJnt,
                          eyelidPinchInJnt=eyelidPinchInRGTJnt,
                          browInDownJnt=browInDownRGTJnt,
                          browMidDownJnt=browMidDownRGTJnt,
                          browOutDownJnt=browOutDownRGTJnt,
                          eyelidPinchOutJnt=eyelidPinchOutRGTJnt,
                          sideRGT=sideRGT,
                          sideLFT=sideLFT,
                          scale=scale,
                          side=sideRGT,
                          directionBrowIn=directionBrowIn,
                          directionBrowMid=directionBrowMid,
                          directionBrowOut=directionBrowOut,
                          directionBrowPinchIn=directionBrowPinchIn,
                          directionBrowPinchOut=directionBrowPinchOut)

        self.headUpCtrlGrpParent = main.headUpCtrlGrp
        self.headUpCtrl = main.headUpCtrl

        self.headLowCtrl = main.headLowCtrl
        self.jawCtrl = main.jawCtrl

        # CONSTRAINT CHEEK DOWN JNT
        prntConsLFT = mc.parentConstraint(main.headLowCtrl,
                                          main.jawCtrl,
                                          secLFT.cheekDownJntGrp,
                                          mo=1)[0]
        mc.setAttr(prntConsLFT + '.interpType', 2)

        prntConsRGT = mc.parentConstraint(main.headLowCtrl,
                                          main.jawCtrl,
                                          secRGT.cheekDownJntGrp,
                                          mo=1)[0]
        mc.setAttr(prntConsRGT + '.interpType', 2)

        mc.parent(secLFT.eyebrowCtrlGrp, secRGT.eyebrowCtrlGrp,
                  main.headUpCtrl)
        mc.parent(secLFT.earCtrlGrp, secRGT.earCtrlGrp, main.headCtrlGimbal)
        mc.parent(secLFT.follicleTransformAll, secRGT.follicleTransformAll,
                  main.follicleTransformAll, main.headCtrlGrp,
                  main.headCtrlGrp, ctrlFaceGroup)

        self.ctrlFaceGroup = ctrlFaceGroup
        # self.neckCtrlGrp = main.neckCtrlGrp
        self.eyeballAimMainCtrlGrp = main.eyeballAimMainCtrlGrp
        self.eyeballAimMainCtrl = main.eyeballAimMainCtrl
        self.headCtrlGrp = main.headCtrlGrp
예제 #59
0
def initial_pose_joints(ptsList,
                        baseNames,
                        orientOrder,
                        upOrientAxis,
                        primaryAxis="x",
                        upAxis="y"):
    """
    ptsList (list of vec3's): locs for jnts
    baseNames (list of strings): names of joints
    orientOrder (string): "xyz", etc for init jnt orient
    upOrientAxis (string): "yup", etc for init jnt orient
    primaryAxis (string): "x", etc for manual jnt orient
    upAxis (string): "y", etc for manual jnt orient

    """
    # get and pass values for orient order and uporient axis
    # put joint in ref display layer temporarily
    joints = create_joint_chain(ptsList, baseNames, orientOrder, upOrientAxis)

    poseCtrls, poseGrps, octrls, ogrps = create_controls_and_orients_at_joints(
        joints[:-1],
        "sphere",
        primaryAxis,
        "poseCTRL",
        orient=True,
        upAxis=upAxis)
    lockAttrs = ["s", "tx", "ty", "tz"]

    ctrlHierList = zip(poseCtrls, poseGrps, joints, octrls, ogrps)
    poseConstraints = []
    for i in range(len(ctrlHierList)):
        if i > 0:
            oc = cmds.orientConstraint(ctrlHierList[i - 1][2],
                                       ctrlHierList[i][1],
                                       mo=False)[0]
            poseConstraints.append(oc)
        oc1 = cmds.orientConstraint(joints[i], ctrlHierList[i][4], mo=False)
        cmds.delete(oc1)
        const = cmds.parentConstraint(ctrlHierList[i][0],
                                      ctrlHierList[i][2],
                                      mo=True)[0]
        poseConstraints.append(const)

        if i > 0:
            for attr in lockAttrs:
                cmds.setAttr("{0}.{1}".format(ctrlHierList[i][0], attr),
                             l=True)
            cmds.setAttr("{0}.t{1}".format(ctrlHierList[i][0], primaryAxis),
                         l=False)
        if i == 1:
            # unlock the bend attr
            cmds.setAttr("{0}.rx".format(ctrlHierList[i][0]), l=True)
            cmds.setAttr("{0}.ry".format(ctrlHierList[i][0]), l=True)
            cmds.setAttr("{0}.rz".format(ctrlHierList[i][0]), l=True)
            cmds.setAttr("{0}.r{1}".format(ctrlHierList[i][0], upAxis),
                         l=False)
        if i == 0:
            cmds.setAttr("{0}.tx".format(ctrlHierList[i][0]), l=False)
            cmds.setAttr("{0}.ty".format(ctrlHierList[i][0]), l=False)
            cmds.setAttr("{0}.tz".format(ctrlHierList[i][0]), l=False)

    parent_hierarchy_grouped_controls(poseCtrls, poseGrps)

    return (joints, poseCtrls, poseGrps, octrls, ogrps, poseConstraints)
예제 #60
0
    def _stretchy(self):
        """Stretchy attribute and create connections to joints. """

        stretchy_attr = self.ik_controllers["hindleg"] + ".stretchy"
        dist_dict = {}

        stretchy_grp = mc.group(n='{}_{}_stretchy_{}_{}'.format(self.side, self.name, self.suffix, self.instance_num),
                                em=True, p=self.mod_dict["IKcontrol"])
        mc.hide(stretchy_grp)

        start_loc = mc.spaceLocator(n=self.joint_dict["hipSPRING"].replace('jnt', 'loc'))[0]
        end_loc = mc.spaceLocator(n=self.ik_controllers["footIkOffset"].replace('ctl', 'loc'))[0]

        hip_loc_static = mc.spaceLocator(n=self.joint_dict["hipFINAL"].replace('_jnt', 'Static_loc'))[0]
        knee_loc_static = mc.spaceLocator(n=self.joint_dict["kneeFINAL"].replace('_jnt', 'Static_loc'))[0]
        foot_loc_static = mc.spaceLocator(n=self.joint_dict["footFINAL"].replace('_bnd', 'Static_loc'))[0]
        ball_loc_static = mc.spaceLocator(n=self.joint_dict["ballFINAL"].replace('_bnd', 'Static_loc'))[0]

        mc.parentConstraint(self.ik_controllers["footIkOffset"], end_loc, n=end_loc.replace("loc", "prc"))
        mc.parentConstraint(self.joint_dict["hipSPRING"], start_loc, n=start_loc.replace("loc", "prc"))

        del_hip = mc.parentConstraint(self.joint_dict["hipSPRING"], hip_loc_static)
        del_knee = mc.parentConstraint(self.joint_dict["kneeSPRING"], knee_loc_static)
        del_foot = mc.parentConstraint(self.joint_dict["footSPRING"], foot_loc_static)
        del_ball = mc.parentConstraint(self.joint_dict["ballSPRING"], ball_loc_static)

        [mc.delete(x) for x in [del_hip, del_knee, del_foot, del_ball]]

        for i in [start_loc, end_loc, hip_loc_static, knee_loc_static, foot_loc_static, ball_loc_static]:
            mc.parent(i, stretchy_grp)

        dist_node = mc.createNode('distanceBetween')
        for i in ["hip", "knee", "foot"]:
            dist = mc.createNode('distanceBetween', n=self.joint_dict[i + "FINAL"].replace('_jnt', 'Static_dst'))
            dist_dict[i] = dist

        dist_pma = mc.createNode('plusMinusAverage', n=self.joint_dict["footFINAL"].replace('_bnd', 'Static_pma'))
        mult1 = mc.createNode('multiplyDivide', n=stretchy_grp.replace("_grp", "Distance_mult"))
        cond1 = mc.createNode('condition', n=mult1.replace('mult', 'cond'))
        cond2 = mc.createNode('condition',  n=cond1.replace('Distance', 'On'))

        mc.connectAttr('{}.worldMatrix'.format(start_loc), '{}.inMatrix1.'.format(dist_node))
        mc.connectAttr('{}.worldMatrix'.format(end_loc), '{}.inMatrix2.'.format(dist_node))
        mc.connectAttr('{}.worldMatrix'.format(hip_loc_static), '{}.inMatrix1.'.format(dist_dict["hip"]))
        mc.connectAttr('{}.worldMatrix'.format(knee_loc_static), '{}.inMatrix2.'.format(dist_dict["hip"]))
        mc.connectAttr('{}.worldMatrix'.format(knee_loc_static), '{}.inMatrix1.'.format(dist_dict["knee"]))
        mc.connectAttr('{}.worldMatrix'.format(foot_loc_static), '{}.inMatrix2.'.format(dist_dict["knee"]))
        mc.connectAttr('{}.worldMatrix'.format(foot_loc_static), '{}.inMatrix1.'.format(dist_dict["foot"]))
        mc.connectAttr('{}.worldMatrix'.format(ball_loc_static), '{}.inMatrix2.'.format(dist_dict["foot"]))

        mc.connectAttr('{}.distance'.format(dist_dict["hip"]), '{}.input1D[0]'.format(dist_pma))
        mc.connectAttr('{}.distance'.format(dist_dict["knee"]), '{}.input1D[1]'.format(dist_pma))
        mc.connectAttr('{}.distance'.format(dist_dict["foot"]), '{}.input1D[2]'.format(dist_pma))

        mc.setAttr('{}.operation'.format(mult1), 2)
        mc.connectAttr('{}.output1D'.format(dist_pma), '{}.input2.input2X.'.format(mult1))
        mc.connectAttr('{}.distance'.format(dist_node), '{}.input1.input1X.'.format(mult1))

        mc.setAttr('{}.operation'.format(cond1), 3)
        mc.connectAttr('{}.output.outputX'.format(mult1), '{}.firstTerm.'.format(cond1))
        mc.setAttr('{}.secondTerm.'.format(cond1), 1)
        mc.connectAttr('{}.output.outputX'.format(mult1), '{}.colorIfTrue.colorIfTrueR.'.format(cond1))

        mc.setAttr('{}.secondTerm'.format(cond2), 1)
        mc.connectAttr('{}.outColor.outColorR'.format(cond1), '{}.colorIfTrue.colorIfTrueR.'.format(cond2))
        mc.connectAttr(stretchy_attr, '{}.firstTerm.'.format(cond2))
        mc.connectAttr('{}.outColor.outColorR'.format(cond2), '{}.scale.scaleZ.'.format(self.joint_dict["hipIK"]))
        mc.connectAttr('{}.outColor.outColorR'.format(cond2), '{}.scale.scaleZ.'.format(self.joint_dict["kneeIK"]))