2013-06-24 80 views
0

我導入FBX模型作爲XNA模型對象,並通過vertexbuffer閱讀來獲取三角形,指數,UV的保持,並把它放到我的自定義模型類中。問題是緩衝區只保存每個三角形的數據,而不是他們曾經在3dsmax中使用的四邊形數據。閱讀在XNA從FBX文件四邊形,或將一個三角多邊形網格成四邊形

我需要保留四邊形結構以使用網格。以下幾點是我相信我可以實現的不同方式,但我需要一些幫助才能完成。

  1. 我試過的一種方法是在三角形出現的順序中簡單地創建四邊形。這適用於具有正確的頂點/三角形順序的原始圖元,其中四邊形的每個三角形都依次排列,但編輯的網格具有阻礙流動的障礙順序。如果有人知道如何在導出之前重新排列頂點/三角形的方法,這仍然有效。

  2. 有沒有什麼方法可以讀取FBX文件(假如它作爲模型對象加載後,避免重寫單獨的模型管道)哪些三角形連接爲四邊形?

  3. 的 '編碼' 的方式。給定一個頂點/索引列表,相應地對它們進行排序,以使四元結構變得明顯。 3dsmax有一個'quadrify'按鈕,效果很好,但無法找到一個簡單的方法。編輯;對於這種方法,我的意思是,什麼是看三角形的無序結構,找到網的最佳「四」的版本,同樣在3DSMAX工具「quadrify」的最佳方式。

回答

1

有可能使用純索引信息以恢復信息的四 - 例如,採取分解成4個三角形兩個四芯導線的情況下。

1  2  3 
+-------+-------+ 
|\  |\  | 
| \ | \ | 
| \ | \ | 
|  \|  \| 
+-------+-------+ 
4  5  6 

現在,你的三角形(假定順時針纏繞順序)

A =(1,5,4)B =(1,2,5)C =(2,6,5) d =(2,3,6)

您的三角形的邊緣是

A =(1-5,5-4,4-1)B =(1-2,2-5,5 -1)C =(2-6,6-5,5-2)D =(2-3,3-6,6-2)

現在很容易看出哪些三角形共享邊緣

  • A和B共享正好1個邊緣1-5(因爲它是一樣的5-1)
  • B和C共享2-5
  • C和d份額2-6

基於該信息,我們可以四IFY它作爲

  • 1四=(1,2,6,5)+ 2個三角形(1,5,4)和(2,3,6)

  • 2四邊形(1,2,5,4)和(2,3,6,5)

蠻力方法是要確定所有四ifications和選擇剩下最少數量的退化三角形的那個。如果你從完美的基於四元網格開始,這應該是零。

此外,請注意,此方法僅檢查和修改索引數據。頂點總數或其值保持不變。

+0

怎麼樣一個網格有幾千個三角形,或多或少隨機的頂點順序和三角形順序?即使四邊形位於通常不在複雜模型上的網格上,它們也可能具有混合三角網。 – jsmars

+0

同樣的想法會起作用,它只會計算更多。爲了減少測試的數量,可以使用八叉樹等空間分區方案。唯一不適用的情況是當網格不共享頂點時 - 但是複製它們以形成三角形,即使是在具有共享邊的三角形上。 – Ani

+0

頂點的位置並不重要(在網格上或其他位置)。請注意,我只在上述解決方案中處理頂點索引。 – Ani