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)
def connectIKFK(self): blendAttrName = "IK_FK_Blend" self.m_blendAttr = self.m_blendControl + "." + blendAttrName try: cmds.setAttr(self.m_blendAttr, 0) print "WARNING, IK_FK_Blend attribute already exsits" except: cmds.addAttr( self.m_blendControl, ln=blendAttrName, min = 0, max = 1, k = 1 ) self.m_blendAttr = self.m_blendControl + "." + blendAttrName self.m_blendOppAttr = rc.create1MinusNode( self.m_blendAttr, self.m_name+"_IKFKBlendOpp_CTRL" ) # Attach each joint to BIND bindJoints = self.m_bindRig.m_joints ikJoints = self.m_ikRig.m_joints fkJoints = self.m_fkRig.m_joints for i in range(0, len(bindJoints) - 1): #Orientation const1 = cmds.parentConstraint( ikJoints[i], bindJoints[i], st = ["x", "y", "z"] ) const1 = const1[0] const2 = cmds.parentConstraint( fkJoints[i], bindJoints[i], st = ["x", "y", "z"] ) const2 = const2[0] cmds.connectAttr( self.m_blendOppAttr, "%s.blendParent2" %(bindJoints[i]) ) # Set rotation method to quarternion # get pair blend node pairBlend = cmds.listConnections( "%s.constraintRotateX" %(const1), d=True ) pairBlend = pairBlend[0] cmds.setAttr("%s.rotInterpolation" %(pairBlend), 1) for i in range(1, len(bindJoints)): # Connect up blended lengths blendedAttr = self.createBlendAttr( rg.stripMiddle(ikJoints[i], 0, 1), ikJoints[i] + ".translateX", fkJoints[i] + ".translateX", self.m_blendAttr, self.m_blendOppAttr ) cmds.connectAttr(blendedAttr, bindJoints[i] + ".translateX") # Fix wrist rotations self.m_bindRig.aimWrist(self.m_ikRig.getIKControl(), [self.m_blendAttr, self.m_blendOppAttr])
def createControls(self): #If no blend control is speified add one if not self.m_blendControl: self.m_blendControl = cmds.circle(n=self.m_name+"Blend_CTRL")[0] cmds.parent(self.m_blendControl, self.m_group) self.m_allControls.append(self.m_blendControl) rc.addToControlDict( self.m_allControls, "%s_StretchChainCtrl" %(self.m_baseName), self.m_blendControl ) cmds.addAttr( self.m_blendControl, ln=self.m_attrHeading, k=True, at = "enum", en = "---------:" ) if self.m_isAutoBend: cmds.addAttr( self.m_blendControl, ln=self.m_blendAttrName, k=1, min=0, max=1, dv=0 ) blendNodeAttr = self.m_blendControl+"."+self.m_blendAttrName oppBlendNodeAttr = rc.create1MinusNode( blendNodeAttr, self.m_name+"OppBlend_CTRL" ) self.m_controls = [] self.m_parentCtrls = [] self.m_pointCtrls = [] startPos = cmds.xform(self.m_parent1, q=1, t=1, ws=1) endPos = cmds.xform(self.m_parent2, q=1, t=1, ws=1) stepVec = vec.divide( vec.subtract(endPos, startPos), self.m_numCtrls + 1 ) currentPos = vec.add(startPos, stepVec) for i in range(self.m_numCtrls): newCtrl = self.m_name+"_"+str(i)+"_CTRL" parentCtrl = self.m_name+"_"+str(i)+"_parent_CTRL" pointCtrl = self.m_name+"_"+str(i)+"_point_CTRL" newCtrl = cmds.spaceLocator(n=newCtrl)[0] self.m_controls.append(newCtrl) cmds.parent(newCtrl, self.m_group) cmds.xform(newCtrl, t=currentPos, ws=1) newCtrlGroups = rg.add3Groups(newCtrl, ["_SDK", "_CONST", "_0"]) if self.m_isAutoBend: parentCtrl = cmds.duplicate(newCtrl, n=parentCtrl)[0] cmds.parent(parentCtrl, newCtrlGroups[2]) #cmds.setAttr(parentCtrl+".visibility", 0) pointCtrl = cmds.duplicate(newCtrl, n=pointCtrl)[0] cmds.parent(pointCtrl, newCtrlGroups[2]) #cmds.setAttr(pointCtrl+".visibility", 0) rc.addToLayer(self.m_sceneData, "hidden", [parentCtrl, pointCtrl]) #Create blend between parent and point setups blendConst = cmds.pointConstraint(parentCtrl, newCtrlGroups[1]) cmds.connectAttr(blendNodeAttr, blendConst[0]+"."+parentCtrl+"W0") blendConst = cmds.pointConstraint(pointCtrl, newCtrlGroups[1]) cmds.connectAttr(oppBlendNodeAttr, blendConst[0]+"."+pointCtrl+"W1") self.m_parentCtrls.append(parentCtrl) self.m_pointCtrls.append(pointCtrl) grandParent = cmds.listRelatives(self.m_parent1, p=1) if grandParent == None or not self.m_isParentBend: grandParent = self.m_parent1 parentConst = rc.applyWeightedConstraint( grandParent, parentCtrl, self.m_parent2, cmds.parentConstraint ) pointConst = rc.applyWeightedConstraint( self.m_parent1, pointCtrl, self.m_parent2, cmds.pointConstraint ) cmds.aimConstraint( self.m_parent2, newCtrlGroups[1] ) currentPos = vec.add(currentPos, stepVec) #lock attrs cmds.setAttr(newCtrl+".rotate", l=1) cmds.setAttr(newCtrl+".scale", l=1) rc.addToLayer(self.m_sceneData, "detailCtrl", self.m_controls) # Add controls i=0 for control in self.m_controls: rc.addToControlDict(self.m_allControls, "%s_%d_detail" %(self.m_baseName, i), control) i+=1