La comparaison de deux maillages pour détecter des similitudes est un problème non trivial et AFAIK Maya ne fournit pas de raccourcis pour cela. En outre, j'appuie le Prune pour dire qu'il est très important que vous compreniez bien ce que vous entendez par "objets similaires": selon le degré de similarité que vous recherchez, vous devrez peut-être mettre en œuvre des méthodes assez complexes (et/ou très algorithmes coûteux). En regardant l'image que vous avez liée, cependant, il me semble que vous avez juste besoin de détecter exactement les doublons des nœuds de forme, ce qui est généralement plus facile. Voici un exemple de la façon dont vous pouvez y parvenir:
from maya import cmds
def getGeoHash(mesh):
mesh_data = cmds.polyEvaluate(mesh)
# simple dictionary hashing, as suggested here:
# https://stackoverflow.com/questions/5884066/hashing-a-dictionary
return hash(frozenset(mesh_data.items()))
def groupSimilarMeshes():
meshes = cmds.ls(typ='mesh', l=1)
mesh_dict = {}
for mesh in meshes:
geo_hash = getGeoHash(mesh)
if not geo_hash in mesh_dict:
mesh_dict[geo_hash] = []
# store the mesh transforms: there will be more than one
# in case some meshes are instanced
transforms = cmds.listRelatives(mesh, p=1)
mesh_dict[geo_hash].extend(transforms)
for key, duplicates in mesh_dict.iteritems():
if len(duplicates) < 2:
# non-duplicates are skipped
continue
cmds.group(duplicates, n='similar')
groupSimilarMeshes()
Quelques notes:
getGeoHash
est la fonction qui hashs la géométrie; formes (nœuds MAYA de type mesh
) sont utilisés, d'ignorer les transformations
- données de base retournées par est utilisé pour le hachage, pour garder les choses simples et informatiquement bon marché à un moment donné
- vous pourriez avoir besoin d'affiner votre logique, en tant que nouveau Des exceptions apparaissent lors de l'utilisation du script sur différents scénarios. Pour ce faire, vous pouvez ajouter plus de données à votre dictionnaire
mesh_data
, avant le hachage (c'est-à-dire la taille de la boîte englobante, à la fois en 3D et UV, les coordonnées centroïdes, la géométrie non-multiple). Un fil intéressant avec quelques indices sur ce sujet (bien que assez vieux) peut être lu here.
Bienvenue dans StackOverflow. Veuillez lire et suivre les consignes de publication dans la documentation d'aide. [sur le sujet] (http://stackoverflow.com/help/on-topic) et [comment demander] (http://stackoverflow.com/help/how-to-ask) s'appliquent ici. À tout le moins, nous avons besoin de vous pour définir des «objets similaires» et donner quelques exemples de la façon dont cette métrique fonctionnerait. – Prune