def connectCtrls(): ctrls = pm.ls(sl=1) masterGrp = groupTools.makeGroup(name='wingCtrlsConnect') coordsList = [] midDrvLocs = [] holdDrvLocs = [] mdCtrlsCoord = vtxWalk.bbox(ctrls)['globalPvt'] middle = controlTools.cntrlCrv(name='wingCtrlsConnect_mid_loc', coords=(mdCtrlsCoord, (0, 0, 0), (1, 1, 1)), cntrlSulfix='', parent=masterGrp, icone='null') tempConstraint = pm.pointConstraint(ctrls[0], ctrls[1], middle, mo=0) pm.delete(tempConstraint) pm.parentConstraint(ctrls[0].getParent().getParent(), ctrls[1].getParent().getParent(), middle, mo=1, sr=['x', 'y', 'z']) pm.aimConstraint(ctrls[0].getParent().getParent(), middle, wut='scene', mo=0) orientMiddle = pm.xform(middle, q=1, ro=1, ws=1) for ctrl in ctrls: coord = vtxWalk.bbox(ctrl)['globalPvt'] coordsList.append(coordsList) midLoc = controlTools.cntrlCrv(name=ctrl + '_mid_drv_loc', coords=(coord, (0, 0, 0), (1, 1, 1)), cntrlSulfix='', parent=middle, icone='null') midDrvLocs.append(midLoc) holdLoc = controlTools.cntrlCrv(name=ctrl + '_hold_drv_loc', coords=(coord, orientMiddle, (1, 1, 1)), cntrlSulfix='', parent=masterGrp, icone='null') holdDrvLocs.append(holdLoc) pm.parentConstraint(ctrl.getParent().getParent(), holdLoc, mo=1) pm.addAttr(ctrl, ln='autoConnect', dv=0.8, min=0, max=1, k=1) drvPointConstraint = pm.pointConstraint(midLoc, holdLoc, ctrl.getParent(), mo=1) #drvOrientConstraint = pm.orientConstraint(middle, holdLoc, ctrl.getParent(), mo=1) revNode = pm.createNode('reverse', n='wingCtrlsConnect_rev') ctrl.autoConnect >> revNode.inputX pm.connectAttr(ctrl.autoConnect, drvPointConstraint + '.' + midLoc + 'W0') pm.connectAttr(revNode.outputX, drvPointConstraint + '.' + holdLoc + 'W1')
def connectCtrls(self, ctrls, parent): masterCtrl = ctrls[0] drvCtrlList = ctrls[1] bendCtrlList = ctrls[2] paramList = self.returnClosestPointOnCurve(objList=self.ikhDrvList, curve=self.curve) locDrvGrp = groupTools.makeGroup(name=self.name + '_loc_drv', parent=parent) locDrvGrp.v.set(0) curveMinMaxValue = self.curve.getShape().minMaxValue.get() curveSize = curveMinMaxValue[1] - curveMinMaxValue[0] locDrvList = [] for i, each in enumerate(paramList): locDrv = controlTools.cntrlCrv( icone='null', name=self.name + '_drv_' + str(i + 1) + '_loc', hasZeroGrp=0, parent=locDrvGrp, cntrlSulfix='', coords=(self.ikhCoordList[i], (0, 0, 0), (1, 1, 1))) locDrvList.append(locDrv) self.createMotionPath(locDrv, self.curve, each) pm.pointConstraint(locDrv, self.ikhNodeList[i], mo=0) # construir o reader para extrair rotacao da curva self.orientJoint(i, locDrv, parent) # bends: blendValue = each / curveSize self.connectToBendCtrl(i, bendCtrlList, blendValue)
def constructor(self): pm.select(cl=1) moduleSysGrp = groupTools.makeGroup(name=self.name, suffix='') for base in self.selection: self.featherNameList.append(base) self.featherSys(base, moduleSysGrp) ctrls = self.ctrlCurve(moduleSysGrp) self.connectCtrls(ctrls, moduleSysGrp)
def featherSys(self, base, moduleSysGrp): sysGrp = groupTools.makeGroup(name=base + '_sys', suffix='', parent=moduleSysGrp) sysGrp.v.set(0) objToDeform = pm.listConnections(pm.listConnections( pm.listConnections(base.getShape())), t='mesh')[0] end = base + '_end' baseCoord = pm.xform(base, q=1, rp=1, ws=1) self.baseCoordList.append(baseCoord) endCoord = pm.xform(end, q=1, rp=1, ws=1) featherParentGrp = groupTools.makeGroup(name=base + '_parent_grp', parent=sysGrp, suffix='', coords=(baseCoord, (0, 0, 0), (1, 1, 1))) self.featherParentGrp.append(featherParentGrp) jointChain = self.createJointChain(base, [baseCoord, endCoord], parent=featherParentGrp) jntBase = jointChain[0] jntEnd = jointChain[1] ikh = pm.ikHandle(n=base + '_ikh', sj=jntBase, ee=jntEnd)[0] self.ikhNodeList.append(ikh) ikh.poleVectorX.set(0) ikh.poleVectorY.set(0) ikh.poleVectorZ.set(0) objOrient = pm.xform(jointChain[0], q=1, ro=1, ws=1) self.baseOrientList.append(objOrient) twkGrp = groupTools.makeGroup(name=base + '_twk', parent=moduleSysGrp, coords=(baseCoord, objOrient, (1, 1, 1))) twkJointChain = self.createJointChain(base + '_twk', [baseCoord, endCoord], parent=twkGrp) twkJntBase = twkJointChain[0] twkJntBase.v.set(0) twkJntEnd = twkJointChain[1] twkCtrl = controlTools.cntrlCrv(name=base + '_twk', icone='dropY', lockChannels=['v'], parent=twkGrp, coords=(baseCoord, objOrient, (1, 1, 1)), size=5) twkCtrl.translate >> twkJntBase.translate twkCtrl.rotate >> twkJntBase.rotate twkCtrl.scale >> twkJntBase.scale pm.parentConstraint(jntBase, twkGrp, mo=1) pm.scaleConstraint(jntBase, twkGrp, mo=1) ikhZero = groupTools.makeGroup(name=base + '_ikh_zero', coords=(baseCoord, objOrient, (1, 1, 1)), parent=sysGrp, suffix='') ikhGrp = groupTools.makeGroup(name=base + '_ikh_grp', coords=(baseCoord, objOrient, (1, 1, 1)), parent=ikhZero, suffix='') self.ikhDrvList.append(ikhGrp) pm.xform(ikhZero, t=(self.distance, 0, 0), os=1, r=1) ikhPosition = pm.xform(ikhZero, q=1, rp=1, ws=1) self.ikhCoordList.append(ikhPosition) ikh.setParent(ikhGrp) # criando bends: nonlinearGrp = groupTools.makeGroup(name=base + '_bend_grp', parent=sysGrp) # bend1 bendX = self.createBend(objToDeform, [baseCoord, objOrient, (1, 1, 1)], nonlinearGrp) # bend2 bendY = self.createBend(objToDeform, [baseCoord, objOrient, (1, 1, 1)], nonlinearGrp) pm.xform(bendY, ro=(0, 90, 0), os=1, r=1) self.bendList.append([bendX, bendY]) pm.skinCluster(twkJntBase, objToDeform)
def createPoseReader(self, index, parent, featherParent): baseCoord = self.baseCoordList[index] baseOrient = self.baseOrientList[index] aimCoord = self.ikhCoordList[index] name = self.featherNameList[index] ikh = self.ikhNodeList[index] ikhDrv = self.ikhDrvList[index] readerGrpName = name + '_reader' readerBaseLocName = name + '_reader_base_loc' readerAimUpLocName = name + '_reader_aim_up_loc' readerAimWorldLocName = name + '_reader_aim world_loc' readerUpLocName = name + '_reader_upVect_loc' readerAimLocName = name + '_reader_target_loc' readerMultNegName = name + '_reader_multNeg_md' readerGrp = groupTools.makeGroup(name=readerGrpName, parent=parent, coords=(aimCoord, baseOrient, (1, 1, 1))) readerGrp.v.set(0) readerBaseLoc = controlTools.cntrlCrv(icone='null', name=readerBaseLocName, cntrlSulfix='', parent=readerGrp, coords=(aimCoord, baseOrient, (1, 1, 1))) readerAimUpLoc = controlTools.cntrlCrv(icone='null', name=readerAimUpLocName, cntrlSulfix='', hasZeroGrp=0, parent=readerBaseLoc, coords=(aimCoord, baseOrient, (1, 1, 1))) readerAimWorldLoc = controlTools.cntrlCrv(icone='null', name=readerAimWorldLocName, cntrlSulfix='', hasZeroGrp=0, parent=readerAimUpLoc, coords=(aimCoord, baseOrient, (1, 1, 1))) readerUpLoc = controlTools.cntrlCrv(icone='null', name=readerUpLocName, cntrlSulfix='', parent=readerBaseLoc, coords=(aimCoord, baseOrient, (1, 1, 1))) readerTargetLoc = controlTools.cntrlCrv(icone='null', name=readerAimLocName, cntrlSulfix='', parent=readerGrp, coords=(baseCoord, baseOrient, (1, 1, 1))) pm.xform(readerUpLoc.getParent(), t=(0, 10, 0), r=1, os=1) pm.aimConstraint(readerTargetLoc, readerAimUpLoc, wuo=readerUpLoc, wut='object', u=(0, 1, 0), aim=(-1, 0, 0), mo=0) pm.aimConstraint(readerTargetLoc, readerAimWorldLoc, wut='scene', u=(0, 1, 0), aim=(-1, 0, 0), mo=0) pm.parentConstraint(featherParent, readerTargetLoc, mo=1) pm.scaleConstraint(featherParent, readerTargetLoc, mo=1) foll = attatchTools.hookOnMesh(inputs=[readerGrp, self.aimRbbn], mode=3) foll.v.set(0) readerMultNeg = pm.createNode('multDoubleLinear', n=readerMultNegName) readerAimWorldLoc.rotateX >> readerMultNeg.input1 readerMultNeg.input2.set(-1) readerMultNeg.output >> ikh.twist return self
def ctrlCurve(self, parent=None): self.curve = pm.curve(n=self.name + '_curve', d=1, p=self.ikhCoordList) if parent: self.curve.setParent(parent) pm.rebuildCurve(self.curve, s=3, d=3) # criando cluster a cada dois cvs clusterDrivers = [] # clusters curveCtrls = [] # ctrls cvsToCluster = [] poleCoords = [] drvPtvList = [] # coords de pvt dos tres drivers drvOrientList = [] # orientacao dos drivers bendCtrlList = [] index = 0 curveDrvGrp = groupTools.makeGroup(name=self.name + '_curveDrv', parent=parent) curveDrvGrp.v.set(0) ctrlGrp = groupTools.makeGroup(name=self.name + '_ctrl', parent=parent) # criando ctrl master e parenteando os outros nele: masterZeroGrp = groupTools.makeGroup(name=self.name + '_master_zero', parent=ctrlGrp) self.masterCtrl = groupTools.makeGroup(name=self.name + '_master_ctrl', suffix='', parent=masterZeroGrp) masterShape = pm.duplicate(self.curve)[0] masterShape.translateZ.set(-25) # criando uma rbbn para orientar os pose readers das penas: rbbnName = self.name + '_aimRbbn' self.aimRbbn = pm.loft(self.curve, masterShape, ch=False, ar=True, d=1, n=rbbnName)[0] self.aimRbbn.setParent(parent) self.aimRbbn.v.set(0) for e, cv in enumerate(self.curve.cv): if e == 0 or e == len(self.curve.cv) - 1: poleCoords.append(vtxWalk.bbox(cv)['globalPvt']) cvsToCluster.append(cv) for eachSpam in range(2): cvsToCluster.append( str(self.aimRbbn.name()) + '.cv[' + str(eachSpam) + '][' + str(e) + ']') index += 1 if index == 2: cluster = pm.cluster(cvsToCluster, n=self.name + '_' + str((e / 2) + 1))[1] cluster.setParent(curveDrvGrp) clusterDrivers.append(cluster) index = 0 cvsToCluster = [] # ajustando pivos dos clusters das extremidades para os extremos pm.xform(clusterDrivers[0], rp=poleCoords[0], ws=1) pm.xform(clusterDrivers[2], rp=poleCoords[1], ws=1) # criando drv ctrls para a curva for e, drv in enumerate(clusterDrivers): currentPvt = pm.xform(clusterDrivers[e], rp=1, q=1, ws=1) ctrl = controlTools.cntrlCrv(name=self.name + '_' + str(e + 1), size=20, coords=(currentPvt, (0, 0, 0), (1, 1, 1)), parent=ctrlGrp, lockChannels=[ 'v', ], color=(.9, .9, 0)) drvPtvList.append(currentPvt) curveCtrls.append(ctrl) # orientando drv ctrls: for i, ctrl in enumerate(curveCtrls): target = ctrl.getParent() if i == 0: source = curveCtrls[1] aim = (1, 0, 0) elif i == 1: source = curveCtrls[2] aim = (1, 0, 0) elif i == 2: source = curveCtrls[1] aim = (-1, 0, 0) tempConstraint = pm.aimConstraint(source, target, wut='scene', aim=aim, mo=0) pm.delete(tempConstraint) drvOrientList.append(pm.xform(ctrl, q=1, ro=1, ws=1)) # contraint do controle para os clusters: pm.parentConstraint(ctrl, clusterDrivers[i], mo=1) pm.scaleConstraint(ctrl, clusterDrivers[i], mo=1) pm.xform(masterZeroGrp, t=drvPtvList[1], ro=drvOrientList[1], ws=1) masterShape.setParent(self.masterCtrl) pm.makeIdentity(masterShape, t=1, r=1, apply=1) pm.parent(masterShape.getShape(), self.masterCtrl, r=1, s=1) pm.delete(masterShape) self.curve.getShape().template.set(1) for ctrl in curveCtrls: ctrl.getParent().setParent(self.masterCtrl) # ctrls de bend: bendCtrl1 = controlTools.cntrlCrv(name=self.name + '_bend1', icone='trianguloZ', size=15, lockChannels=['v'], coords=(drvPtvList[0], drvOrientList[0], (1, 1, 1)), parent=ctrlGrp, color=(0, .1, .5)) pm.xform(bendCtrl1, t=(0, 0, 40), ro=(0, 90, 0), r=1) pm.makeIdentity(bendCtrl1, r=1, apply=1) bendCtrl1.getParent().setParent(curveCtrls[0]) bendCtrlList.append(bendCtrl1) bendCtrl2 = controlTools.cntrlCrv(name=self.name + '_bend2', icone='trianguloZ', size=15, lockChannels=['v'], coords=(drvPtvList[2], drvOrientList[2], (1, 1, 1)), parent=ctrlGrp, color=(0, .1, .5)) pm.xform(bendCtrl2, t=(0, 0, 40), ro=(0, -90, 0), r=1) pm.makeIdentity(bendCtrl2, r=1, apply=1) bendCtrl2.getParent().setParent(curveCtrls[2]) bendCtrlList.append(bendCtrl2) return self.masterCtrl, curveCtrls, bendCtrlList