예제 #1
0
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')
예제 #2
0
    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)
예제 #3
0
    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)
예제 #4
0
    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)
예제 #5
0
    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
예제 #6
0
    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