def eyeCtlSet(self): self.eyeLCtl = rigbase.Controler(n='EyeAim_L_CTL') self.eyeRCtl = rigbase.Controler(n='EyeAim_R_CTL') self.eyeCtl = rigbase.Controler(n='Eye_CTL') self.eyeLCtl.setShape(normal=[0, 0, 1], radius=.2) self.eyeRCtl.setShape(normal=[0, 0, 1], radius=.2) self.eyeCtl.setShape(normal=[0, 0, 1], radius=1) self.eyeLCtl.setParent(self.eyeCtl) self.eyeRCtl.setParent(self.eyeCtl) self.eyeCtl.setParent(self.headCtl) self.eyeLCtl.setColor(13) self.eyeRCtl.setColor(6) self.eyeCtl.setColor(23) attrEdit = rigbase.AttrEdit(self.eyeLCtl.name, self.eyeRCtl.name) attrEdit.lockAndHideAttrs('rx', 'ry', 'rz', 'sx', 'sy', 'sz', 'v') attrEdit = rigbase.AttrEdit(self.eyeCtl.name) attrEdit.lockAndHideAttrs('sx', 'sy', 'sz', 'v') rigbase.addHelpTx(self.eyeCtl.name, 'Follow') attrEdit.addAttr(ln='chestFollow', min=0, max=10, k=1) attrEdit.addAttr(ln='rootFollow', min=0, max=10, k=1) attrEdit.addAttr(ln='flyFollow', min=0, max=10, k=1) attrEdit.addAttr(ln='moveFollow', min=0, max=10)
def eyeCtlSet(self): self.eyeLCtl = rigbase.Controler( n='EyeAim_L_CTL' ) self.eyeRCtl = rigbase.Controler( n='EyeAim_R_CTL' ) self.eyeCtl = rigbase.Controler( n='Eye_CTL' ) self.eyeLCtl.setShape( normal=[0,0,1], radius =.2 ) self.eyeRCtl.setShape( normal=[0,0,1], radius =.2 ) self.eyeCtl.setShape( normal=[0,0,1], radius = 1 ) self.eyeLCtl.setParent( self.eyeCtl ) self.eyeRCtl.setParent( self.eyeCtl ) self.eyeCtl.setParent( self.headCtl ) self.eyeLCtl.setColor( 13 ) self.eyeRCtl.setColor( 6 ) self.eyeCtl.setColor( 23 ) attrEdit = rigbase.AttrEdit( self.eyeLCtl.name, self.eyeRCtl.name ) attrEdit.lockAndHideAttrs( 'rx','ry','rz','sx','sy','sz','v' ) attrEdit = rigbase.AttrEdit( self.eyeCtl.name ) attrEdit.lockAndHideAttrs( 'sx','sy','sz','v' ) rigbase.addHelpTx( self.eyeCtl.name, 'Follow' ) attrEdit.addAttr( ln='chestFollow', min=0, max=10, k=1 ) attrEdit.addAttr( ln='rootFollow', min=0, max=10, k=1 ) attrEdit.addAttr( ln='flyFollow', min=0, max=10, k=1 ) attrEdit.addAttr( ln='moveFollow', min=0, max=10 )
def twistAttrSet(self, side ): if side == 'L': targetCtl = self.shoulderLCtl elif side == 'R': targetCtl = self.shoulderRCtl rigbase.addHelpTx( targetCtl, 'Twist' ) attrEdit = rigbase.AttrEdit( targetCtl ) attrEdit.addAttr( ln='twistCollar', k=1 ) attrEdit.addAttr( ln='twistShoulder', k=1 )
def headCtlSet(self): self.headCtl = rigbase.Controler( n='Head_CTL' ) self.headCtl.setShape( normal=[0,0,1], radius=1.2, center = [0,.8,0] ) self.headCtl.setColor( 30 ) attrEdit = rigbase.AttrEdit( self.headCtl.name ) rigbase.addHelpTx( self.headCtl.name, 'Follow' ) attrEdit.lockAndHideAttrs( 'sx','sy','sz','v' ) attrEdit.addAttr( ln='neckFollow', min=0, max=10, k=1 ) attrEdit.addAttr( ln='chestFollow', min=0, max=10, k=1 ) attrEdit.addAttr( ln='rootFollow', min=0, max=10 ) attrEdit.addAttr( ln='flyFollow', min=0, max=10, k=1 ) attrEdit.addAttr( ln='moveFollow', min=0, max=10 ) rigbase.addHelpTx( self.headCtl.name, 'MiddleNeckVis' ) attrEdit.addAttr( ln='middleNeckVis', min=0, max=1, at='long', cb=1 )
def headCtlSet(self): self.headCtl = rigbase.Controler(n='Head_CTL') self.headCtl.setShape(normal=[0, 0, 1], radius=1.2, center=[0, .8, 0]) self.headCtl.setColor(30) attrEdit = rigbase.AttrEdit(self.headCtl.name) rigbase.addHelpTx(self.headCtl.name, 'Follow') attrEdit.lockAndHideAttrs('sx', 'sy', 'sz', 'v') attrEdit.addAttr(ln='neckFollow', min=0, max=10, k=1) attrEdit.addAttr(ln='chestFollow', min=0, max=10, k=1) attrEdit.addAttr(ln='rootFollow', min=0, max=10) attrEdit.addAttr(ln='flyFollow', min=0, max=10, k=1) attrEdit.addAttr(ln='moveFollow', min=0, max=10) rigbase.addHelpTx(self.headCtl.name, 'MiddleNeckVis') attrEdit.addAttr(ln='middleNeckVis', min=0, max=1, at='long', cb=1)
def splineSquashSet(self): crvInfo = cmds.createNode( 'curveInfo', n=self.epBindNode_after+'_info' ) initCrvInfo = cmds.createNode( 'curveInfo', n=self.epBindNode_before+'_info' ) cmds.connectAttr( self.epBindNode_after+'.outputCurve', crvInfo+'.inputCurve' ) cmds.connectAttr( self.epBindNode_before+'.outputCurve', initCrvInfo+'.inputCurve' ) squashNode = cmds.createNode( 'squash', n='Torso_squash' ) cmds.connectAttr( initCrvInfo+'.arcLength', squashNode+'.lengthOriginal' ) cmds.connectAttr( crvInfo+'.arcLength', squashNode+'.lengthModify' ) rigbase.addHelpTx( self.chestCtl, 'Squash' ) attrEdit = rigbase.AttrEdit( self.chestCtl ) attrEdit.addAttr( ln='squash', min=-1, max=1, k=1 ) attrEdit.addAttr( ln='forceScale', k=1 ) cmds.connectAttr( self.chestCtl+'.squash', squashNode+'.squashRate' ) cmds.connectAttr( self.chestCtl+'.forceScale', squashNode+'.forceValue' ) for splineJnt in self.splineJnts[1:-1]: cmds.connectAttr( squashNode+'.output', splineJnt+'.sx' ) cmds.connectAttr( squashNode+'.output', splineJnt+'.sy' ) cmds.connectAttr( squashNode+'.output', splineJnt+'.sz' )
def hipConstSet(self): hipLConst_inFly = cmds.createNode( 'transform', n='Hip_L_Const_inFly' ) hipRConst_inFly = cmds.createNode( 'transform', n='Hip_R_Const_inFly' ) hipLConst_inRoot = cmds.createNode( 'transform', n='Hip_L_Const_inRoot' ) hipRConst_inRoot = cmds.createNode( 'transform', n='Hip_R_Const_inRoot' ) hipLConst_inHip = cmds.createNode( 'transform', n='Hip_L_Const_inHip' ) hipRConst_inHip = cmds.createNode( 'transform', n='Hip_R_Const_inHip' ) hipLConst = cmds.createNode( 'transform', n='Hip_L_Const' ) hipRConst = cmds.createNode( 'transform', n='Hip_R_Const' ) cmds.parent( hipLConst_inFly, hipRConst_inFly, self.rootCtlGrp ) cmds.parent( hipLConst_inRoot, hipRConst_inRoot, self.rootGrp ) cmds.parent( hipLConst, hipRConst, hipLConst_inHip, hipRConst_inHip, self.hipCtl ) rigbase.connectSameAttr( self.hipLInit, hipLConst_inFly ).doIt( 't','r' ) rigbase.connectSameAttr( self.hipRInit, hipRConst_inFly ).doIt( 't','r' ) rigbase.connectSameAttr( self.hipLInit, hipLConst_inRoot ).doIt( 't' ) rigbase.connectSameAttr( self.hipRInit, hipRConst_inRoot ).doIt( 't' ) rigbase.constraint( hipLConst_inFly, hipLConst_inRoot, t=0 ) rigbase.constraint( hipRConst_inFly, hipRConst_inRoot, t=0 ) rigbase.connectSameAttr( self.hipLInit, hipLConst_inHip ).doIt( 't','r' ) rigbase.connectSameAttr( self.hipRInit, hipRConst_inHip ).doIt( 't','r' ) #cmds.setAttr( hipLConst_inHip+'.rz', -90 ) #cmds.setAttr( hipLConst_inRoot+'.rz', -90 ) #cmds.setAttr( hipRConst_inHip+'.rx', 180 ) #cmds.setAttr( hipRConst_inHip+'.rz', 90 ) #cmds.setAttr( hipRConst_inRoot+'.rx', 180 ) #cmds.setAttr( hipRConst_inRoot+'.rz', 90 ) blendMtxL = cmds.createNode( 'blendTwoMatrix', n='Hip_L_Const_blendMtx' ) blendMtxR = cmds.createNode( 'blendTwoMatrix', n='Hip_R_Const_blendMtx' ) multMtxDcmpL = cmds.createNode( 'multMatrixDecompose', n='Hip_L_Const_MtxDcmp' ) multMtxDcmpR = cmds.createNode( 'multMatrixDecompose', n='Hip_R_Const_MtxDcmp' ) cmds.connectAttr( hipLConst_inRoot+'.wm', blendMtxL+'.inMatrix1' ) cmds.connectAttr( hipRConst_inRoot+'.wm', blendMtxR+'.inMatrix1' ) cmds.connectAttr( hipLConst_inHip+'.wm', blendMtxL+'.inMatrix2' ) cmds.connectAttr( hipRConst_inHip+'.wm', blendMtxR+'.inMatrix2' ) cmds.connectAttr( blendMtxL+'.outMatrix', multMtxDcmpL+'.i[0]' ) cmds.connectAttr( blendMtxR+'.outMatrix', multMtxDcmpR+'.i[0]' ) cmds.connectAttr( hipLConst+'.pim', multMtxDcmpL+'.i[1]' ) cmds.connectAttr( hipRConst+'.pim', multMtxDcmpR+'.i[1]' ) cmds.connectAttr( hipLConst_inHip+'.t', hipLConst+'.t' ) cmds.connectAttr( hipRConst_inHip+'.t', hipRConst+'.t' ) cmds.connectAttr( multMtxDcmpL+'.or', hipLConst+'.r' ) cmds.connectAttr( multMtxDcmpR+'.or', hipRConst+'.r' ) rigbase.addHelpTx( self.hipCtl, 'Options' ) attrEdit = rigbase.AttrEdit( self.hipCtl ) attrEdit.addAttr( ln='legFollowL', min=0, max=1, k=1 ) attrEdit.addAttr( ln='legFollowR', min=0, max=1, k=1 ) cmds.connectAttr( self.hipCtl+'.legFollowL', blendMtxL+'.attributeBlender' ) cmds.connectAttr( self.hipCtl+'.legFollowR', blendMtxR+'.attributeBlender' ) self.rigInstance.hipLConst_inRoot = hipLConst_inRoot self.rigInstance.hipRConst_inRoot = hipRConst_inRoot self.rigInstance.hipLConst_inHip = hipLConst_inHip self.rigInstance.hipRConst_inHip = hipRConst_inHip self.rigInstance.hipLConstInFly = hipLConst_inFly self.rigInstance.hipRConstInFly = hipRConst_inFly self.hipLConst = hipLConst self.hipRConst = hipRConst
def collarConstSet(self, side ): si = 0 if side == 'R': si = 1 shoulderInitList = [self.shoulderLInit, self.shoulderRInit ] shoulderCtlList = [self.shoulderLCtl,self.shoulderRCtl] collarCtlList = [self.collarLCtl, self.collarRCtl] const = cmds.createNode( 'transform', n='Shoulder_%s_Const' % side ) inCollar = cmds.createNode( 'transform', n='Shoulder_%s_Const_inCollar' % side ) inChest = cmds.createNode( 'transform', n='Shoulder_%s_Const_inChest' % side ) inRoot = cmds.createNode( 'transform', n='Shoulder_%s_Const_inRoot' % side ) inFly = cmds.createNode( 'transform', n='Shoulder_%s_Const_inFly' % side ) inMove = cmds.createNode( 'transform', n='Shoulder_%s_Const_inMove' % side ) cmds.parent( const , shoulderCtlList[si] ) cmds.parent( inCollar, collarCtlList[si] ) cmds.parent( inChest , self.chestCtl.replace( 'Chest', 'ChestMove' ) ) cmds.parent( inRoot , self.rootGrp ) cmds.parent( inFly , self.rootCtlGrp ) cmds.parent( inMove , self.rigInstance.moveCtl ) rigbase.transformDefault( const )#; cmds.setAttr( const+'.dla', 1 ) rigbase.connectSameAttr( shoulderInitList[si], inCollar ).doIt( 't', 'r' ) chestDcmp = rigbase.getChildMtxDcmp( shoulderInitList[si], self.chestInit ) cmds.connectAttr( chestDcmp+'.ot', inChest+'.t' ) cmds.connectAttr( chestDcmp+'.or', inChest+'.r' ) rootDcmp = rigbase.getChildMtxDcmp( shoulderInitList[si], self.rootInit ) cmds.connectAttr( rootDcmp+'.ot', inRoot+'.t' ) cmds.connectAttr( rootDcmp+'.or', inRoot+'.r' ) cmds.connectAttr( rootDcmp+'.ot', inFly+'.t' ) cmds.connectAttr( rootDcmp+'.or', inFly+'.r' ) cmds.connectAttr( rootDcmp+'.ot', inMove+'.t' ) cmds.connectAttr( rootDcmp+'.or', inMove+'.r' ) followMtx = cmds.createNode( 'followMatrix', n='Shoulder_%s_ConstFollow' % side ) mtxDcmp = cmds.createNode( 'multMatrixDecompose', n='Shoulder_%s_ConstMtxDcmp' % side ) cmds.connectAttr( inCollar+'.wm', followMtx+'.originalMatrix' ) cmds.connectAttr( inChest +'.wm', followMtx+'.inputMatrix[0]' ) cmds.connectAttr( inRoot +'.wm', followMtx+'.inputMatrix[1]' ) cmds.connectAttr( inFly +'.wm', followMtx+'.inputMatrix[2]' ) cmds.connectAttr( inMove +'.wm', followMtx+'.inputMatrix[3]' ) cmds.connectAttr( followMtx+'.outputMatrix', mtxDcmp+'.i[0]' ) cmds.connectAttr( const +'.pim', mtxDcmp+'.i[1]' ) cmds.connectAttr( mtxDcmp+'.or', const+'.r' ) rigbase.addHelpTx( collarCtlList[si], 'Follow' ) attrEdit = rigbase.AttrEdit( collarCtlList[si] ) attrEdit.addAttr( ln='chestFollow', min=0, max=10 ) attrEdit.addAttr( ln='rootFollow' , min=0, max=10 ) attrEdit.addAttr( ln='flyFollow' , min=0, max=10, k=1 ) attrEdit.addAttr( ln='moveFollow' , min=0, max=10 ) cmds.connectAttr( collarCtlList[si]+'.chestFollow', followMtx+'.inputWeight[0]' ) cmds.connectAttr( collarCtlList[si]+'.rootFollow' , followMtx+'.inputWeight[1]' ) cmds.connectAttr( collarCtlList[si]+'.flyFollow' , followMtx+'.inputWeight[2]' ) cmds.connectAttr( collarCtlList[si]+'.moveFollow' , followMtx+'.inputWeight[3]' ) if side == 'L': self.shoulderLConst = const self.rigInstance.ikGroupLConst = inChest else: self.shoulderRConst = const self.rigInstance.ikGroupRConst = inChest
def splineJointSet( self, splineNumber ): self.splineJnts = [] cmds.select( d=1 ) self._splineJointUpObjectSet() spci = cmds.createNode( 'splineCurveInfo', n= self.initCrv+'_Spci' ) cmds.connectAttr( self.initCrvShape+'.local', spci+'.inputCurve' ) #cmds.connectAttr( self.startUp+'.wm', spci+'.startTransform' ) #cmds.connectAttr( self.endUp +'.wm', spci+'.endTransform' ) cmds.setAttr( spci+'.startUpAxis', 2 ) cmds.setAttr( spci+'.endUpAxis', 2 ) cmds.setAttr( spci+'.targetAimAxis', 1 ) cmds.setAttr( spci+'.targetUpAxis', 2 ) for i in range( splineNumber ): self.splineJnts.append( cmds.joint( n='Spline%d_RJT' % i, radius=1.5 ) ) pointObjs = [] for i in range( 0, splineNumber ): pr = float(i)/(splineNumber-1) pointObj = cmds.createNode( 'transform', n='Spline%d_SplinePoint' % i ) pointObjs.append( pointObj ) cmds.addAttr( self.splineJnts[i], ln='parameter', min=0, max=1, dv=pr ) cmds.setAttr( self.splineJnts[i]+'.parameter', e=1, k=1 ) cmds.connectAttr( self.splineJnts[i]+'.parameter', spci+'.pr[%d]' % i ) cmds.connectAttr( spci+'.o[%d].p' % i, pointObj+'.t' ) cmds.connectAttr( spci+'.o[%d].r' % i, pointObj+'.r' ) cmds.parent( pointObj, self.initCrv ) rigbase.constraint( pointObj, self.splineJnts[i] ) pointHObjs = [] cmds.select( self.torsoCtl ) for i in range( 0, splineNumber ): pointHObjs.append( cmds.joint( n=pointObjs[i].replace( 'SplinePoint', 'SplineHJnt' ) ) ) mtxDcmp = rigbase.constraint( pointObjs[i], pointHObjs[i], r=0 ) cmds.connectAttr( mtxDcmp+'.or', pointHObjs[i]+'.jo' ) if i == 0: cmds.connectAttr( self.rootGrp+'.wim', mtxDcmp+'.i[1]', f=1 ) else: cmds.connectAttr( pointObjs[i-1]+'.wim', mtxDcmp+'.i[1]', f=1 ) cmds.select( pointHObjs[i] ) cmds.setAttr( pointHObjs[0]+'.v', 0 ) rigbase.constraint( pointHObjs[-1], self.chestCtlGrp, r=0 ) epBindNode = cmds.createNode( 'epBindNode', n='Torso_epBindNode' ) initEpBindNode = cmds.createNode( 'epBindNode', n='TorsoInit_epBindNode' ) chestOrPointer = cmds.createNode( 'transform', n='Chest_OrPointer' ) hipCuPointer = cmds.createNode( 'transform', n='Hip_CuPointer' ) cmds.parent( chestOrPointer, self.chestCtlGrp ) cmds.parent( hipCuPointer, self.hipCtlGrp ) rigbase.transformDefault( chestOrPointer ) cmds.connectAttr( self.chestCtl+'.r', chestOrPointer+'.r' ) cmds.connectAttr( self.hipCtl+'.t', hipCuPointer+'.t' ) cmds.connectAttr( self.hipCtlGrp+'.wm', epBindNode+'.om[0]' ) cmds.connectAttr( chestOrPointer+'.wm', epBindNode+'.om[1]') cmds.connectAttr( hipCuPointer+'.wm', epBindNode+'.m[0]' ) cmds.connectAttr( self.chestCtl+'.wm', epBindNode+'.m[1]' ) for i in range( splineNumber ): dcmp = cmds.createNode( 'decomposeMatrix' , n=pointHObjs[i]+'_dcmp' ) cmds.connectAttr( pointHObjs[i]+'.wm', dcmp+'.imat' ) cmds.connectAttr( dcmp+'.ot', epBindNode+'.ip[%d]' % i ) cmds.connectAttr( dcmp+'.ot', initEpBindNode+'.ip[%d]' % i ) smOri = cmds.createNode( 'smartOrient', n='Torso_Spline_SmOri' ) cmds.connectAttr( self.chestCtl+'.m', smOri+'.inputMatrix' ) cmds.setAttr( smOri+'.aimAxis', 1 ) for i in range( 1, splineNumber-1 ): cmds.addAttr( self.chestCtl, ln='rotRate%d' % i, min=0, max=1, dv=.333 ) splineOrientMult = cmds.createNode( 'multiplyDivide', n='Torso_Spline_OrientMult%d' % i ) cmds.connectAttr( smOri+'.outAngle', splineOrientMult+'.input1' ) cmds.connectAttr( self.chestCtl+'.rotRate%d' % i, splineOrientMult+'.input2X' ) cmds.connectAttr( self.chestCtl+'.rotRate%d' % i, splineOrientMult+'.input2Y' ) cmds.connectAttr( self.chestCtl+'.rotRate%d' % i, splineOrientMult+'.input2Z' ) cmds.connectAttr( splineOrientMult+'.output', pointHObjs[i]+'.r' ) ''' firstCrv = cmds.circle( ch=0, n='Torso_FristCrv' )[0] firstCrvShape = cmds.listRelatives( firstCrv, s=1 )[0] cmds.connectAttr( epBindNode+'.outputCurve', firstCrvShape+'.create' ) cmds.parent( firstCrv, self.rootGrp ) firstCrv_dcmp = cmds.createNode( 'decomposeMatrix', n='Torso_firstCrv_invDcmp' ) cmds.connectAttr( firstCrv+'.pim', firstCrv_dcmp+'.imat' ) cmds.connectAttr( firstCrv_dcmp+'.ot', firstCrv+'.t' ) cmds.connectAttr( firstCrv_dcmp+'.or', firstCrv+'.r' ) cmds.connectAttr( firstCrv_dcmp+'.os', firstCrv+'.s' ) cmds.connectAttr( firstCrv_dcmp+'.osh', firstCrv+'.sh' )''' def curveBasedCtlGrp( outputCurveAttr, ctlGrp, prRate=0.5 ): posInfo = cmds.createNode( 'pointOnCurveInfo', n='Waist_Ct;PoseInfo' ) fbf = cmds.createNode( 'fourByFourMatrix', n='Waist_CtlFBF' ) smOri = cmds.createNode( 'smartOrient', n='Waist_CtlSmOri' ) compose = cmds.createNode( 'composeMatrix', n='Waist_CtlComp' ) mtxDcmp = cmds.createNode( 'multMatrixDecompose', n='Waist_CtlMtxDcmp' ) cmds.setAttr( posInfo+'.top', 1 ) cmds.setAttr( posInfo+'.parameter', prRate ) cmds.setAttr( smOri+'.aimAxis', 1 ) cmds.connectAttr( outputCurveAttr, posInfo+'.inputCurve' ) cmds.connectAttr( posInfo+'.tangentX', fbf+'.in10' ) cmds.connectAttr( posInfo+'.tangentY', fbf+'.in11' ) cmds.connectAttr( posInfo+'.tangentZ', fbf+'.in12' ) cmds.connectAttr( fbf+'.output', smOri+'.inputMatrix' ) cmds.connectAttr( posInfo+'.position', compose+'.it' ) cmds.connectAttr( smOri+'.outAngle', compose+'.ir') cmds.connectAttr( compose+'.outputMatrix', mtxDcmp+'.i[0]' ) cmds.connectAttr( ctlGrp+'.pim', mtxDcmp+'.i[1]' ) cmds.connectAttr( mtxDcmp+'.ot', ctlGrp+'.t' ) cmds.connectAttr( mtxDcmp+'.or', ctlGrp+'.r' ) curveBasedCtlGrp( epBindNode+'.outputCurve', self.waistCtlGrp, prRate=0.5 ) chestCuPointer = cmds.createNode( 'transform', n='ChestCuPointer' ) cmds.parent( chestCuPointer, self.chestMoveCtlGrp ) cmds.connectAttr( self.chestMoveCtl+'.t', chestCuPointer+'.t' ) rigbase.transformDefault( chestCuPointer ) epBindNode2 = cmds.createNode( 'epBindNode', n='Torso_epBindNode2' ) for i in range( splineNumber ): cmds.connectAttr( epBindNode+'.op[%d]' % i, epBindNode2+'.ip[%d]' % i ) waistOrientObj = cmds.createNode( 'transform', n='WaistOrient_OBJ' ) cmds.parent( waistOrientObj, self.waistCtlGrp ) rigbase.transformDefault( waistOrientObj ) waistSmOrient = cmds.createNode( 'smartOrient', n='WaistOrient_ObjSmOrient' ) cmds.connectAttr( self.waistCtl+'.m', waistSmOrient+'.inputMatrix' ) cmds.setAttr( waistSmOrient+'.aimAxis', 1 ) cmds.connectAttr( waistSmOrient+'.outAngle', waistOrientObj+'.r' ) cmds.connectAttr( self.waistCtl+'.t', waistOrientObj+'.t' ) cmds.connectAttr( hipCuPointer+'.wm', epBindNode2+'.m[0]' ) cmds.connectAttr( hipCuPointer+'.wm', epBindNode2+'.om[0]' ) cmds.connectAttr( waistOrientObj+'.wm', epBindNode2+'.m[1]' ) cmds.connectAttr( self.waistCtlGrp+'.wm', epBindNode2+'.om[1]' ) cmds.connectAttr( chestCuPointer+'.wm', epBindNode2+'.m[2]' ) cmds.connectAttr( self.chestMoveCtlGrp+'.wm', epBindNode2+'.om[2]' ) cuSpInfo = cmds.createNode( 'splineCurveInfo' , n='Torso_CurrentSplineInfo' ) cmds.setAttr( cuSpInfo+'.paramFromLength', 0 ) cmds.setAttr( cuSpInfo+'.startUpAxis', 2 ) cmds.setAttr( cuSpInfo+'.endUpAxis', 2 ) cmds.setAttr( cuSpInfo+'.targetAimAxis', 1 ) cmds.setAttr( cuSpInfo+'.targetUpAxis', 2 ) putCtls = [] rigbase.addHelpTx( self.waistCtl, 'Itp CTL Vis' ) rigbase.AttrEdit( self.waistCtl ).addAttr( ln='show', cb=1, min=0, max=1, at='long' ) for i in range( 1, splineNumber-1 ): putCtl, putCtlGrp = rigbase.putControler( self.waistCtl, n='WaistItp%d_CTL' % i, normal=[0,1,0] ) rigbase.AttrEdit( putCtl ).lockAndHideAttrs( 'sx', 'sy', 'sz' ,'v' ) curveBasedCtlGrp( epBindNode2+'.outputCurve', putCtlGrp, i/( splineNumber-1.0 ) ) cmds.connectAttr( self.waistCtl+'.show', putCtlGrp+'.v' ) putCtls.append( [putCtl, putCtlGrp] ) cmds.parent( putCtlGrp, self.rootGrp ) epBindNode3 = cmds.createNode( 'epBindNode', n='Torso_epBindNode3' ) for i in range( splineNumber ): cmds.connectAttr( epBindNode2+'.op[%d]' % i, epBindNode3+'.ip[%d]' % i ) cmds.connectAttr( hipCuPointer+'.wm', epBindNode3+'.m[0]' ) cmds.connectAttr( hipCuPointer+'.wm', epBindNode3+'.om[0]' ) for i in range( 1, splineNumber-1 ): cmds.connectAttr( putCtls[i-1][0]+'.wm', epBindNode3+'.m[%d]' % i ) cmds.connectAttr( putCtls[i-1][1]+'.wm', epBindNode3+'.om[%d]' % i ) cmds.connectAttr( chestCuPointer+'.wm', epBindNode3+'.m[%d]' % (splineNumber-1) ) cmds.connectAttr( self.chestMoveCtlGrp+'.wm', epBindNode3+'.om[%d]' % (splineNumber-1) ) cuSpInfo = cmds.createNode( 'splineCurveInfo' , n='Torso_CurrentSplineInfo' ) cmds.setAttr( cuSpInfo+'.paramFromLength', 0 ) cmds.setAttr( cuSpInfo+'.startUpAxis', 2 ) cmds.setAttr( cuSpInfo+'.endUpAxis', 2 ) cmds.setAttr( cuSpInfo+'.targetAimAxis', 1 ) cmds.setAttr( cuSpInfo+'.targetUpAxis', 2 ) cmds.connectAttr( epBindNode3+'.outputCurve', cuSpInfo+'.inputCurve' ) cmds.connectAttr( self.startUp+'.wm', cuSpInfo+'.startTransform' ) cmds.connectAttr( self.endUp+'.wm', cuSpInfo+'.endTransform' ) cuSpGrp = cmds.createNode( 'transform', n='Torso_Spline_GRP' ) splinePtrs = [] for i in range( splineNumber ): splineInfoPtr = cmds.createNode( 'transform', n='Torso%d_SplinePoint' % i ) splinePtrs.append( splineInfoPtr ) cmds.setAttr( cuSpInfo+'.parameter[%d]' % i, i/( splineNumber-1.0 )+0.001 ) cmds.connectAttr( cuSpInfo+'.output[%d].position' % i, splineInfoPtr+'.t' ) cmds.connectAttr( cuSpInfo+'.output[%d].rotate' % i, splineInfoPtr+'.r' ) cmds.parent( splinePtrs, cuSpGrp ) cmds.parent( cuSpGrp, self.rootCtlGrp ) splinePtrsInvDcmp = cmds.createNode( 'decomposeMatrix', n='Torso_SplinePtrsInvDcmp' ) cmds.connectAttr( self.rootCtlGrp+'.wim', splinePtrsInvDcmp+'.imat' ) cmds.connectAttr( splinePtrsInvDcmp+'.ot', cuSpGrp+'.t' ) cmds.connectAttr( splinePtrsInvDcmp+'.or', cuSpGrp+'.r' ) cmds.connectAttr( splinePtrsInvDcmp+'.os', cuSpGrp+'.s' ) cmds.connectAttr( splinePtrsInvDcmp+'.osh', cuSpGrp+'.sh' ) allWristAngle = cmds.createNode( 'wristAngle', n='Torso_TwistAllAngle' ) cmds.setAttr( allWristAngle+'.axis', 1 ) cmds.connectAttr( self.waistCtl+'.wm', allWristAngle+'.inputMatrix' ) for i in range( 1, splineNumber-1 ): floatValue = i/(splineNumber-1.0) weightValue = 1-math.fabs( 0.5-floatValue )/.5 cmds.addAttr( self.waistCtl, ln='multWeight%d' % i, min=0, max=1, dv=weightValue ) cuSplinePtr = cmds.createNode( 'transform', n='Torso_cuSplinePtr%d' % i ) cmds.parent( cuSplinePtr, splinePtrs[i] ) rigbase.transformDefault( cuSplinePtr ) rigbase.constraint( cuSplinePtr, self.splineJnts[i] ) twistMultNode = cmds.createNode( 'multDoubleLinear', n='Torso_TwistMult%d' % i ) addTwist = cmds.createNode( 'addDoubleLinear', n='Torso_TwistAdd%d' % i ) wristAngle = cmds.createNode( 'wristAngle', n='Torso_TwistAngle%d' % i ) cmds.setAttr( wristAngle+'.axis', 1 ) cmds.connectAttr( putCtls[i-1][0]+'.m', wristAngle+'.inputMatrix' ) cmds.connectAttr( wristAngle+'.outAngle', addTwist+'.input1' ) cmds.connectAttr( allWristAngle+'.outAngle', twistMultNode+'.input1' ) cmds.connectAttr( self.waistCtl+'.multWeight%d' % i, twistMultNode+'.input2' ) cmds.connectAttr( twistMultNode+'.output', addTwist+'.input2' ) cmds.connectAttr( addTwist+'.output', cuSplinePtr+'.ry' ) rigbase.constraint( self.hipCtl, self.splineJnts[0] ) rigbase.constraint( self.chestMoveCtl, self.splineJnts[-1] ) cmds.parent( self.splineJnts[0], self.rootGrp ) self.epBindNode_before = initEpBindNode self.epBindNode_after = epBindNode3