類似性を検出するために2つのメッシュを比較することは軽微な問題ではなく、AFAIK Mayaはこれに対するショートカットを提供しません。 また、私は第2の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ノード)はによって返さ
- 基本的なデータが新規として、あなたはあなたのロジックを改良する必要があるかもしれませんいくつかの点で、シンプルで
- 計算コスト物事を保つために、ハッシュに使用される変換を無視するために、使用されています異なるシナリオでスクリプトを使用している間に例外が発生します。これを行うには、ハッシュ(すなわち、境界ボックスサイズ、3D空間とUV空間の両方、重心座標、非多様体の存在など)の前に、
mesh_data
辞書にデータを追加することができます。このトピックに関するいくつかのヒントを持つ興味深いスレッド(かなり古くても)は、hereと読むことができます。
ようこそStackOverflow。ヘルプドキュメントの投稿ガイドラインを読み、それに従ってください。 [on topic](http://stackoverflow.com/help/on-topic)および[How to Ask](http://stackoverflow.com/help/how-to-ask)をここで適用してください。 少なくとも、類似のオブジェクトを定義し、このメトリックがどのように機能するかの例を挙げる必要があります。 – Prune