2016-06-20 10 views
1

Ich habe meine eigenen Vertices, Farben und Indizes erstellt, die mit OpenGL gerendert werden. Hier sind Quellcodes zum Rendern von Scheitelpunkten, Farben und Indizes.OpenGL Vertices und Indizes zu Wavefront Obj

//CODES TO SET VBO.... 
void displayCallback() {  
    glVertexPointer(...); 
    glColorPointer(...); 
    glDrawElemnts(GL_TRIANGLE_STRIP,...); 
} 

Wie Sie sehen können, werden Indizes als GL_TRIANGLE_STRIP bauen werden und wiedergegeben werden. Nach dem Rendern möchte ich die Wavefront-Objektdatei mit Vertex-, Index- und Farbdaten speichern.

Ich habe versucht, .obj Datei lügen dies zu machen.

for(int i = 0; i < vertexSize; ++i) { 
    fprintf(fp, "v %f %f %f\n", vertices[i*3], vertices[i*3+1], vertices[i*3+2]); 
} 

fprintf("fp, "s 1\n"); 

for(int i = 0; i < indexSize; ++i) { 
    fprintf(fp, "f %d %d %d\n", indices[i*3], indices[i*3+1], indices[i*3+2]); 
} 

Ich habe versucht, es wieder zu öffnen Viewer assimp, (http://www.assimp.org/) es konnte nicht geladen werden. Fehle ich etwas?

Danke.

Antwort

2

Bitte fügen Sie eine einfache Beispiel-OBJ-Datei (als Code wie Cube) hinzu, damit wir sehen können, was die Datei enthält. Um zu sehen, was ich damit meine, einen Blick auf:

Meine Wette ist, dass Sie falsch Indizes bekam.

  1. GL_TRIANGLE_STRIP hat 1 Vertex pro Dreieck nicht 3

    Nach OpenGL doc Ein Eckpunkt Strom n Länge wird n-2 Dreiecke mit GL_TRIANGLE_STRIP erzeugen.

  2. Wavefront OBJ-Datei-Indizes werden ab 1

    So werden Sie wahrscheinlich Indizierung von 0 so für das überprüfen ... und +1 oder nicht entsprechend verwenden.

Ich weiß nicht, Ihre Datenstruktur Architektur/Topologie, aber meiner Meinung nach sollten Ihre Gesichter wie diese gespeichert werden (nicht getestet, da ich Sie nicht Arrays/Tabellen und Modell) geputtet # 1, # 2 zusammen:

fprintf(fp, "f %d %d %d\n", indices[0]+1, indices[1]+1, indices[2]+1); 
for(int i = 3; i < indexSize; i++) 
fprintf(fp, "f %d %d %d\n", indices[i-2]+1, indices[i-1]+1, indices[i]+1); 

Farbdaten

Für diese Wellenfront obj wird mit Material Erweiterungen in separaten Dateien mtl, stl (ich mit denen leider nicht vertraut bin ...), Aber heutzutage 3D-Scanner direkt ohne Papiere Farbcodierung verwenden innerhalb OBJ-Dateien (von einigen Zuschauern unterstützt) es wie dies geschehen ist:

v -5.231932 438.659877 -432.038039 0.000000 1.000000 0.000000 

Also, wenn Vertex hat 6 die erste 3 sind x,y,z koordiniert und letzte 3 sind r,g,b so Würfel aus verknüpften Antwort in rot gefärbt wird

v -1.0 -1.0 -1.0 1 0 0 
v +1.0 -1.0 -1.0 1 0 0 
v +1.0 +1.0 -1.0 1 0 0 
v -1.0 +1.0 -1.0 1 0 0 
v -1.0 -1.0 +1.0 1 0 0 
v +1.0 -1.0 +1.0 1 0 0 
v +1.0 +1.0 +1.0 1 0 0 
v -1.0 +1.0 +1.0 1 0 0 

f 1 2 3 4 
f 5 6 7 8 
f 1 2 6 5 
f 2 3 7 6 
f 3 4 8 7 
f 4 1 5 8 

Sie können es in Ihrem Viewer versuchen, zu überprüfen, ob es eine solche Codierung unterstützt ... ich auf einigen Low-Cost 3D-Scanner-Anwendungen gesehen, dass sie eine solche, wo der Lage zu retten Dateien, aber nach dem Neuladen i nicht in der Lage, die Farben zu rendern ...

+0

Problem passiert, weil falsche Indizierung, beginnt mit 0. Und es ist jetzt gelöst. Vielen Dank! –