Python 是否有一种方法可以在maya中以编程方式将几何对象表示为值?

Python 是否有一种方法可以在maya中以编程方式将几何对象表示为值?,python,geometry,maya-api,Python,Geometry,Maya Api,我正在尝试以编程方式将maya项目中的类似对象(带有变换的模型)按顶点分组,并想知道是否有可以计算的值来检查类似对象?我正在使用的模型是3D房屋中的家具。 我想把茶杯分成一组。它们的名字在层次结构上完全不同,所以我认为按几何相似性对它们进行分组(创建字典)会有所帮助 比较两个网格以检测相似性是一个非常重要的问题,AFAIK Maya不为此提供快捷方式。 此外,我还想说,对你来说,清楚“相似对象”的含义非常重要:根据你的目标相似程度,你可能需要实现相当复杂(和/或非常昂贵)的算法 但是,通过查看

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


我想把茶杯分成一组。它们的名字在层次结构上完全不同,所以我认为按几何相似性对它们进行分组(创建字典)会有所帮助

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

但是,通过查看链接的图片,在我看来,您只需要检测形状节点的精确副本,这通常比较容易。 以下是您如何实现这一目标的示例:

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()
从maya导入cmds
def getGeoHash(网格):
mesh_data=cmds.polyeevaluate(mesh)
#简单的字典哈希,如下所示:
# https://stackoverflow.com/questions/5884066/hashing-a-dictionary
返回散列(frozenset(mesh_data.items()))
def groupsimilarmesh():
mesh=cmds.ls(典型值=mesh',l=1)
mesh_dict={}
对于网格中的网格:
geo_hash=getGeoHash(网格)
如果网格目录中没有地理哈希:
网格目录[地理哈希]=[]
#存储网格变换:将有多个
#以防实例化某些网格
transforms=cmds.listRelatives(网格,p=1)
mesh_dict[geo_hash].extend(转换)
对于键,在mesh_dict.iteritems()中重复:
如果len(重复项)<2:
#将跳过非重复项
持续
cmds.group(重复,n='相似')
groupsimilarmesh()
请注意:

  • getGeoHash
    是对几何体进行散列的函数;形状(类型为
    mesh
    的maya节点)用于忽略变换
  • 返回的基本数据用于散列,以保持简单且计算成本低廉
  • 在某些情况下,您可能需要改进逻辑,因为在不同场景中使用脚本时会出现新的异常。为此,可以在散列之前将更多数据添加到
    mesh_data
    字典中(即三维和UV空间中的边界框大小、质心坐标、非流形几何体的存在等)。可以阅读一篇有趣的文章,其中有一些关于这个主题的提示(虽然很老)

欢迎来到StackOverflow。请阅读并遵循帮助文档中的发布指南。在这里申请。至少,我们需要您定义“相似对象”,并给出一些示例说明此度量的工作原理。