2017-06-22 3 views
0

J'essaie de regrouper des objets similaires (modèles avec transformations) dans un projet maya par leurs sommets par programmation et je voulais savoir s'il y avait une valeur que je pourrais calculer pour vérifier des objets similaires? Les modèles avec lesquels je travaille sont des meubles de maisons 3D. Example furnitureExiste-t-il un moyen de représenter un objet géométrique en tant que valeur dans maya par programmation?

Je veux grouper les tasses de thé en un seul groupe. Leurs noms sont complètement différents dans la hiérarchie, donc je pensais que les regrouper (créer un dictionnaire) par une similitude géométrique aiderait.

+0

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

Répondre

0

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.