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
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
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