def mirror(objects): '''check which side to mirror''' for obj in objects: if obj.find(cn.type['r']) != -1: side = cn.type['r'], cn.type['l'] if obj.find(cn.type['l']) != -1: side = cn.type['l'], cn.type['r'] if pymel.nodeType(obj) == 'joint': pymel.mirrorJoint(obj, mirrorYZ=True, mb=True, sr=(side)) if obj.find(cn.type['ctrl']) != -1: d = pymel.duplicate(obj) n = obj.replace(side[0],side[1]) pymel.rename(d, n) if d[0].find('IKFK')== -1: d[0].scaleX.set(-1) #d[0].scaleY.set(-1) pymel.makeIdentity(d[0], a=True) pymel.delete(obj, ch=True)
def createJoints(self): points = [ pm.PyNode(guide).getRotatePivot(space='world') for guide in self.starter_Shoulder ] self.shoulder_chain = Joint.Joint.point_base( *points, name='{Side}__{Basename}'.format(**self.nameStructure), chain=True, padding=2) self.clavicule_joint, self.shoulder_joint, = self.shoulder_chain.joints pm.PyNode(self.clavicule_joint).rename( '{Side}__{Basename}_{Parts[0]}_END'.format(**self.nameStructure)) pm.PyNode(self.shoulder_joint).rename( '{Side}__{Basename}_{Parts[1]}_END'.format(**self.nameStructure)) adb.AutoSuffix(self.shoulder_chain.joints) ## orient joint if self.side == NC.RIGTH_SIDE_PREFIX: mirror_chain_1 = pm.mirrorJoint(self.clavicule_joint, mirrorYZ=1) Joint.Joint(mirror_chain_1).orientAxis = '-Y' mirror_chain_3 = pm.mirrorJoint(mirror_chain_1[0], mirrorBehavior=1, mirrorYZ=1) pm.delete(mirror_chain_1, self.clavicule_joint) self.shoulder_chain = Joint.Joint(mirror_chain_3) self.clavicule_joint, self.shoulder_joint, = self.shoulder_chain.joints pm.PyNode(self.clavicule_joint).rename( '{Side}__{Basename}_{Parts[0]}_END'.format( **self.nameStructure)) pm.PyNode(self.shoulder_joint).rename( '{Side}__{Basename}_{Parts[1]}_END'.format( **self.nameStructure)) adb.AutoSuffix(self.shoulder_chain.joints) else: self.shoulder_chain.orientAxis = '-Y' pm.parent(self.clavicule_joint, self.shoulder_MOD.OUTPUT_GRP) self.shoulderOffsetGrp = adb.makeroot_func(self.clavicule_joint, suff='Offset', forceNameConvention=True) self.shoulder_chain.radius = self.config['JOINTS']["Result_JNT"][ 'radius'] self.nameStructure['Suffix'] = NC.VISRULE moduleBase.ModuleBase.setupVisRule( [self.clavicule_joint], self.shoulder_MOD.VISRULE_GRP, '{Side}__{Basename}_Clavicule_JNT__{Suffix}'.format( **self.nameStructure), True) return self.shoulder_chain.joints
def generateHands(self, _wristTwist=False): # TODO: orient hand bone away from elbow self.r_hand = [] self.r_thumbJoints = [] self.r_indexJoints = [] self.r_midJoints = [] self.r_ringJoints = [] self.r_pinkyJoints = [] delta = self.loc_r_hand.t.get() localPos = self.loc_r_hand.localPosition.get() self.r_hand = pm.joint(p=delta + localPos, n='bind_r_hand') pm.parent(self.r_hand, self.r_armJoints[-1]) self.r_hand.jointOrient.set(0, 0, 0) self.r_thumbJoints = self.generateFinger(self.handLocators[1], self.handLocators[2], 'thumb', 'r', 1) self.r_indexJoints = self.generateFinger(self.handLocators[3], self.handLocators[4], 'index', 'r') self.r_midJoints = self.generateFinger(self.handLocators[5], self.handLocators[6], 'mid', 'r') self.r_ringJoints = self.generateFinger(self.handLocators[7], self.handLocators[8], 'ring', 'r') self.r_pinkyJoints = self.generateFinger(self.handLocators[9], self.handLocators[10], 'pinky', 'r') pm.parent(self.r_thumbJoints[0], self.r_hand) pm.parent(self.r_indexJoints[0], self.r_hand) pm.parent(self.r_midJoints[0], self.r_hand) pm.parent(self.r_ringJoints[0], self.r_hand) pm.parent(self.r_pinkyJoints[0], self.r_hand) self.r_arm_ikHandle = pm.ikHandle(n='ik_r_arm', sj=self.r_armJoints[1], ee=self.r_armJoints[3], sol='ikRPsolver') self.l_armJoints = pm.mirrorJoint(self.r_armJoints[0], mb=1, mxy=1, sr=('_r_', '_l_')) self.l_arm_ikHandle = pm.ikHandle(n='ik_l_arm', sj=self.l_armJoints[1], ee=self.l_armJoints[3], sol='ikRPsolver') self.l_hand = self.l_armJoints[4] self.l_thumbJoints = self.l_armJoints[5:8] self.l_indexJoints = self.l_armJoints[8:12] self.l_midJoints = self.l_armJoints[12:16] self.l_ringJoints = self.l_armJoints[16:20] self.l_pinkyJoints = self.l_armJoints[20:24] if _wristTwist: twistEnds = [] twistEnds.append(self.l_armJoints[2]) twistEnds.append(self.l_armJoints[3]) self.generateTwistSystem(twistEnds, self.l_hand) twistEnds = [] twistEnds.append(self.r_armJoints[2]) twistEnds.append(self.r_armJoints[3]) self.generateTwistSystem(twistEnds, self.r_hand, True)
def generateLegs(self): self.r_legJoints = [] self.generateLimb('l', 'r_leg', self.legLocators, self.r_legJoints, self.spineJoints[len(self.spineJoints) - 1], False) self.r_footJoints = [] self.generateLimb('l', 'r_foot', self.footLocators, self.r_footJoints, self.r_legJoints[-1], False) l_legJoints_raw = pm.mirrorJoint(self.r_legJoints[0], mb=1, mxy=1, sr=('r_', 'l_')) i = 2 self.l_legJoints = l_legJoints_raw[:i + 1] l_footJointsRaw = l_legJoints_raw[2 + 1:] self.l_footJoints = [] for i in l_footJointsRaw: if pm.nodeType(i) == 'joint': self.l_footJoints.append(i) self.l_leg_ikHandle = pm.ikHandle(n='ik_l_leg', sj=self.l_legJoints[0], ee=self.l_legJoints[-1], sol='ikRPsolver') self.r_leg_ikHandle = pm.ikHandle(n='ik_r_leg', sj=self.r_legJoints[0], ee=self.r_legJoints[-1], sol='ikRPsolver')
def generateLimb(self, _limbSide, _limbName, _limbLocators, _limbJtArray, _rootJt, _mirror=True, _prefix='bind'): # Pass this the name of the limb, eg. 'r_arm' # Pass it the list of locators created for that limb # Pass it an empty list, and it will add that limbs bones to the list # Generate limb bones ------------------------------------------------- for i in _limbLocators: delta = i.t.get() trans = i.localPosition.get() splitLocName = str(_limbLocators[_limbLocators.index(i)])[3:] newJt = pm.joint(p=(trans + delta), n=_prefix + splitLocName) _limbJtArray.append(newJt) pm.parent(w=1) # Orient limb bones -------------------------------------------------- i = 0 while i < len(_limbJtArray): if i < len(_limbJtArray) - 1: # TODO: work out why the reorienting shit doesn't work in the # aimAt method _limbJtArray[i].jointOrient.set([0, 0, 0]) self.aimAt(_limbJtArray[i], _limbJtArray[i + 1]) rotVal = _limbJtArray[i].rotate.get() _limbJtArray[i].jointOrient.set(rotVal) _limbJtArray[i].r.set([0, 0, 0]) else: _limbJtArray[i].jointOrient.set([0, 0, 0]) i = i + 1 # Parent the joints --------------------------------------------------- j = 0 while j < len(_limbJtArray): if j < len(_limbJtArray) - 1: pm.parent(_limbJtArray[j + 1], _limbJtArray[j]) j = j + 1 pm.parent(_limbJtArray[0], _rootJt) _limbJtArray[-1].jointOrient.set([0, 0, 0]) if _mirror: pm.mirrorJoint(_limbJtArray[0], mb=1, mxy=1, sr=('_r_', '_' + _limbSide + '_'))
def mirrorJnt(revjntnamelist, sfx, sfx_r): sfx = "_L" jntnamelistL = [] revjntnamelistL = [] for jnt in jntnamelist[0:-1]: newname = pm.rename(jnt, str(jnt) + sfx) jntnamelistL.append(newname) for jnt in revjntnamelist: newname = pm.rename(jnt, str(jnt) + sfx) revjntnamelistL.append(newname) pm.mirrorJoint(pm.ls(revjntnamelistL[0]), mirrorBehavior=True, searchReplace=(sfx, sfx_r)) pm.mirrorJoint(pm.ls(jntnamelistL[0]), mirrorBehavior=True, searchReplace=(sfx, sfx_r))
def mirror_joint_pressed(self, sender, option): src = option['search'].text() re = option['replace'].text() if sender == self.ui.mj_change_btn: option['search'].setText(re) option['replace'].setText(src) if sender == self.ui.mj_mirror_btn: joint_selected = pm.ls(os=True, type='joint') pm.mirrorJoint(joint_selected, mirrorBehavior=option['fnBehave'].isChecked(), mirrorXY=option['acrossXY'].isChecked(), mirrorXZ=option['acrossXZ'].isChecked(), mirrorYZ=option['acrossYZ'].isChecked(), searchReplace=(src, re))
def buildJoints(): orientSkeleton() # Set twist translations for jnt in pm.ls('*Twist_R', type='joint'): jnt.translateY.set(0) jnt.translateZ.set(0) # Set control joint translations matchCtrlTranslations() # Mirror joints for jnt in 'Eye_R', 'CTRLIKArm_R', 'CTRLIKLeg_R', 'CTRLPoleArm_R', 'CTRLPoleLeg_R': pm.mirrorJoint(jnt, searchReplace=('_R', '_L')) for jnt in 'Clavicle_R', 'Hip_R', 'BreastBase_R', 'ButtockBase_R': pm.mirrorJoint(jnt, searchReplace=('_R', '_L'), mirrorBehavior=True)
def _mirrorJoint(self , list = None): ''' cerate mirror joint @list : list , is list ''' if list[0].name().find('R') is -1 : mirrorName = [pm.mirrorJoint(a , mirrorYZ = 1 ,mirrorBehavior =1 ,searchReplace =('L' , 'R'))[0] for a in list] pm.select(mirrorName) mirrorNameList = pm.selected() OpenMaya.MGlobal_clearSelectionList() return mirrorNameList if list[0].name().find('L') is -1 : mirrorName = [pm.mirrorJoint(a , mirrorYZ = 1 ,mirrorBehavior =1 ,searchReplace =('R' , 'L'))[0] for a in list] pm.select(mirrorName) mirrorNameList = pm.selected() OpenMaya.MGlobal_clearSelectionList() return mirrorNameList
def mirrorRotate(transforms=None, axis=pcfg.default_mirror_axis, swap=None): """ Mirrors the given transforms across the given axis set up to be used as a mirror rotate transform. Args: transforms (list): Transforms to mirror across given axis. axis (string): Name of axis to mirror across. swap (list): Words to search and replace. Will search for first index, and replace with second index. Returns: (list): Joints that were mirrored. Note that all their children get mirrored as well. """ mirrored_transforms = [] transforms = myu.validateSelect(transforms) options = { 'mxy': False, 'myz': False, 'mxz': False, 'mb': True, 'sr': swap } if axis == 'x': options['myz'] = True elif axis == 'y': options['mxz'] = True elif axis == 'z': options['mxy'] = True else: pm.error('No valid axis given. Pick "x", "y", or "z".') for transform in transforms: name = transform.nodeName() if not swap: if name.endswith(pcfg.left_suffix): options['sr'] = [pcfg.left_suffix, pcfg.right_suffix] elif name.endswith(pcfg.right_suffix): options['sr'] = [pcfg.right_suffix, pcfg.left_suffix] else: options['sr'] = ['', ''] mirrored_joint = pm.mirrorJoint(transform, **options)[0] mirrored_joint = pm.PyNode(mirrored_joint) mirrored_transforms.append(mirrored_joint) joint_parent = mirrored_joint.getParent() if joint_parent: pm.parent(mirrored_joint, w=True) parent([mirrored_joint, joint_parent]) return mirrored_transforms
def mirrorJoint(self, metaJoint): """ Mirror the meta joint on YZ axis @param metaJoint: The meta joint being mirrored """ mirrorKwargs = {"mirrorYZ": True} if self.mirrorMode == "Behaviour": mirrorKwargs["mirrorBehavior"] = True mirroredJoint = pm.mirrorJoint(metaJoint.pynode, **mirrorKwargs)[0] metaJoint.snap(mirroredJoint) libUtilities.freeze_rotation(metaJoint.pynode) pm.delete(mirroredJoint)
def mirror_joints(mir_xy=False, mir_yz=True, mir_xz=False, search='lt', replace='rt'): selection = pm.ls(sl=True, type='transform') for each in selection: joint_chain = pm.ls(each, dag=True) if pm.nodeType(joint_chain[0]) == 'joint': pm.mirrorJoint(joint_chain[0], mirrorBehavior=True, mirrorXY=mir_xy, mirrorYZ=mir_yz, mirrorXZ=mir_xz, searchReplace=[search, replace]) pm.select(cl=True) else: print( "You tried to mirror an object that isn't a joint. This tool only functions on joints." )
def _mirror( topJoint ): grp = pm.group( topJoint ) grp.setRotatePivot( (0,0,0) ) original = pm.select( grp.getChildren()[0], r=1) mirrored = [ Joint(m) for m in pm.mirrorJoint( mirrorYZ=1, mirrorBehavior=1 ) ] pm.parent( mirrored[0], w=1 ) pm.delete( original, grp ) for m in mirrored: m.rename( m[:-1] ) return mirrored
def mirrorRig(side): selection = pm.ls(sl=1) if len(selection): anim_root = selection[0] parent_anim_root = anim_root.getParent() name = anim_root.name().replace(side + '_', 'r_') dup = None if side == 'l': dup = pm.duplicate() pm.parent(dup, 'anim_spine4') mirrored = pm.mirrorJoint(mirrorYZ=1, mirrorBehavior=1, searchReplace=("l_", "r_")) search = pm.ls(parent_anim_root.name().replace('l_', 'r_')) if len(search): pm.parent(mirrored[0], search[0]) pm.delete(dup) pm.rename(mirrored[0], name) mirrorNodes(anim_root, side) elif side == 'r': # implement pass
def mirrorJointsYZ(*args): pm.mirrorJoint(myz = True, mb = True, sr = ("lt_", "rt_"))
def build_skeleton(side=None, joint_list=None): pm.select(deselect=True) armJointNames = [ '_scapula_jnt', '_shoulder_jnt', '_elbow_jnt', '_hand_jnt', '_hand_end_jnt' ] legJointNames = [ '_hip_jnt', '_knee_jnt', '_ankle_jnt', '_foot_back_jnt', '_foot_jnt', '_foot_end_jnt' ] armMatches = filter(lambda s: 'arm' in str(s), joint_list) legMatches = filter(lambda s: 'leg' in str(s), joint_list) spineMatches = filter(lambda s: 'spine' in str(s), joint_list) if len(armMatches) > 1: # create joints for i in range(len(joint_list)): pm.joint(name=side + armJointNames[i], p=(pm.PyNode(joint_list[i]).getTranslation('world'))) # orient joints for i in range(len(joint_list)): pm.select(side + armJointNames[i]) pm.joint(e=True, oj='yxz', secondaryAxisOrient='zup', ch=True, zso=True) # mirror joints pm.select(side + armJointNames[0]) pm.mirrorJoint(mirrorYZ=True, mirrorBehavior=True, searchReplace=("L_", "R_")) elif len(legMatches) > 1: # create joints for i in range(len(joint_list)): print joint_list[i] if not joint_list[i] == side + '_leg_3_rigHelper': pm.joint(name=side + legJointNames[i], p=(pm.PyNode(joint_list[i]).getTranslation('world'))) # orient joints for i in range(len(joint_list)): if not legJointNames[i] == '_foot_back_jnt': pm.select(side + legJointNames[i]) pm.joint(e=True, oj='yxz', secondaryAxisOrient='zup', ch=True, zso=True) # mirror joints pm.select(side + legJointNames[0]) pm.mirrorJoint(mirrorYZ=True, mirrorBehavior=True, searchReplace=("L_", "R_")) elif len(spineMatches) > 1: # spine names spineNameList = [ 'COG_jnt', 'spine01_jnt', 'spine02_jnt', 'spine03_jnt', 'spine04_jnt', 'spine05_jnt', 'spine06_jnt', 'spine07_jnt', 'spine08_jnt', 'spine09_jnt', 'spine10_jnt' ] spineTopNameList = [ 'head_end_jnt', 'head_jnt', 'neck_jnt', 'chest_jnt' ] # create joints, we discard the last one, so the head is not created for i in range(int(len(joint_list) - 1)): pm.joint(name=spineNameList[i], p=(pm.PyNode(joint_list[i]).getTranslation('world'))) # orient joints for i in range(int(len(joint_list) - 1)): pm.select(spineNameList[i]) pm.joint(e=True, oj='yxz', secondaryAxisOrient='zup', ch=True, zso=True) # rename the last 4 joints to match the rigging naming convention pm.select('COG_jnt') spineJointList = pm.listRelatives(ad=True, c=True) for i in range(4): pm.rename(spineJointList[i], spineTopNameList[i])
def createJoints(): points = [ pm.PyNode(guide).getRotatePivot(space='world') for guide in self.starter_Foot ] self.foot_chain = Joint.Joint.point_base( *points, name='{Side}__{Basename}'.format(**self.nameStructure), chain=True, padding=2) self.footAnkle_joint, self.footBall_joint, self.footToes_joint, self.footHeel_joint, = self.foot_chain.joints # Parenting the joints pm.parent(self.footHeel_joint, self.footAnkle_joint) pm.PyNode(self.footAnkle_joint).rename( '{Side}__{Basename}_{Parts[0]}_END'.format( **self.nameStructure)) pm.PyNode(self.footBall_joint).rename( '{Side}__{Basename}_{Parts[1]}_END'.format( **self.nameStructure)) pm.PyNode(self.footToes_joint).rename( '{Side}__{Basename}_{Parts[2]}_END'.format( **self.nameStructure)) pm.PyNode(self.footHeel_joint).rename( '{Side}__{Basename}_{Parts[3]}_END'.format( **self.nameStructure)) adb.AutoSuffix(self.foot_chain.joints) pm.parent(self.footAnkle_joint, self.Foot_MOD.OUTPUT_GRP) self.footOffsetGrp = self.createPivotGrps( self.footAnkle_joint, name='{Basename}_Offset'.format(**self.nameStructure)) ## orient joint if self.side == NC.RIGTH_SIDE_PREFIX: mirror_chain_1 = pm.mirrorJoint(self.footAnkle_joint, mirrorYZ=1) mirror_chain_3 = pm.mirrorJoint(mirror_chain_1[0], mirrorBehavior=1, mirrorYZ=1) pm.delete(self.footAnkle_joint, mirror_chain_1) self.foot_chain = Joint.Joint(mirror_chain_3) self.footAnkle_joint, self.footBall_joint, self.footToes_joint, self.footHeel_joint = self.foot_chain.joints pm.PyNode(self.footAnkle_joint).rename( '{Side}__{Basename}_{Parts[0]}_END'.format( **self.nameStructure)) pm.PyNode(self.footBall_joint).rename( '{Side}__{Basename}_{Parts[1]}_END'.format( **self.nameStructure)) pm.PyNode(self.footToes_joint).rename( '{Side}__{Basename}_{Parts[2]}_END'.format( **self.nameStructure)) pm.PyNode(self.footHeel_joint).rename( '{Side}__{Basename}_{Parts[3]}_END'.format( **self.nameStructure)) adb.AutoSuffix(self.foot_chain.joints) pm.makeIdentity(self.footOffsetGrp.getChildren(), n=0, t=1, apply=True, pn=1) adb.makeroot_func(self.footOffsetGrp, suff='Output', forceNameConvention=1) Transform(self.footOffsetGrp).pivotPoint = Transform( self.footAnkle_joint).worldTrans self.foot_chain.radius = 1.0 self.nameStructure['Suffix'] = NC.VISRULE moduleBase.ModuleBase.setupVisRule( [self.footAnkle_joint], self.Foot_MOD.VISRULE_GRP, '{Side}__{Basename}_JNT__{Suffix}'.format( **self.nameStructure), True) return self.foot_chain.joints
def build(): side = 'L' armHelpersList = [] shoulderHelpersList = [] legHelpersList = [] spineHelpersList = [] footHelperList = [] neckHelperList = [] headHelperList = [] # spine helper list generation for i in range(len(pm.ls('M_spine*_rigHelper'))-2): spineHelpersList.append('M_spine%s_rigHelper' %str(i)) # head helper list generation for i in reversed(range(len(pm.ls('M_spine*_rigHelper')))): if i > 3: headHelperList.append('M_spine%s_rigHelper' %str(i)) headHelperList.reverse() # neck helper list generation for i in range(len(pm.ls('M_spine*_rigHelper'))): if i > 2 and i < 5: neckHelperList.append('M_spine%s_rigHelper' %str(i)) armHelpersList = pm.ls(side + '_arm1_rigHelper', side + '_arm2_rigHelper', side + '_arm3_rigHelper') shoulderHelpersList = (side + '_arm0_rigHelper', side + '_arm1_rigHelper') legHelpersList = pm.ls(side + '_leg*rigHelper') handHelperListLeft = (side + '_arm3_rigHelper', side + '_arm4_rigHelper') handHelperListRight = ('R' + '_arm3_rigHelper', side + '_arm4_rigHelper') footHelperList = pm.ls(side + '_leg_2_rigHelper', side + '_leg_4_rigHelper', side + '_leg_5_rigHelper') armJnts = generateJoints(side=side, baseName='arm', helperList=armHelpersList, discardLast=0) legJnts = generateJoints(side=side, baseName='leg', helperList=legHelpersList, discardLast=3) handJnts = generateJoints(side=side, baseName='hand', helperList=handHelperListLeft, discardLast=0) footJnts = generateJoints(side=side, baseName='foot', helperList=footHelperList, discardLast=0) spineJnts = generateJoints(side='M', baseName='spine', helperList=spineHelpersList, discardLast=0) neckJnts = generateJoints(side='M', baseName='neck', helperList=neckHelperList, discardLast=0) headJnts = generateJoints(side='M', baseName='head', helperList=headHelperList, discardLast=0) # orient joints # for i1, i2, i3, i4, i5. i6, i7 in zip(spineJnts, armJnts, legJnts, handJnts, footJnts, neckJnts, headJnts): # pm.select(jnt) # pm.joint(e=True, oj='yxz', secondaryAxisOrient='zup', ch=True, zso=True) for jnt in spineJnts: pm.select(jnt) pm.joint(e=True, oj='yxz', secondaryAxisOrient='zup', ch=True, zso=True) for jnt in armJnts: pm.select(jnt) pm.joint(e=True, oj='yxz', secondaryAxisOrient='zup', ch=True, zso=True) for jnt in legJnts: pm.select(jnt) pm.joint(e=True, oj='yxz', secondaryAxisOrient='zup', ch=True, zso=True) for jnt in handJnts: pm.select(jnt) pm.joint(e=True, oj='yxz', secondaryAxisOrient='zup', ch=True, zso=True) for jnt in footJnts: pm.select(jnt) pm.joint(e=True, oj='yxz', secondaryAxisOrient='zup', ch=True, zso=True) for jnt in neckJnts: pm.select(jnt) pm.joint(e=True, oj='yxz', secondaryAxisOrient='zup', ch=True, zso=True) for jnt in headJnts: pm.select(jnt) pm.joint(e=True, oj='yxz', secondaryAxisOrient='zup', ch=True, zso=True) # mirror joints for jnt in [armJnts[0], legJnts[0], footJnts[0], handJnts[0]]: pm.select(jnt) pm.mirrorJoint(mirrorYZ=True, mirrorBehavior=True, searchReplace=("L_", "R_"))
def bipedLimb_pack( self, ctrlSize=1.0, FKIKMode='FKIK', mirror=True, numOfSegs=6, bendy=True, mode='arm', *args ): try:# if in UI mode, get number of joints from UI ctrlSize = pm.floatSliderGrp( self.spineSizeF, q=True, value=True) selectedMode = pm.radioCollection( self.characterModeRC, q=True, select=True) mode = pm.radioButton( selectedMode, q=True, label=True ).lower() numOfSegs = pm.intSliderGrp( self.numOfJntsIS, q=True, value=True) bendy = pm.checkBox( self.bendyCB, q=True, value=True ) except: pass bipedLimbJnts = [] FKIKstuff = [] OSbipedLimbJnts = [] OSFKIKstuff = [] #============================================================================ # find some info for naming and control sizes side = self.BipedLimbInitJnts[0].name()[0] limbLen = Dist( self.BipedLimbInitJnts[0] , self.BipedLimbInitJnts[1] ) otherSide = 'R' if side == 'R': otherSide = 'L' #============================================================================ # getting info from selected objects if mode == 'arm': firstInitJnt = self.BipedLimbInitJnts[0] secondInitJnt = self.BipedLimbInitJnts[1] thirdInitJnt = self.BipedLimbInitJnts[2] forthInitJnt = self.BipedLimbInitJnts[3] armPos = self.worldPos( firstInitJnt ) elbowPos = self.worldPos( secondInitJnt ) handPos = self.worldPos( thirdInitJnt ) handEndPos = self.worldPos( forthInitJnt ) elif mode == 'leg': firstInitJnt = self.BipedLimbInitJnts[0] secondInitJnt = self.BipedLimbInitJnts[1] thirdInitJnt = self.BipedLimbInitJnts[2] heelInitJnt = self.BipedLimbInitJnts[3] forthInitJnt = self.BipedLimbInitJnts[4] toeEndInitJnt = self.BipedLimbInitJnts[5] outsideInitJnt = self.BipedLimbInitJnts[6] insideInitJnt = self.BipedLimbInitJnts[7] upLegPos = self.worldPos( firstInitJnt ) kneePos = self.worldPos( secondInitJnt ) anklePos = self.worldPos( thirdInitJnt ) ballPos = self.worldPos( forthInitJnt ) toeEndPos = self.worldPos( toeEndInitJnt ) heelPos = self.worldPos( heelInitJnt ) outsidePos = self.worldPos( outsideInitJnt ) insidePos = self.worldPos( insideInitJnt ) #============================================================================ # create arm or leg joints if mode == 'arm': pm.select ( cl = True ) upLimbJnt =pm.joint ( p = armPos , name = ( side + "_upArm_jnt" ) ) midLimbJnt = pm.joint ( p = elbowPos , name = ( side + "_elbow_jnt" ) ) pm.joint( upLimbJnt, e=True, zso=True, oj='xyz', sao='yup') butLimbJnt = pm.joint ( p = handPos , name = ( side + "_hand_jnt" ) ) pm.joint( midLimbJnt, e=True, zso=True, oj='xyz', sao='yup') handEndJnt = pm.joint ( p = handEndPos , name = ( side + "_hand_end_jnt" ) ) pm.joint( butLimbJnt, e=True, zso=True, oj='xyz', sao='yup') bipedLimbJnts = [ upLimbJnt, midLimbJnt, butLimbJnt, handEndJnt ] elif mode == 'leg': pm.select ( cl = True ) upLimbJnt =pm.joint ( p = upLegPos , name = ( side + "_upLeg_jnt" ) ) midLimbJnt = pm.joint ( p = kneePos , name = ( side + "_knee_jnt" ) ) pm.joint( upLimbJnt, e=True, zso=True, oj='xzy', sao='xup') butLimbJnt = pm.joint ( p = anklePos , name = ( side + "_ankle_jnt" ) ) pm.joint( midLimbJnt, e=True, zso=True, oj='xzy', sao='xup') ballJnt = pm.joint ( p = ballPos , name = ( side + "_ball_jnt" ) ) pm.joint( butLimbJnt, e=True, zso=True, oj='xzy', sao='xup') toeEndJnt = pm.joint ( p = toeEndPos , name = ( side + "_toeEnd_jnt" ) ) pm.joint( ballJnt, e=True, zso=True, oj='xzy', sao='xup') pm.select(clear=True) heelJnt = pm.joint ( p = heelPos , name = ( side + "_heel_jnt" ) ) pm.select(clear=True) outsideJnt = pm.joint ( p = outsidePos , name = ( side + "_outside_jnt" ) ) pm.select(clear=True) insideJnt = pm.joint ( p = insidePos , name = ( side + "_inside_jnt" ) ) bipedLimbJnts = [ upLimbJnt, midLimbJnt, butLimbJnt, ballJnt, toeEndJnt, heelJnt,outsideJnt,insideJnt ] #============================================================================ # find the pole vector position # orient joints and set preferred angle # find pole vector position PVposition = FindPVposition( objs= (upLimbJnt, midLimbJnt, butLimbJnt) ) if mode == 'arm': # arm mode ................................................. if PVposition: # arm is bent! # create and position aim locator aimLoc = pm.spaceLocator() PVposition = FindPVposition( objs= (upLimbJnt, midLimbJnt, butLimbJnt) ) aimLoc.translate.set( PVposition ) else: # arm is not bent! # create and position aim locator aimLoc = pm.spaceLocator() pm.parent( aimLoc, midLimbJnt ) pm.makeIdentity( aimLoc, t=True, r=True, s=True ) aimLoc.translateZ.set( -limbLen*1.5 ) pm.parent( aimLoc, w=True) aimLoc.rotate.set( 0,0,0 ) # rotate the aim to match the rotation of the arm pm.delete( pm.aimConstraint( midLimbJnt, aimLoc, worldUpType="object", aimVector=(1,0,0), upVector=(0,1,0), worldUpObject= butLimbJnt ) ) # orient joints according to aim locator for jnt in ( upLimbJnt, midLimbJnt, butLimbJnt ): OriJnt( jnt=jnt, upAim=aimLoc , aimAxis='-z' ) # set preferred angle midLimbJnt.preferredAngleY.set( -90 ) poleVectorTransform = None footRotate = None elif mode == 'leg': # leg mode ................................................. if PVposition: # leg is bent! # create and position aim locator aimLoc = pm.spaceLocator() PVposition = FindPVposition( objs= (upLimbJnt, midLimbJnt, butLimbJnt) ) aimLoc.translate.set( PVposition ) else: # leg is not bent! PVposition = self.PVbyToeJnt( upLimbJnt, midLimbJnt, toeEndJnt ) # create and position aim locator aimLoc = pm.spaceLocator() aimLoc.translate.set( PVposition ) # position aim in front of the foot # rotate the aim to match the rotation of the arm pm.delete( pm.aimConstraint( midLimbJnt, aimLoc, worldUpType="object", aimVector=(1,0,0), upVector=(0,1,0), worldUpObject= butLimbJnt ) ) # orient joints according to aim locator for jnt in bipedLimbJnts[:-4]: OriJnt( jnt=jnt, upAim=aimLoc , aimAxis='-y' ) # set preferred angle midLimbJnt.preferredAngleZ.set( 90 ) # find foot Y rotation to pass to rigIK and rigFKIK footRotateY = ProjectedAim( objs=( butLimbJnt , toeEndJnt ) ) footRotate = ( 0, footRotateY, 0 ) # pole vector transformations to be passed to rigIK and rigFKIK PVposition = pm.xform( aimLoc, q=True, ws=True, t=True ) PVrotation = pm.xform( aimLoc, q=True, ws=True, ro=True ) poleVectorTransform = ( PVposition, PVrotation ) #============================================================================ # If mirror is ON if mirror == True: # mirror joints OSjnts = pm.mirrorJoint( upLimbJnt, mirrorYZ=True , mirrorBehavior=True, searchReplace=( "L", "R" ) ) if mode=='leg': OSjnts.append( pm.mirrorJoint( heelJnt, mirrorYZ=True , mirrorBehavior=True, searchReplace=( "L", "R" ) ) ) OSjnts.append( pm.mirrorJoint( outsideJnt, mirrorYZ=True , mirrorBehavior=True, searchReplace=( "L", "R" ) ) ) OSjnts.append( pm.mirrorJoint( insideJnt, mirrorYZ=True , mirrorBehavior=True, searchReplace=( "L", "R" ) ) ) OSbipedLimbJnts = pm.ls( OSjnts ) # transforms of mirrored pole vector OSaimLoc = MirrorObjLikeJnt( aimLoc )[0] OSPVposition = pm.xform( OSaimLoc, q=True, ws=True, t=True ) OSPVrotation = pm.xform( OSaimLoc, q=True, ws=True, ro=True ) OSpoleVectorTransform = ( OSPVposition, OSPVrotation ) # transforms of mirrored hand or foot control footNull = pm.group(em=True) if mode=='leg': footNull.translate.set( anklePos ) footNull.rotate.set( footRotate ) elif mode=='arm': footNull.translate.set( handPos ) OShandTransforms = MirrorObjLikeJnt( objs=footNull, returnValue=True ) OSfootRotate = OShandTransforms[0][1] pm.delete( footNull ) #============================================================================ # create IK, FK rigs and blend them # FK mode ============= if FKIKMode == 'FK': RigFK( jnts = OSbipedLimbJnts, side = side ) # other side if mirror: RigFK( jnts = OSbipedLimbJnts, side=otherSide ) # IK mode ============= elif FKIKMode == 'IK': armRigStuff = RigIK( jnts=bipedLimbJnts , mode=mode , side = side , poleVectorTransform=poleVectorTransform , footRotate=footRotate , rigHandOrFoot=True , ctrlSize = ctrlSize ) # other side if mirror: OSarmRigStuff = RigIK( jnts=OSbipedLimbJnts , mode=mode , side=otherSide , poleVectorTransform=OSpoleVectorTransform , mirrorMode=True , footRotate=OSfootRotate , rigHandOrFoot=True , ctrlSize = ctrlSize ) # FKIK mode ============= elif FKIKMode == 'FKIK': # for i in ( bipedLimbJnts, mode, side, poleVectorTransform, footRotate ): # print i # return None FKIKstuff = RigFKIK( jnts=bipedLimbJnts , mode=mode , side=side , poleVectorTransform=poleVectorTransform , footRotate=footRotate , rigHandOrFoot=True , ctrlSize = ctrlSize ) # other side if mirror: OSFKIKstuff = RigFKIK( jnts=OSbipedLimbJnts , mode=mode , side=otherSide , poleVectorTransform=OSpoleVectorTransform , mirrorMode=True , footRotate=(0,0,0) , rigHandOrFoot=True ) ''' OSFKIKstuff = RigFKIK( jnts=OSbipedLimbJnts , mode=mode , side=otherSide , poleVectorTransform=OSpoleVectorTransform , mirrorMode=True , footRotate=OSfootRotate , rigHandOrFoot=True ) ''' #============================================================================ # rig bendy limbs bendies = RigBendyLimb( jnts=bipedLimbJnts[:3] , bendyCtrl=FKIKstuff[3] , numOfSegs= numOfSegs , side=side ) if mirror: OSbendies = RigBendyLimb( jnts=OSbipedLimbJnts[:3] , bendyCtrl=OSFKIKstuff[3] , numOfSegs= numOfSegs , isMirroredJoint=True , side=otherSide ) # clean up pm.delete( self.BipedLimbInitJnts, aimLoc ) bendies[-1].setParent( FKIKstuff[-1] ) if mirror: pm.delete( OSaimLoc ) OSbendies[-1].setParent( OSFKIKstuff[-1] )
def MirrorObjLikeJnt( objs=None, returnValue=False ): if objs==None: objs = pm.ls( sl=True ) else: objs = pm.ls( objs ) newObjs = [] values = [] for obj in objs: nameSpaceAndName = obj.name().split(":") if len( nameSpaceAndName ) > 1: objNameSpace = nameSpaceAndName[0] objName = nameSpaceAndName[1] else: objName = obj.name() if objName[:2]==('L_'): side = 'L' otherSide = 'R' elif objName[:2]==('R_'): side = 'R' otherSide = 'L' else: side = '' otherSide = '' origParent = obj.getParent() scale = obj.scale.get() obj.scale.set( 1,1,1 ) pm.select( obj ) jnt = pm.joint() pm.parent( jnt , w=True ) pm.parent( obj, jnt ) newJntStrings = pm.ls( pm.mirrorJoint( jnt, mirrorYZ=True, mirrorBehavior=True ) ) for newJntString in newJntStrings: newName = newJntString.replace( side, otherSide )[:-1] try: pm.rename( newJntString , newName ) except: pass obj.scale.set( scale ) newJnt = newJntStrings[0] newObj = newJntStrings[1] if not origParent: pm.parent( obj , world=True ) pm.parent( newObj , world=True ) else: pm.parent( obj , origParent ) pm.parent( newObj , origParent ) pm.delete( jnt , newJnt ) reverseShape.ReverseShape( newObj ) newObjs.append( newObj ) newObj.scale.set( scale ) if returnValue: pos = pm.xform( newObj, q=True, ws=True, t=True ) rot = pm.xform( newObj, q=True, ws=True, ro=True ) values.append( (pos,rot) ) if returnValue: pm.delete(newObjs) return values else: return newObjs
def QuadrupedLimb_pack( **kwargs ): FKIKMode = kwargs.setdefault( 'FKIKMode', 'FKIK' ) mirror = kwargs.setdefault( 'mirror', True ) numOfSegs = kwargs.setdefault( 'numOfSegs',10 ) bendy = kwargs.setdefault( 'bendy', True ) mode = kwargs.setdefault( 'mode', 'arm' ) quadrupedLimbJnts = [] FKIKstuff = [] OSquadrupedLimbJnts = [] OSFKIKstuff = [] #============================================================================ # find some info for naming and control sizes side = QuadrupedLimbInitJnts[0].name()[0] limbLen = GNL.dist.Dist( QuadrupedLimbInitJnts[0] , QuadrupedLimbInitJnts[1] ) otherSide = 'R' if side == 'R': otherSide = 'L' #============================================================================ # def for rigging the hand def RigHand( butLimbJnt, endLimbJnt, father ): side = butLimbJnt.name()[0] handIKStuff = pm.ikHandle( sj = butLimbJnt, ee = endLimbJnt, solver = "ikSCsolver" ) handIK = pm.rename ( handIKStuff[0] , ( side + "_hand_ikh") ) pm.parent( handIK, father ) father.scale >> butLimbJnt.scale LockHideAttr( objs = handIKStuff, attr='vv' ) #============================================================================ # def for rigging single chain joints def RigSingleChain( startJnt, endJnt, father ): side = startJnt.name()[0] IKStuff = pm.ikHandle( sj = startJnt, ee = endJnt, solver = "ikSCsolver" ) IK = pm.rename ( IKStuff[0] , ( side + "_sc_ikh") ) pm.parent( IK, father ) father.scale >> startJnt.scale GNL.lockHideAttr.LockHideAttr( objs = IKStuff, attr='vv' ) #============================================================================ # getting info from selected objects if mode == 'arm': firstInitJnt = QuadrupedLimbInitJnts[0] secondInitJnt = QuadrupedLimbInitJnts[1] thirdInitJnt = QuadrupedLimbInitJnts[2] forthInitJnt = QuadrupedLimbInitJnts[3] armPos = WorldPos( firstInitJnt ) elbowPos = WorldPos( secondInitJnt ) handPos = WorldPos( thirdInitJnt ) handEndPos = WorldPos( forthInitJnt ) elif mode == 'leg': firstInitJnt = QuadrupedLimbInitJnts[0] secondInitJnt = QuadrupedLimbInitJnts[1] thirdInitJnt = QuadrupedLimbInitJnts[2] heelInitJnt = QuadrupedLimbInitJnts[3] forthInitJnt = QuadrupedLimbInitJnts[4] toeEndInitJnt = QuadrupedLimbInitJnts[5] upLegPos = WorldPos( firstInitJnt ) kneePos = WorldPos( secondInitJnt ) anklePos = WorldPos( thirdInitJnt ) heelPos = WorldPos( heelInitJnt ) ballPos = WorldPos( forthInitJnt ) toeEndPos = WorldPos( toeEndInitJnt ) #============================================================================ # create arm or leg joints if mode == 'arm': pm.select ( cl = True ) upLimbJnt =pm.joint ( p = armPos , name = ( side + "_upArm_jnt" ) ) midLimbJnt = pm.joint ( p = elbowPos , name = ( side + "_elbow_jnt" ) ) pm.joint( upLimbJnt, e=True, zso=True, oj='xyz', sao='yup') butLimbJnt = pm.joint ( p = handPos , name = ( side + "_hand_jnt" ) ) pm.joint( midLimbJnt, e=True, zso=True, oj='xyz', sao='yup') endLimbJnt = pm.joint ( p = handEndPos , name = ( side + "_hand_end_jnt" ) ) pm.joint( butLimbJnt, e=True, zso=True, oj='xyz', sao='yup') quadrupedLimbJnts = [ upLimbJnt, midLimbJnt, butLimbJnt, endLimbJnt ] elif mode == 'leg': pm.select ( cl = True ) upLimbJnt =pm.joint ( p = upLegPos , name = ( side + "_upLeg_jnt" ) ) midLimbJnt = pm.joint ( p = kneePos , name = ( side + "_knee_jnt" ) ) pm.joint( upLimbJnt, e=True, zso=True, oj='xzy', sao='xup') butLimbJnt = pm.joint ( p = anklePos , name = ( side + "_ankle_jnt" ) ) pm.joint( midLimbJnt, e=True, zso=True, oj='xzy', sao='xup') endLimbJnt = pm.joint ( p = ballPos , name = ( side + "_ball_jnt" ) ) pm.joint( butLimbJnt, e=True, zso=True, oj='xzy', sao='xup') toeEndJnt = pm.joint ( p = toeEndPos , name = ( side + "_toeEnd_jnt" ) ) pm.joint( endLimbJnt, e=True, zso=True, oj='xzy', sao='xup') quadrupedLimbJnts = [ upLimbJnt, midLimbJnt, butLimbJnt, endLimbJnt, toeEndJnt ] #============================================================================ # orient joints and set preferred angle if midLimbJnt.jointOrientX.get() != 0: # arm is bent aimLoc = pm.spaceLocator() upArmHandMidPos = FindPosBetween( percent=50, base=upLimbJnt, tip=butLimbJnt ) aimLoc.translate.set( upArmHandMidPos ) pm.delete( pm.aimConstraint( midLimbJnt, aimLoc, worldUpType="object", aimVector=(1,0,0), upVector=(0,1,0), worldUpObject= butLimbJnt ) ) pm.move( aimLoc, ( limbLen*2.0, 0, 0 ), wd=True, os=True, relative=True ) for jnt in ( upLimbJnt, midLimbJnt, butLimbJnt ): RIG.oriJnt.OriJnt( jnt=jnt, upAim=aimLoc , aimAxis='-z' ) if mode == 'arm': midLimbJnt.preferredAngleY.set( -90 ) elif mode == 'leg': midLimbJnt.preferredAngleZ.set( 90 ) else: aimLoc = pm.spaceLocator() pm.parent( aimLoc, secondInitJnt ) pm.makeIdentity( aimLoc, t=True, r=True, s=True ) if mode == 'arm': midLimbJnt.preferredAngleY.set( -90 ) aimLoc.translateZ.set( -limbLen*1.5 ) elif mode == 'leg': aimLoc.translateY.set( -limbLen*1.5 ) midLimbJnt.preferredAngleZ.set( 90 ) pm.parent( aimLoc, w=True) aimLoc.rotate.set( 0,0,0 ) #============================================================================ # If mirror is ON if mirror == True: # mirror joints and pole vector loc OSjnts = pm.mirrorJoint( upLimbJnt, mirrorYZ=True , mirrorBehavior=True, searchReplace=( "L", "R" ) ) OSjnts = pm.ls( OSjnts ) OSupLimbJnt = OSjnts[0] OSmidLimbJnt = OSjnts[1] OSbutLimbJnt = OSjnts[2] OSendLimbJnt = OSjnts[3] OSquadrupedLimbJnts = [ OSupLimbJnt, OSmidLimbJnt, OSbutLimbJnt, OSendLimbJnt ] OSaimLoc = pm.duplicate( aimLoc )[0] OSaimLoc.translateX.set( -OSaimLoc.translateX.get() ) #============================================================================ # create IK, FK joints # FK mode ============= if FKIKMode == 'FK': RigFK( jnts = ( upLimbJnt, midLimbJnt, butLimbJnt ), side = side ) pm.delete( aimLoc ) # other side if mirror: RigFK( jnts = ( OSupLimbJnt, OSmidLimbJnt, OSbutLimbJnt ), side=otherSide ) pm.delete( OSaimLoc ) # IK mode ============= elif FKIKMode == 'IK': armRigStuff = RigIK( jnts = ( upLimbJnt, midLimbJnt, butLimbJnt ), mode=mode, aim = aimLoc , side = side ) RigHand( butLimbJnt, endLimbJnt, armRigStuff[0] ) # other side if mirror: OSarmRigStuff = RigIK( jnts = ( OSupLimbJnt, OSmidLimbJnt, OSbutLimbJnt ), mode=mode, aim = OSaimLoc , side=otherSide ) RigHand( OSbutLimbJnt, OSendLimbJnt, OSarmRigStuff[0] ) # FKIK mode ============= elif FKIKMode == 'FKIK': FKIKstuff = RigFKIK( jnts = ( upLimbJnt, midLimbJnt, butLimbJnt ), mode=mode, aim = aimLoc , side=side ) RigHand( FKIKstuff[1][2], FKIKstuff[1][3], FKIKstuff[2][0] ) # other side if mirror: OSFKIKstuff = RigFKIK( jnts = ( OSupLimbJnt, OSmidLimbJnt, OSbutLimbJnt ), mode=mode, aim = OSaimLoc , side=otherSide ) RigHand( OSFKIKstuff[1][2], OSFKIKstuff[1][3], OSFKIKstuff[2][0] ) # reverse finger ctrl and elbow ctrl shapes # ReverseShape( OSFKIKstuff[3], 'x' ) # ReverseShape( OSFKIKstuff[2][1], 'z' ) # ReverseShape( OSFKIKstuff[2][1], 'x' ) #============================================================================ pm.delete( QuadrupedLimbInitJnts ) RigBendyLimb( jnts=quadrupedLimbJnts[:3], bendyCtrl=FKIKstuff[3], numOfSegs= numOfSegs ) if mirror: RigBendyLimb( jnts=OSquadrupedLimbJnts[:3], bendyCtrl=OSFKIKstuff[3], numOfSegs= numOfSegs, isMirroredJoint=True )