2017-06-22 56 views
0

我想通過它們的頂點以編程方式在maya項目中對類似對象(帶有變換的模型)進行分組,並想知道是否有可以計算的值來檢查相似的對象?我正在使用的模型是來自3D房屋的傢俱。我想將茶杯分組到單個組。他們的名字在層次結構中完全不同,所以我認爲通過某種幾何相似性將它們分組(創建字典)會有所幫助。有沒有一種方法可以以編程方式將幾何對象表示爲maya中的值?

+0

歡迎來到StackOverflow。請閱讀並遵守幫助文檔中的發佈準則。 [在主題](http://stackoverflow.com/help/on-topic)和[如何提問](http://stackoverflow.com/help/how-to-ask)適用於此處。 至少,我們需要您定義「類似的對象」,並舉例說明這個度量標準的工作原理。 – Prune

回答

0

比較兩個網格以檢測相似性是一個不平凡的問題,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是哈希幾何體的功能;形狀(mesh類型的瑪雅節點)時,忽略轉換
  • 通過返回基本數據用於哈希,讓事情變得簡單和計算上更便宜
  • 在某些時候,你可能需要調整你的邏輯,如新在不同情況下使用腳本時會出現異常。爲此,可以在散列之前(即邊界框的大小,包括3D和UV空間,質心座標,非流形幾何的存在等)添加更多數據到mesh_data字典中。一個有趣的話題與這個主題(儘管很舊)的一些提示可以被讀取here
相關問題