2017-06-22 14 views
0

私は同様のオブジェクト(トランスフォームのあるモデル)を頂点によってプログラムでグループ化しようとしていますが、同様のオブジェクトをチェックするために計算できる値があるかどうかを知りたがっていますか?私が扱っているモデルは3D家具の家具です。 Example furniture幾何学的オブジェクトをプログラムでmayaの値として表現する方法はありますか?

茶碗を1つのグループにまとめたいとします。彼らの名前は階層内で完全に異なっているので、いくつかの幾何学的類似性によってそれらをグループ化する(辞書を作成する)ことが役に立ちます。

+0

ようこそStackOverflow。ヘルプドキュメントの投稿ガイドラインを読み、それに従ってください。 [on topic](http://stackoverflow.com/help/on-topic)および[How to Ask](http://stackoverflow.com/help/how-to-ask)をここで適用してください。 少なくとも、類似のオブジェクトを定義し、このメトリックがどのように機能するかの例を挙げる必要があります。 – Prune

答えて

0

類似性を検出するために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と読むことができます。
関連する問題