有没有办法以编程方式将几何对象表示为 Maya 中的值?
Is there a way to represent geometric object as a value in maya programmatically?
我正在尝试以编程方式通过顶点对 Maya 项目中的相似对象(具有变换的模型)进行分组,并且想知道是否有我可以计算的值来检查相似对象?我正在使用的模型是 3D 房屋中的家具。
Example furniture
我想将茶杯归为一组。它们的名称在层次结构中完全不同,因此我认为通过某种几何相似性将它们分组(创建字典)会有所帮助。
比较两个网格以检测相似性是一个非常重要的问题,AFAIK Maya 不为此提供快捷方式。
另外,我赞成 说清楚 "similar objects" 的含义对您来说非常重要:根据您的目标相似程度,您可能需要实施非常复杂的( and/or 非常昂贵)算法。
不过,通过查看您链接的图片,在我看来您只需要检测形状节点的精确副本,这通常更容易。
以下是如何实现该目标的示例:
from maya import cmds
def getGeoHash(mesh):
mesh_data = cmds.polyEvaluate(mesh)
# simple dictionary hashing, as suggested here:
#
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 中的边界框大小 space、质心坐标、非流形几何的存在, ETC。)。可以阅读关于此主题的一些提示的有趣线程(虽然很旧)here。
我正在尝试以编程方式通过顶点对 Maya 项目中的相似对象(具有变换的模型)进行分组,并且想知道是否有我可以计算的值来检查相似对象?我正在使用的模型是 3D 房屋中的家具。 Example furniture
我想将茶杯归为一组。它们的名称在层次结构中完全不同,因此我认为通过某种几何相似性将它们分组(创建字典)会有所帮助。
比较两个网格以检测相似性是一个非常重要的问题,AFAIK Maya 不为此提供快捷方式。
另外,我赞成
不过,通过查看您链接的图片,在我看来您只需要检测形状节点的精确副本,这通常更容易。 以下是如何实现该目标的示例:
from maya import cmds
def getGeoHash(mesh):
mesh_data = cmds.polyEvaluate(mesh)
# simple dictionary hashing, as suggested here:
#
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 中的边界框大小 space、质心坐标、非流形几何的存在, ETC。)。可以阅读关于此主题的一些提示的有趣线程(虽然很旧)here。