我正在尝试以编程方式通过它们的顶点对 Maya 项目中的相似对象(具有变换的模型)进行分组,并想知道是否有一个值可以计算来检查相似对象?我正在使用的模型是来自 3D 房屋的家具。 示例家具
我想将茶杯归为一个组。它们的名称在层次结构中完全不同,所以我认为通过一些几何相似性对它们进行分组(创建字典)会有所帮助。
比较两个网格以检测相似性是一个非常重要的问题,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
是散列几何图形的函数;使用形状(类型为 的 Maya 节点mesh
)来忽略变换polyEvaluate
用于散列,以保持简单且计算成本低mesh_data
在散列之前将更多数据添加到字典中(即边界框大小,在 3D 和 UV 空间中,质心坐标,非流形几何的存在等)。可以在此处阅读一个有趣的线程,其中包含有关此主题的一些提示(虽然很老) 。