Exemplo n.º 1
0
    def makeInnerTwistJoints(self, prefix, startJnt, endJnt, nTwistJoint=3, rotAxis='X'):
        """
        Add Twist Joint for selected Joint
        :param joint_selection:
        :param nTwistJoint:
        :return:
        """
        distance = util.get_distance(startJnt, endJnt) / (nTwistJoint + 1)

        joint_list = []
        for i in range(0, nTwistJoint):
            # Create new twist Joint
            joint_name = prefix + '_twistJ' + str(i + 1) + 'JNT'
            new_joint = pm.joint(n=joint_name)
            pm.delete(pm.parentConstraint(startJnt, new_joint))
            common.freezeTranform(new_joint)
            pm.parent(new_joint, startJnt)

            direction = jointDirection(startJnt)
            pm.move((i + 1) * distance * direction, 0, 0, new_joint, relative=True, localSpace=True)

            # connect to mulDoubleLinear node
            multiplyNode = pm.shadingNode('multDoubleLinear', asUtility=True)
            pm.connectAttr(startJnt.name()+'.rotate'+rotAxis, multiplyNode.input1, f=True)
            pm.connectAttr(multiplyNode.output, new_joint.name()+'.rotate'+rotAxis)
            weight = (1.0 / (nTwistJoint + 1.0)) * (i + 1)
            multiplyNode.input2.set(weight)

            # ovveride joint color
            new_joint.ove.set(1)
            new_joint.ovc.set(13)

            joint_list.append(new_joint)

        return joint_list
Exemplo n.º 2
0
    def __init__(self, ikHandle, ikCtrl, doFlexyplane=True):
        ikHandle = pm.ls(ikHandle)[0]
        ikCtrl = pm.ls(ikCtrl)[0]

        prefix = name.removeSuffix(ikHandle.name())

        jointList = pm.ikHandle(ikHandle, jointList=True, q=True)
        endJoint = pm.listRelatives(jointList[-1], c=True, type='joint')[0]
        jointList.append(endJoint)

        distanceDimensionShape = pm.distanceDimension(sp=jointList[0].getTranslation(space='world'),
                                                      ep=jointList[-1].getTranslation(space='world'))

        locators = pm.listConnections(distanceDimensionShape, s=True)
        startLoc = pm.rename(locators[0], prefix + 'DistanceStart_LOC')
        endLoc = pm.rename(locators[1], prefix + 'DistanceEnd_LOC')

        pm.pointConstraint(jointList[0], startLoc)
        pm.pointConstraint(ikCtrl, endLoc)

        # multiplyDivide Node
        multiplyDivideNode = pm.shadingNode('multiplyDivide', asUtility=True, n=prefix + '_multiplyDivide')
        multiplyDivideNode.input2X.set(1)
        multiplyDivideNode.operation.set(2)
        pm.connectAttr(distanceDimensionShape.distance, multiplyDivideNode.input1X, f=True)
        distance = 0
        for i in range(0, len(jointList[:-1])):
            distance = distance + util.get_distance(jointList[i], jointList[i + 1])
        multiplyDivideNode.input2X.set(distance)

        # condition Node
        conditionNode = pm.shadingNode('condition', asUtility=True, n=prefix + '_condition')
        conditionNode.operation.set(2)
        pm.connectAttr(distanceDimensionShape.distance, conditionNode.firstTerm, f=True)
        pm.connectAttr(multiplyDivideNode.input2X, conditionNode.secondTerm, f=True)
        pm.connectAttr(multiplyDivideNode.outputX, conditionNode.colorIfTrueR, f=True)

        for jnt in jointList[:-1]:
            pm.connectAttr(conditionNode.outColorR, jnt.scaleX, f=True)

        self.stretchyGrp = pm.group(startLoc, endLoc, distanceDimensionShape.getParent(), n=prefix+'Stretchy_GRP')
        self.stretchyGrp.visibility.set(0)

        # save attributes
        self.prefix = prefix
        self.jointList = jointList

        if doFlexyplane:
            self.doFlexyPlane(prefix)
Exemplo n.º 3
0
    def ctrlRadiusFromJoint(self, jnt, useSphere=True):
        childJnt = jnt.getChildren()

        if len(childJnt) > 0:
            radius = util.get_distance(jnt, childJnt[0])

            if useSphere:
                sphere = pm.polySphere(r=radius, sx=20, sy=20, ch=False)[0]
                radius = util.getPlanarRadiusBBOXFromTransform(sphere, radiusFactor=3)['3D']
                pm.delete(sphere)

        else:
            return 1

        return radius