2014-05-18 4 views
6

Zuerst schien es offensichtlich ... Machen Sie 2 Dreiecke pro Gesicht, wo immer 4 Indizes gefunden wurden, oder?
Bedeutung, die folgenden:Konvertieren von Quadrilateralen in einer OBJ-Datei in Dreiecke?

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 

Dieses spezielle Beispiel, würde natürlich machen richtig:

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 

... würde wiederum werden müssen wie in etwas umgewandelt.
Allerdings sind nicht alle Fälle so einfach wie das Teilen des Gesichts in zwei Flächen (wobei die erste Fläche die ersten drei Eckpunkte der ursprünglichen Fläche enthält und die zweite Fläche die letzten drei Eckpunkte, wie im obigen Beispiel). Nehmen Sie den folgenden Würfel, zum Beispiel:

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 

Diese Flächen können nicht die gleiche Art und Weise im vorherigen Beispiel aufgeteilt werden ... Also, ich würde einen Weg brauche, zu wissen, wie ein Viereck Gesicht in zwei Dreiecksflächen, unter Verwendung der richtigen Indizes für die zweite Seite ...

Wie kann dies erreicht werden? Bitte beachten Sie, dass ich die Pipeline mit fester Funktion NICHT verwende und daher GL_QUADS KEINE Option ist. Meine Rendering-Engine bleibt nur bei der Verwendung von GL_TRIANGELS hängen.

+0

ich die Verwirrung hier verstehen, verbringe ich die die letzten zwei Tage versuchen, das herauszufinden. Dies sind keine QUADs, sondern Dreiecksstreifen, die Dokumentation ist sehr schlecht. – Geoffrey

Antwort

9

Wenn Sie 4-Indizes haben, z.B .:

0 1 2 3 

Die Aufteilung in zwei Dreiecken ein mit den ersten drei Indizes sein würde, und ein mit dem ersten, dritten und vierten Platz. In diesem Beispiel:

0 1 2 
0 2 3 

Lassen Sie uns einige ASCII-Kunst versuchen, dies zu veranschaulichen:

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

Hier sehen Sie 0 1 2 3 als Quad, 0 1 2 als das erste Dreieck (unten rechts) und 0 2 3 als die zweites Dreieck (oben links).

Allgemeiner für Flächen mit n Ecken, erzeugen Sie Dreiecke:

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

Wenn Sie nicht darauf bestehen, auf separaten Dreiecke können Sie auch GL_TRIANGLE_FAN Primitiven verwendet werden, die nach wie vor in Kern OpenGL sind. Auf diese Weise können Sie jedes konvexe Polygon mit einem Dreiecksfächer zeichnen, indem Sie die ursprüngliche Reihenfolge der Indizes verwenden. So beschreibt ein Dreiecksfächer mit der Vertex-Sequenz 0 1 2 3 in diesem Fall das Quad und verallgemeinert sich sehr leicht auf Flächen mit mehr als 4 Ecken.

Bearbeiten: Da Sie immer noch Probleme zu haben scheinen, sehen wir, wie dies für das Beispiel in Ihrem Beitrag gilt. Ich werde die ursprüngliche Indexsequenz des Quads für jedes Gesicht und die Indexsequenz für die zwei Dreiecke nach dem Aufspalten des Quads auflisten.

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) 

Das sieht richtig aus, wenn ich den Würfel zeichne. Denken Sie daran, 1 von den Indizes für Ihre Verwendung zu subtrahieren, da dies 1-basierte Indizes sind, und Sie werden fast sicher 0-basierte Indizes benötigen.

+1

Sind Sie sicher, dass dies in allen Fällen richtig ist? In meinem letzten "Würfel" -Beispiel oben würde dies eine der Flächen falsch darstellen, was zu einer "abgeschnittenen Ecke" auf einer Seite des Würfels führen würde (sogar mit GL_TRIANGLE_FAN). Entweder stimmt etwas anderes mit meinem Code oder dem Objekt selbst nicht oder Ihre Antwort behandelt nicht alle Fälle. – RectangleEquals

+2

Mit welchem ​​Gesicht hast du ein Problem? Ich habe es skizziert und es sieht alles gut aus, wenn 0-basierte Indizes verwendet werden. Aber die von Ihnen gepostete Beispieldatei ist in der Tat defekt, weil Indizes in OBJ-Dateien 1-basiert sein sollen. Hier ist ein Würfel Beispiel: http://people.sc.fsu.edu/~jburkardt/data/obj/cube.obj. Dateiformatdefinition: http://www.fileformat.info/format/wavefrontobj/egff.htm. –

+0

Danke, ich werde mir das ansehen und ich melde mich bei dir. – RectangleEquals

0

Ich schreibe meinen eigenen Obj Loader und lese die Spezifikation sehr sorgfältig, die Details auf dem Parameter 'f' sind sehr vage, besonders da einige Dateien 'f' Zeilen mit> 4 Argumenten enthalten.

Stellt sich heraus, dass dies tatsächlich ein Dreieck in einer ungeraden Reihenfolge sind. Die korrekte Umwandlung in Dreiecke ist wie folgt (Pseudo-Code):

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

Beispiel:

f: A B C D E F G 

Würden die folgenden 5 Dreiecke:

A B C 
A C D 
B D E 
C E F 
D F G 
Verwandte Themen