有没有办法以编程方式将几何对象表示为maya中的值?

时间:2017-06-22 20:59:23

标签: python geometry maya-api

我试图通过编程方式将maya项目中的类似对象(带变换的模型)按其顶点分组,并想知道是否有值我可以计算以检查类似对象的值?我正在使用的模型是3D房屋的家具。 Example furniture

我想把茶杯分组到一个小组。它们的名称在层次结构中完全不同,所以我认为通过某种几何相似性对它们进行分组(创建字典)会有所帮助。

1 个答案:

答案 0 :(得分: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的maya节点)来忽略转换
  • polyEvaluate返回的基本数据用于散列,以保持简单且计算成本低廉
  • 在某些时候,您可能需要优化逻辑,因为在不同场景中使用脚本时会出现新的异常。为此,您可以在散列之前向mesh_data字典添加更多数据(即,边界框大小,3D和UV空间,质心坐标,非流形几何体的存在等) 。有一个关于这个主题的一些有用的线索(虽然很旧)可以阅读here