2017-06-22 53 views
0

我想通过它们的顶点以编程方式在maya项目中对类似对象(带有变换的模型)进行分组,并想知道是否有可以计算的值来检查相似的对象?我正在使用的模型是来自3D房屋的家具。我想将茶杯分组到单个组。他们的名字在层次结构中完全不同,所以我认为通过某种几何相似性将它们分组(创建字典)会有所帮助。有没有一种方法可以以编程方式将几何对象表示为maya中的值?

+0

欢迎来到StackOverflow。请阅读并遵守帮助文档中的发布准则。 [在主题](http://stackoverflow.com/help/on-topic)和[如何提问](http://stackoverflow.com/help/how-to-ask)适用于此处。 至少,我们需要您定义“类似的对象”,并举例说明这个度量标准的工作原理。 – Prune

回答

0

比较两个网格以检测相似性是一个不平凡的问题,AFAIK Maya不提供此快捷方式。 此外,我第二个Prune在说,你清楚你的意思是“相似的对象”是非常重要的:根据你的目标相似程度,你可能需要实现相当复杂(和/或非常昂贵的)算法。

通过查看您链接的图片,虽然在我看来,您只需检测形状节点的确切重复项,这通常更容易。 这里是你如何做到这一点的例子:

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

的几个注意事项:

  • getGeoHash是哈希几何体的功能;形状(mesh类型的玛雅节点)时,忽略转换
  • 通过返回基本数据用于哈希,让事情变得简单和计算上更便宜
  • 在某些时候,你可能需要调整你的逻辑,如新在不同情况下使用脚本时会出现异常。为此,可以在散列之前(即边界框的大小,包括3D和UV空间,质心坐标,非流形几何的存在等)添加更多数据到mesh_data字典中。一个有趣的话题与这个主题(尽管很旧)的一些提示可以被读取here
相关问题