Пример #1
0
    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')
Пример #2
0
    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
Пример #4
0
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
Пример #5
0
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')