Ejemplo n.º 1
0
    def calculateScale(self, scale, translateTo='', objBBox='', useBBox=False, useMean=False):
        """
        Calculate scale value
        :param scale: float
        :param objBBox: str, object where to calculate bounding box
        :param autoBBox: bool, auto find proxy geo for bbox
        :param translateTo: str, object where to search proxy geo
        :return: float, scale
        """
        if scale == 1:
            if useBBox and pm.objExists(objBBox):  # customGeo
                objBBox = pm.ls(objBBox)[0]
                scale = util.getPlanarRadiusBBOXFromTransform(objBBox, radiusFactor=3)['3D']

            elif pm.objExists(translateTo):
                translateTo = pm.ls(translateTo)[0]

                proxyGeoName = name.removeSuffix(translateTo.name()) + '_PRX'
                if useBBox and pm.objExists(proxyGeoName):
                    objBBox = pm.ls(proxyGeoName)[0]
                    scale = util.getPlanarRadiusBBOXFromTransform(objBBox, radiusFactor=3)['3D']

                elif useMean and pm.objExists(proxyGeoName):
                    objBBox = pm.ls(proxyGeoName)[0]
                    bboxValues = util.getPlanarRadiusBBOXFromTransform(objBBox, radiusFactor=3)
                    scale = (bboxValues['planarX'] + bboxValues['planarY'] + bboxValues['planarZ']) / 3

                elif isinstance(translateTo, pm.nodetypes.Joint):
                    scale = self.ctrlRadiusFromJoint(translateTo)
                    if scale < 1 or (scale / 3) < 0.01:
                        scale = 1
                    else:
                        scale = scale / 3

        return scale
Ejemplo n.º 2
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
Ejemplo n.º 3
0
    def __init__(self,
                 characterName='new',
                 model_filePath='',
                 buildScene_filePath='',
                 rootJnt='spineJA_jnt',
                 headJnt='headJA_jnt',
                 loadSkinCluster=True,
                 doProxyGeo=True,
                 goToTPose=True):
        """
        Create Base Rig
        :param characterName: str
        :param model_filePath: str
        :param buildScene_filePath: str
        :param rootJnt: str
        :param loadSkinCluster: bool
        :param doProxyGeo: bool
        :param goToTPose: bool
        """

        start = pm.timerX()
        print '-- START --'

        # New Scene
        if buildScene_filePath:
            pm.newFile(force=True)

        # Import model
        if model_filePath:
            pm.importFile(model_filePath)

        # Import buildScene
        if buildScene_filePath:
            pm.importFile(buildScene_filePath)

        if goToTPose:
            joint.loadTPose(rootJnt)

        # Create proxy geo
        self.prxGeoList = pm.ls('*_PRX')
        if doProxyGeo:
            if len(self.prxGeoList) == 0 and len(pm.ls('mainProxy_GEO')) > 0:
                mainProxyGeo = pm.ls('mainProxy_GEO')[0]
                prxGeoInstance = proxyGeo.ProxyGeo(mainProxyGeo)
                self.prxGeoList = prxGeoInstance.getProxyGeoList()

        self.prepare()

        # search model grp
        self.sceneRadius = 1
        modelGrp = pm.ls(characterName + '_model' + '_GRP')
        if modelGrp:
            radius = util.getPlanarRadiusBBOXFromTransform(
                modelGrp[0])['planarY']
            self.sceneRadius = radius

        # Create rig
        self.baseModule = Base(characterName=characterName,
                               scale=self.sceneRadius,
                               mainCtrlAttachObj=headJnt)
        self.rig()

        # parent model group and clean scene
        if modelGrp:
            pm.parent(modelGrp, self.baseModule.mediumSlowGrp)
            if len(self.prxGeoList) > 0:
                pm.parent(self.prxGeoList, self.baseModule.fastModelGrp)
                if doProxyGeo and len(
                        pm.ls('mainProxy_GEO')) > 0 and pm.objExists(
                            prxGeoInstance.getFastGeoGroup()):
                    pm.delete(prxGeoInstance.getFastGeoGroup(),
                              pm.ls('mainProxy_GEO'))

        if pm.objExists('skeletonModel_GRP'):
            pm.parent('skeletonModel_GRP', self.baseModule.rigModelGrp)

        # parent joint group
        if pm.objExists(rootJnt):
            pm.parent(rootJnt, self.baseModule.jointsGrp)

        # Load SkinCluster
        if loadSkinCluster:
            joint.loadProjectionPose(rootJnt)
            geoList = [geo.name() for geo in pm.ls('*_GEO')]
            skin.loadSkinWeights(characterName, geoList)

        self.upgrade()

        # control shape
        if pm.objExists('controlShapes_GRP'):
            controlShapeList = util.getAllObjectUnderGroup('controlShapes_GRP',
                                                           type='transform')
            controlList = [
                cv for cv in pm.ls('*_CTRL') if cv not in controlShapeList
            ]
            for ctrl in controlList:
                for ctrlshape in controlShapeList:
                    if ctrlshape.name().split('|')[-1] == ctrl.name().split(
                            '|')[-1]:
                        ctrlShape.copyShape(ctrlshape, ctrl)
            pm.delete('controlShapes_GRP')

        self.finalize()

        totalTime = pm.timerX(startTime=start)
        print '-- END --'
        print 'Total time: ', totalTime