2014-05-18 14 views
6

All'inizio sembrava ovvio ... Realizza 2 triangoli per faccia ovunque siano stati trovati 4 indici, giusto?
Significato, il seguente:Convertire i quadrilateri in un file OBJ in triangoli?

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 

... sarebbe, a loro volta, hanno bisogno di essere convertito in qualcosa di simile:

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 

Questo particolare esempio, naturalmente, renderebbe correttamente.
Tuttavia, non tutti i casi sono semplici come suddividere la faccia in due facce (dove la prima faccia contiene i primi tre vertici della faccia originale e la seconda faccia contiene gli ultimi 3 vertici, come nell'esempio precedente). Prendere la seguente cubo, ad esempio:

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 

Questi volti non possono essere divisi nello stesso modo dell'esempio precedente ... Così, avrei avuto bisogno di un po 'modo di sapere come dividere una faccia quadrilatera in due triangolo facce, durante l'utilizzo degli indici corretti per il secondo volto ...

Come può essere ottenuto? Si prega di notare che NON sto usando la pipeline a funzione fissa, e quindi, l'uso di GL_QUADS NON è un'opzione. Il mio motore di rendering è praticamente bloccato solo usando GL_TRIANGLES.

+0

Capisco la confusione qui, passo la ultimi due giorni cercando di capirlo. Questi non sono QUAD ma strisce triangolari, la documentazione è molto scarsa su questo. – Geoffrey

risposta

9

Se si dispone di 4 indici, es .:

0 1 2 3 

La divisione in due triangoli sarebbe uno con i primi 3 indici, e uno con il primo, terzo, e quarto. In questo esempio:

0 1 2 
0 2 3 

Proviamo un po 'arte ASCII per illustrare questo:

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

Qui sotto potete vedere 0 1 2 3 come il quad, 0 1 2 come il primo triangolo (in basso a destra), e 0 2 3 come il secondo triangolo (in alto a sinistra).

Più in generale, per le facce con n vertici, si genera triangoli:

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

Se non si ostini a triangoli separati, è possibile utilizzare anche GL_TRIANGLE_FAN primitive, che sono ancora in nucleo OpenGL. In questo modo, puoi disegnare qualsiasi poligono convesso con una ventola a triangolo, utilizzando la sequenza di indici originale. Quindi un fan del triangolo con sequenza vertice 0 1 2 3 descrive il quad in questo caso e si generalizza molto facilmente alle facce con più di 4 vertici.

Modifica: poiché sembra che tu abbia ancora problemi, vediamo come questo si applica all'esempio nel tuo post. Elencherò la sequenza indice originale del quad per ogni faccia e la sequenza indice per i due triangoli dopo aver diviso il quad.

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) 

Mi sembra corretto quando disegno il cubo. Ricorda di sottrarre 1 dagli indici a tuo uso, poiché questi sono indici basati su 1 e quasi certamente avrai bisogno di indici basati su 0.

+1

Sei sicuro che sia corretto per tutti i casi? Nel mio ultimo esempio di "cubo" sopra, ciò renderebbe una delle facce in modo errato, risultando in un "angolo di taglio" su un lato del cubo (anche con GL_TRIANGLE_FAN). Quindi qualcos'altro è sbagliato con il mio codice, o l'oggetto stesso, o la tua risposta non gestisce tutti i casi. – RectangleEquals

+2

Con quale faccia hai un problema? L'ho abbozzato, e tutto sembra a posto quando si usano indici basati su 0. Ma il file di esempio che hai postato è effettivamente rotto perché gli indici nei file OBJ dovrebbero essere basati su 1. Ecco un esempio di cubo: http://people.sc.fsu.edu/~jburkardt/data/obj/cube.obj. Definizione del formato file: http://www.fileformat.info/format/wavefrontobj/egff.htm. –

+0

Grazie, ti darò un'occhiata e ti risponderò – RectangleEquals

0

Scrivere il mio obj loader e leggere le specifiche con molta attenzione, i dettagli sul parametro 'f' sono molto vaghi, specialmente vedere alcuni file contengono linee 'f' con> 4 argomenti su di essi.

Si scopre che questi sono in realtà una striscia triangolare in un ordine dispari. conversione corretta a triangoli è la seguente (codice pseudo):

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] 
    ]; 

Esempio:

f: A B C D E F G 

sarebbero i seguenti 5 triangoli:

A B C 
A C D 
B D E 
C E F 
D F G 
Problemi correlati