2014-05-18 96 views
6

起初,看起來很明顯......只要找到4個指標,每個臉部都做2個三角形,對吧?
含義,以下內容:將OBJ文件中的四角形轉換爲三角形?

v 1.000000 1.000000 0.000000 
v -1.000000 1.000000 -0.000000 
v 1.000000 -1.000000 0.000000 
v -1.000000 -1.000000 -0.000000 
f -4 -3 -2 -1 

...將反過來,需要轉換成類似:

v 1.000000 1.000000 0.000000 
v -1.000000 1.000000 -0.000000 
v 1.000000 -1.000000 0.000000 
v -1.000000 -1.000000 -0.000000 
f -4 -3 -2 
f -2 -3 -1 

這個特殊的例子,當然會正確地呈現。然而,並非所有情況都像將面分割成兩個面(其中第一面包含原始面的前三個頂點,並且第二麪包含最後3個頂點,如上述示例)一樣簡單。看看下面的立方體,例如:

v 0.000000 1.000000 1.000000 
v 0.000000 0.000000 1.000000 
v 1.000000 0.000000 1.000000 
v 1.000000 1.000000 1.000000 
v 0.000000 1.000000 0.000000 
v 0.000000 0.000000 0.000000 
v 1.000000 0.000000 0.000000 
v 1.000000 1.000000 0.000000 
f 1 2 3 4 
f 8 7 6 5 
f 4 3 7 8 
f 5 1 4 8 
f 5 6 2 1 
f 2 6 7 3 

這些面不能在前面的例子中相同的方式分割......所以,我需要知道如何四邊形面分割成兩個三角形面臨的一些方法,同時使用正確指數的第二張臉......

這怎麼能實現? 請注意,我沒有使用固定功能管道,因此使用GL_QUADS不是一個選項。我的渲染引擎幾乎堅持只使用GL_TRIANGLES。

+0

我明白這裏的混亂,我花最近兩天試圖弄清楚這一點。這些不是QUADs,而是三角形條,文檔很差。 – Geoffrey

回答

9

如果你有4個指標,例如:

0 1 2 3 

劃分成兩個三角形是一個與第3個指標,和一個與第一,第三和第四。在這個例子中:

0 1 2 
0 2 3 

讓我們嘗試一些ASCII藝術來說明這一點:

3-------2 
|  /| 
| /| 
|/ | 
|/  | 
0-------1 

這裏你可以看到0 1 2 3爲四,0 1 2作爲第一個三角形(右下)和0 2 3作爲第二個三角形(左上角)。

更一般地,對於n頂點的面孔,你產生的三角形:

0 (i) (i + 1) [for i in 1..(n - 2)] 

如果你沒有在單獨的三角形堅持,你也可以使用GL_TRIANGLE_FAN元,這仍然是核心的OpenGL。這樣,您可以使用原始索引序列繪製具有三角形扇形的任何凸多邊形。因此,一個頂點序列0 1 2 3的三角形風扇在這種情況下描述了四邊形,並且它很容易推廣到具有四個以上頂點的面。

編輯:由於您仍然有問題,讓我們看看這是如何適用於您的文章中的示例。我將列出每個面的四邊形原始索引序列以及分割四邊形後兩個三角形的索引序列。

f 1 2 3 4 --> (1 2 3) (1 3 4) 
f 8 7 6 5 --> (8 7 6) (8 6 5) 
f 4 3 7 8 --> (4 3 7) (4 7 8) 
f 5 1 4 8 --> (5 1 4) (5 4 8) 
f 5 6 2 1 --> (5 6 2) (5 2 1) 
f 2 6 7 3 --> (2 6 7) (2 7 3) 

我繪製立方體時看起來是正確的。請記住從索引中減去1以供您使用,因爲這些索引是基於1的索引,您幾乎肯定需要基於0的索引。

+1

你確定這對所有情況都是正確的嗎?在我上面的最後一個「立方體」示例中,這將錯誤地渲染其中一個面,導致立方體的一側出現「切角」(即使使用GL_TRIANGLE_FAN)。因此,無論是我的代碼或對象本身有其他問題,或者您的答案不能處理所有情況。 – RectangleEquals

+2

哪張臉你有問題?我草繪了它,使用基於0的索引時,它看起來都很好。但是你發佈的示例文件確實被破壞了,因爲OBJ文件中的索引應該是基於1的。以下是一個立方體示例:http://people.sc.fsu.edu/~jburkardt/data/obj/cube.obj。文件格式定義:http://www.fileformat.info/format/wavefrontobj/egff.htm。 –

+0

謝謝,我會看看那個,我會回覆你 – RectangleEquals

0

編寫我自己的obj加載程序並仔細閱讀規範,'f'參數的細節非常模糊,尤其是看到一些文件包含帶有> 4個參數的'f'行。

原來,這些實際上是一個奇數順序的三角形帶。正確轉化爲三角形如下(僞碼):

n = 0; 
triangles[n++] = [values[0], values[1], values[2]]; 
for(i = 3; i < count(values); ++i) 
    triangles[n++] = [ 
    values[i - 3], 
    values[i - 1], 
    values[i] 
    ]; 

實施例:

f: A B C D E F G 

將是以下5個三角形:

A B C 
A C D 
B D E 
C E F 
D F G