2015-10-28 56 views
0

我一直在Maya中遇到問題,並且無法在本網站上或本網站上找到解決方案。我做了這個賬戶,所以我可以向社區提出一個直接的問題,並希望得到答案。重新排列maya中的多邊形臉部索引

問題是: 在建模過程中,臉部索引(例如obj.f [0])會混亂起來。我需要從用戶指定的起點順序重新排序該臉部索引。 這是將面部放入選擇列表中。 (Maya會根據face_index數字來放置列表,這不是我們想要的) 爲了說明起見,臉部索引不需要自行更改。它只需要適當地列入清單。

我到目前爲止所做的: 我能夠編寫一些代碼來完成多邊形條的選擇。所選面被轉換爲邊緣列表,然後Maya搜索共享相同邊的面並將其附加到新列表中。由於只有一個邊被共享給相鄰的面,因此這在工作區中很容易實現。 僞代碼是:

select geo 
select start face and make new_list 
converts geo_sel into list 
for geo_sel_face in geo_sel: 
    convert to edge 
    for new_list_face in new_list: 
     convert to edge 
     if edge in geo_sel_face in new_list_face: 
      ordered_list.append(geo_sel_face) 

類似的東西。當處理像飛機這樣的完整表面時,代碼完全中斷,因爲至少有兩條邊與其他表面共享。

這是什麼用於: 我寫了一個腳本,基本上植物草(或任何其他類型的幾何)跨越一個表面。原始腳本尋找臉部中心,並在臉部中心植草,或者你有什麼。它也將限制方向到法線。然而,索引混亂了,做額外的工作,需要一個適當的索引變得不可能。如果列表是人類可讀的而不是機器可讀的,這對數據管理將有很大幫助,這就是爲什麼我正在尋找一種方法來實現這一點。

最後: 我試圖尋找一個解決方案,但似乎沒有找到一個完整的表面。也許我需要從另一個角度思考這個問題,並且非常感謝來自社區的任何幫助或啓發。

謝謝您的時間!

+0

因此,您需要按順序在一組面中映射,並且新映射不是相同的索引,但看起來完全相同?或者你想以某種確定性的方式來排列一張面孔列表? – theodox

+0

嘿thodox,謝謝你的回覆! 後者以確定性的方式排序面部列表。 想象一下3x3平面。通常在建模之後,臉部索引變得混亂起來。我想重新排序它,例如,plane.face [0]從左上角開始,然後垂直於plane.face [1],依此類推。 我可以分離所有的面並重新組合,或者使用MFnMesh :: createInPlace來做類似的事情。但無論哪種方式都需要我做某種手動選擇。 這對於小數目並不是什麼大不了的事,但是當一個場景有數百個時,這是瘋了。 – XJZeng

回答

0

有沒有一種完全可靠的方式來做你所問的,因爲面孔沒有可靠的獨立身份 - 並且因爲想出一個對計算機來說真正有意義的映射是非常棘手的儘管這對我們很明顯。

簡單的做法是使用專用的UV貼圖來包含您的訂購信息。如果是涉及人類決策的事情,您實際上可以讓藝術家製作名稱UV地圖並將您臉部的UV質心作爲訂購元素。像這樣的東西會給你UV面心和麪指數之間的映射:

def uv_centroids(mesh, map = 'map1'): 
    results = dict() 
    for f in range(cmds.polyEvaluate(mesh, f=True)): 
     cmds.select("%s.f[%s]" % (mesh, f), r = True) 
     uu, vv = cmds.polyEvaluate( bc2=True, uvs=map) 
     uu = sum(uu)/2.0 
     vv =sum(vv)/2.0 
     results[uu,vv] = f 
    return results 

因爲臉部中心只是元組,在字典鍵使用排序()會先用U,然後對他們進行排名第V :

# example with a default plane 
uv_dict = uv_centroids('pPlane1')  
ordered = uv_dict.keys() 
ordered.sort() 
for k in ordered: 
    print k, uv_dict[k] 

# prints out the keys and faces ordered 0,10,20... 1, 11, 21.... etc 

雖然紫外線的被當做普通模擬條件下的指標是脆弱的,他們是一個非常簡單的重新創建,並允許藝術家們對流量和訂單一些選擇。您甚至可以使用TransferAttributes將舊映射投影到新的網格上。

+0

這是一個非常好的答案!謝謝!我會探索這個!現在我正在嘗試另一種方法,即使用numpy.linalg.norm來查找歐幾里得距離,以將最短距離與起始臉進行比較。 這也適用,但排序是徑向的。試圖以一種特定的方式去實現它會花費很多代碼。這種方法要靈活得多,謝謝! – XJZeng