2013-10-15 40 views
1

我正在通過Three.js加載網格,並試圖單獨對每個四邊形進行紋理化。現在,我可以紋理每張臉(三),但我不知道如何確定當前和最後一個三角形是否是四邊形的一部分(它們將共享兩個頂點,但是哪些頂點?)查找網格中的所有四邊形

如何可以我想知道兩個三角形是否構成一個四邊形?

var last = null; 
for(var i in geometry.faces) 
{ 
    var face = geometry.faces[i]; 
    var normal = face.normal.clone().normalize(); 

    if(normal.y >= 0.9999) 
    { 
     face.materialIndex = 1; 

     //Determine if face & last are part of a quad 
     if(face && last == same quad) 
     { 
      face.color = last.color; 
     } 
     else 
     { 
      face.color = new THREE.Color(Math.random() * 0xFFFFFF); 
     } 

     last = face; 
    } 
} 

回答

1

首先,您需要認識到問題未定義。在連接的三角形網格中,每個三角形都有3個鄰居。他們每個人都可能是四人組。所以你只能猜測什麼是四邊形。您選擇檢查正常是一個好的開始,但如果網格是飛機,則不起作用。

第一步是找出每個三角形的所有鄰居。每個三角形恰好有3個鄰居。這是一個有趣的兩遍算法,它應該在時間和內存上是線性的。每個三角形應該有像鄰居[3] - 這是其他三角形的索引。

然後,您可以計算每個人的「四元」啓發式。它們應該大致共面和矩形。我會用法線和四邊的內角來得分。一旦你有了這些,你可以用這個數字來排列所有的三角形。首先刪除最佳猜測,將它們合併爲一個四邊形,然後繼續前進直到完成。

這應該在大多數情況下都可以工作,但會出現這種情況。根據你爲什麼需要四邊形,你可以嘗試修復你的啓發式功能,以適應你的情況。但重要的是要記住,沒有正確的解決方案。問題在定義之下。

+0

謝謝,我認爲你是對的,這是用戶定義的問題。我可能需要重新思考我是如何努力做到這一點的,如果沒有別的辦法,可以獲得更大的靈活性。 – Shadda

+0

順便說一句,我只記得一些3d軟件包會將這些信息導出爲「平滑組」。具有相同組ID的三角形是一個原始多邊形。我不知道three.js是否暴露了這個。 – starmole