def ik_fk_switch(self, ik_joint, fk_joint, main_joint): cmds.pairBlend(nd=main_joint, at=['tx', 'ty', 'tz']) pair_blend = cmds.rename('pairBlend1', main_joint + '_pairblend') cmds.connectAttr(pair_blend + '.outRotate', main_joint + '.r') cmds.connectAttr(pair_blend + '.outTranslate', main_joint + '.t') cmds.connectAttr(ik_joint + '.t', pair_blend + '.inTranslate1') cmds.connectAttr(ik_joint + '.r', pair_blend + '.inRotate1') cmds.connectAttr(fk_joint + '.t', pair_blend + '.inTranslate2') cmds.connectAttr(fk_joint + '.r', pair_blend + '.inRotate2') #connect control to ikfk cmds.connectAttr(self.ik_fk_control + '.ikfk', pair_blend + '.weight')
def __createIKFKSwitcher(self, ikJointChain, fkJointChain): """ Using maya node "pairBlend" to set ik/fk switcher :return: """ ikJointList = ikJointChain.jointChain fkJointList = fkJointChain.jointChain skinJointList = ikJointChain.skinJointChain switcherCtl = ikJointChain.importCtl('switcher_Ctl') switcherGrp = ikJointChain.uuid('switcher_Grp') mc.rename('switcher_Grp', switcherGrp) pos = mc.xform(skinJointList[3], q=True, t=True, ws=True) mc.move(pos[0], pos[1], pos[2], switcherGrp, absolute=True) mc.makeIdentity(switcherGrp, apply=True, t=True, r=True, s=True, normal=0, preserveNormals=True) # 2. use pair blend node for i in range(len(ikJointList)): ikJoint = ikJointList[i] fkJoint = fkJointList[i] skinJoint = skinJointList[i] pb = mc.pairBlend(node=skinJoint, attribute=['tx', 'ty', 'tz', 'rx', 'ry', 'rz']) mc.connectAttr(switcherCtl + '.IKFKSwitcher', pb + '.weight', f=True) mc.connectAttr(ikJoint + '.translate', pb + '.inTranslate1', f=True) mc.connectAttr(ikJoint + '.rotate', pb + '.inRotate1', f=True) mc.connectAttr(fkJoint + '.translate', pb + '.inTranslate2', f=True) mc.connectAttr(fkJoint + '.rotate', pb + '.inRotate2', f=True) mc.connectAttr(pb + '.outTranslate', skinJoint + '.translate', f=True) mc.connectAttr(pb + '.outRotate', skinJoint + '.rotate', f=True) return switcherGrp, switcherCtl
def __createIKFKSwitcher(self, ikJointList, fkJointList, skinJointList, controller): """ Using maya node "pairBlend" to set ik/fk switcher :param ikJointList: :param fkJointList: :param skinJointList: :return: """ # 1. create ik/fk switcher controller ikfkSwitcherFile = os.path.join(os.path.split(__file__)[0], '../MayaFiles/ikfk_switcher.fbx') mc.file(ikfkSwitcherFile, i=True, rpr=':') bb = mc.xform(controller, q=True, bb=True, ws=True) cp = [(bb[0]+bb[3])/2.0, (bb[1]+bb[4])/2.0, (bb[2]+bb[5])/2.0] ikfkSwitcherController = mc.rename(self.IKFKSwitchController, '%s_%s' % (skinJointList[0], self.IKFKSwitchController)) mc.xform(ikfkSwitcherController, t=cp, ws=True, a=True) mc.parent(ikfkSwitcherController, controller) # 2. create ik/fk enum attribute to controller if not mc.attributeQuery('ikFkSwitcher', node=ikfkSwitcherController, exists=True): mc.addAttr(ikfkSwitcherController, keyable=True, longName='ikFkSwitcher', attributeType='enum', enumName='IK:FK:') # 3. use pair blend node for i in range(len(ikJointList)): if i < len(ikJointList): ikJoint = ikJointList[i] else: ikJoint = None if i < len(fkJointList): fkJoint = fkJointList[i] else: fkJoint = None skinJoint = skinJointList[i] # before pair blend, record the offset offsetX = mc.getAttr(skinJoint + '.tx') offsetY = mc.getAttr(skinJoint + '.ty') offsetZ = mc.getAttr(skinJoint + '.tz') # ik joint -> channel 1, fk joint -> channel 2 pb = mc.pairBlend(node=skinJoint, attribute=['tx', 'ty', 'tz', 'rx', 'ry', 'rz']) mc.connectAttr(ikfkSwitcherController + '.ikFkSwitcher', pb + '.weight', f=True) if ikJoint: mc.connectAttr(ikJoint + '.translate', pb + '.inTranslate1', f=True) mc.connectAttr(ikJoint + '.rotate', pb + '.inRotate1', f=True) if fkJoint: mc.connectAttr(fkJoint + '.translate', pb + '.inTranslate2', f=True) mc.connectAttr(fkJoint + '.rotate', pb + '.inRotate2', f=True) mc.connectAttr(pb + '.outRotate', skinJoint + '.rotate', f=True) # only joint chain root joint needs offset if i == 0: fx = mc.shadingNode('floatConstant', asUtility=True) mc.setAttr(fx+'.inFloat', offsetX) fy = mc.shadingNode('floatConstant', asUtility=True) mc.setAttr(fy+'.inFloat', offsetY) fz = mc.shadingNode('floatConstant', asUtility=True) mc.setAttr(fz+'.inFloat', offsetZ) channel = mc.shadingNode('channels', asUtility=True) mc.connectAttr(fx + '.outFloat', channel + '.inColorR', f=True) mc.connectAttr(fy + '.outFloat', channel + '.inColorG', f=True) mc.connectAttr(fz + '.outFloat', channel + '.inColorB', f=True) plusMinusAverage = mc.shadingNode('plusMinusAverage', asUtility=True) mc.connectAttr(pb+'.outTranslateX', plusMinusAverage+'.input3D[0].input3Dx', f=True) mc.connectAttr(pb+'.outTranslateY', plusMinusAverage+'.input3D[0].input3Dy', f=True) mc.connectAttr(pb+'.outTranslateZ', plusMinusAverage+'.input3D[0].input3Dz', f=True) mc.connectAttr(channel + '.outColorR', plusMinusAverage + '.input3D[1].input3Dx', f=True) mc.connectAttr(channel + '.outColorG', plusMinusAverage + '.input3D[1].input3Dy', f=True) mc.connectAttr(channel + '.outColorB', plusMinusAverage + '.input3D[1].input3Dz', f=True) mc.connectAttr(plusMinusAverage+'.output3Dx', skinJoint+'.translateX', f=True) mc.connectAttr(plusMinusAverage+'.output3Dy', skinJoint+'.translateY', f=True) mc.connectAttr(plusMinusAverage+'.output3Dz', skinJoint+'.translateZ', f=True) else: mc.connectAttr(pb + '.outTranslate', skinJoint + '.translate', f=True) return ikfkSwitcherController
def pairBlend(*args, **kwargs): res = cmds.pairBlend(*args, **kwargs) if not kwargs.get('query', kwargs.get('q', False)): res = _factories.maybeConvert(res, _general.PyNode) return res
cmds.addAttr(rl + prefix + 'ikFk_ctrl', ln='ikFkSwitch', at='float', hnv=1, min=0, hxv=1, max=1, r=1, k=1, h=0) cmds.setAttr(rl + prefix + 'ikFk_ctrl.ikFkSwitch', k=True, l=False) cmds.parent(spaceGrp, ctrlGrp) ######## BLEND JOINT ######## ######## pairBlend 01 ######## blnNode1 = cmds.pairBlend(nd=selJnt[0], at=['tx', 'ty', 'tz', 'rx', 'ry', 'rz']) cmds.connectAttr(rl + prefix + 'ikFk_ctrl.ikFkSwitch', blnNode1 + '.weight') cmds.connectAttr(fkJntSel[0] + '.translate', blnNode1 + '.inTranslate1') cmds.connectAttr(fkJntSel[0] + '.rotate', blnNode1 + '.inRotate1') cmds.connectAttr(ikJntSel[0] + '.translate', blnNode1 + '.inTranslate2') cmds.connectAttr(ikJntSel[0] + '.rotate', blnNode1 + '.inRotate2') pb01 = cmds.rename(blnNode1, str(selJnt[0]) + '_PB01') ######## pairBlend 02 ######## blnNode2 = cmds.pairBlend(nd=selJnt[1], at=['tx', 'ty', 'tz', 'rx', 'ry', 'rz']) cmds.connectAttr(rl + prefix + 'ikFk_ctrl.ikFkSwitch', blnNode2 + '.weight') cmds.connectAttr(fkJntSel[1] + '.translate', blnNode2 + '.inTranslate1') cmds.connectAttr(fkJntSel[1] + '.rotate', blnNode2 + '.inRotate1') cmds.connectAttr(ikJntSel[1] + '.translate', blnNode2 + '.inTranslate2') cmds.connectAttr(ikJntSel[1] + '.rotate', blnNode2 + '.inRotate2')