2013-11-02 12 views
7

Ich versuche, 2 Kästchen in OpenGL zu erstellen, aber sie erscheinen von innen nach außen und manchmal überlappen sie nicht richtig. Video http://www.youtube.com/watch?v=IVJu4zJFp7QOpenGL rendert Kästchen inside-out

Ich vermute, es ist eine Tiefe Problem, aber ich konnte nicht herausfinden, was ich falsch mache.

Hier ist der Code, den ich zu initialisieren bin mit:

glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); 

glDisable(GL_CULL_FACE); 
glEnable(GL_DEPTH_TEST); 

Hier ist meine distplay Funktion glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); 

drawYellowBox(); 
drawBlueBox(); 

Und der Code, den ich mit den Formen zeichnen:

glPushMatrix(); 
    glBegin(GL_QUADS); 

     glColor3f(0.15, 0.15, 0.0); 
     // draw front 
     glVertex3f(-1.0, -1.5, 1.0); 
     glVertex3f(1.0, -1.5, 1.0); 
     glVertex3f(0.75, 1.5, 0.75); 
     glVertex3f(-0.75, 1.5, 0.75); 

     glColor3f(0.3, 0.3, 0.0); 
     // draw back 
     glVertex3f(1.0, -1.5, -1.0); 
     glVertex3f(-1.0, -1.5, -1.0); 
     glVertex3f(-0.75, 1.5, -0.75); 
     glVertex3f(0.75, 1.5, -0.75); 

     glColor3f(0.45, 0.45, 0.0); 
     // draw left 
     glVertex3f(-1.0, -1.5, -1.0); 
     glVertex3f(-1.0, -1.5, 1.0); 
     glVertex3f(-0.75, 1.5, 0.75); 
     glVertex3f(-0.75, 1.5, -0.75); 

     glColor3f(0.6, 0.6, 0.0); 
     // draw right 
     glVertex3f(1.0, -1.5, 1.0); 
     glVertex3f(1.0, -1.5, -1.0); 
     glVertex3f(0.75, 1.5, -0.75); 
     glVertex3f(0.75, 1.5, 0.75); 

     glColor3f(0.75, 0.75, 0.0); 
     // draw top 
     glVertex3f(-0.75, 1.5, 0.75); 
     glVertex3f(0.75, 1.5, 0.75); 
     glVertex3f(0.75, 1.5, -0.75); 
     glVertex3f(-0.75, 1.5, -0.75); 

     glColor3f(0.9, 0.9, 0.0); 
     // draw bottom 
     glVertex3f(-1.0, -1.5, -1.0); 
     glVertex3f(1.0, -1.5, -1.0); 
     glVertex3f(1.0, -1.5, 1.0); 
     glVertex3f(-1.0, -1.5, 1.0); 
    glEnd(); 

glPopMatrix(); 

glPushMatrix(); 
    glTranslatef(0.0,2.5,0.0); 
    glRotatef(joint_ui_data->getDOF(Keyframe::HEAD), 0.0, 1.0, 0.0); 


    glBegin(GL_QUADS); 

     glColor3f(0.0, 0.15, 0.15); 
     // draw front face 
     glVertex3f(-0.8, -0.45, 0.8); 
     glVertex3f(0.8, -0.45, 0.8); 
     glVertex3f(0.75, 0.45, 0.75); 
     glVertex3f(-0.75, 0.45, 0.75); 

     glColor3f(0.0, 0.3, 0.3); 
     // draw back face 
     glVertex3f(0.8, -0.45, -0.8); 
     glVertex3f(-0.8, -0.45, -0.8); 
     glVertex3f(-0.75, 0.45, -0.75); 
     glVertex3f(0.75, 0.45, -0.75); 

     glColor3f(0.0, 0.45, 0.45); 
     // draw left face 
     glVertex3f(-0.8, -0.45, -0.8); 
     glVertex3f(-0.8, -0.45, 0.8); 
     glVertex3f(-0.75, 0.45, 0.75); 
     glVertex3f(-0.75, 0.45, -0.75); 

     glColor3f(0.0, 0.6, 0.6); 
     // draw right face 
     glVertex3f(0.8, -0.45, 0.8); 
     glVertex3f(0.8, -0.45, -0.8); 
     glVertex3f(0.75, 0.45, -0.75); 
     glVertex3f(0.75, 0.45, 0.75); 

     glColor3f(0.0, 0.75, 0.75); 
     // draw top 
     glVertex3f(-0.75, 0.45, 0.75); 
     glVertex3f(0.75, 0.45, 0.75); 
     glVertex3f(0.75, 0.45, -0.75); 
     glVertex3f(-0.75, 0.45, -0.75); 

     glColor3f(0.0, 0.9, 0.9); 
     // draw bottom 
     glVertex3f(-0.8, -0.45, -0.8); 
     glVertex3f(-0.8, -0.45, 0.8); 
     glVertex3f(0.8, -0.45, 0.8); 
     glVertex3f(0.8, -0.45, -0.8); 
    glEnd(); 
glPopMatrix(); 

Danke.

Antwort

8

das Problem in der liegt Befehl senden Sie Ihre Eckpunkte.

Wie Sie in Ihrem Code sehen können, ist die Eckenreihenfolge Ihrer Vorderseite.

// Front 
glVertex3f(-1.0, -1.5, 1.0); // Left Top 
glVertex3f(1.0, -1.5, 1.0); // Right Top 
glVertex3f(0.75, 1.5, 0.75); // Right Bottom 
glVertex3f(-0.75, 1.5, 0.75); // Left Bottom 

Wie wir Ihr in diesem Stück Code sendet den Eckpunkten im Uhrzeigersinn sehen können. OpenGL liest standardmäßig alle Polygone gegen den Uhrzeigersinn. Deshalb sind alle gegenüberliegenden Gesichter entfernt/versteckt (weggeworfen).

Um dies zu beheben, können Sie 1 von 2 Dinge tun.

  1. Ändern Sie den Modus von glFrontFace() so es GL_CW wird, statt GL_CCW. Bedenken Sie jedoch, dass die Änderung alles, was nach dem Anruf glFrontFace(GL_CW) kommt, so dass Sie wieder glFrontFace(GL_CCW) anrufen, wenn Sie an irgendeinem anderen Punkt, den Sie wieder gegen den Uhrzeigersinn wickeln.

  2. Ändern der Reihenfolge Sie senden die Eckpunkte in.

Von

// Front 
glVertex3f(-1.0, -1.5, 1.0); // Left Top 
glVertex3f(1.0, -1.5, 1.0); // Right Top 
glVertex3f(0.75, 1.5, 0.75); // Right Bottom 
glVertex3f(-0.75, 1.5, 0.75); // Left Bottom 

Um

// Front 
glVertex3f(-1.0, -1.5, 1.0); // Left Top 
glVertex3f(-0.75, 1.5, 0.75); // Left Bottom 
glVertex3f(0.75, 1.5, 0.75); // Right Bottom 
glVertex3f(1.0, -1.5, 1.0); // Right Top 

Obwohl, wenn Sie bereits Tonnen von Maschen haben, es würde wahrscheinlich viel einfacher, einfach den glFrontFace Modus zuzu ändern.

Extra-

Auch wenn Sie ändern möchten, welche Gesichter gekeult werden, können Sie auch den Modus der glCullFace ändern, entweder GL_FRONT, GL_BACK oder GL_FRONT_AND_BACK der Anfangswert GL_BACK ist.

Denken Sie daran, dass Sie glEnable(GL_CULL_FACE) aufrufen müssen, um das Aussortieren von Polygonen basierend auf ihrer Scheitelpunktwicklung zu ermöglichen.

bearbeiten

Wenn es nicht ein Vertex Wickel Problem, das es könnte (obwohl es sehr seltsam wäre), eine gründlichere Prüfung Problem sein.

Fügen Sie diesen Code zu Ihrem Initialisierungscode hinzu.

glEnable(GL_DEPTH_TEST); 
glDepthFunc(GL_LEQUAL); 
+0

Leider doesn nicht Löse das Problem nicht. Ich habe versucht, die Scheitelpunkte neu anzuordnen, aber ohne Wirkung. Das Zurückkehren zu den ursprünglichen Scheitelpunkten und das Ändern von glFrontFace in CW hat das Rendering noch immer nicht behoben. – Ares

+0

@Ares betrachten bearbeitete Antwort. – Vallentin

+0

Das war mein Problem auch. (Mit Ubuntu 16.04, Python GL und GLUT. Ich habe es getestet und isoliert, indem ich GLUT verwendet habe, um Würfel anstelle meiner eigenen Ecken zu zeichnen; wenn der eigene Würfel von GLUT von innen nach außen ist, ist es kein Problem, aber die Tiefenmarkierung muss aktiviert sein.) –

2

um dieses Problem zu beheben Sie Ihre Gesichter auf Ihrem Objekt spiegeln müssen oder Sie Normalen des Objekts auf der Hand prüfen ...

Wenn Sie eine Ebene erstellen Sie Sie eine durchschauen Seite werden feststellen können es sei denn, Sie Normalen zu der Ansicht Seite invertieren oder eine doppelseitige Lösung hinzufügen ...

ich in der Regel verwenden Away3D oder three.js für 3D-Inhalte ... sind die Prinzipien, die gleichen

+0

Ich habe versucht, die Reihenfolge der Scheitelpunkte für einige der Gesichter umzukehren, aber keinen Effekt. Liegt das an der Rückseitenkeulung? Ich versuche, die Rückseitenkeulung zu deaktivieren. – Ares

+0

Ja, das könnte eine Möglichkeit sein, würde ich eher meine Antwort in einen Kommentar setzen, aber ich kann Frage noch nicht kommen .. versuchen, durch away3D Website-Foren suchen allgemeine Probleme haben die gleichen Lösungen nur ein bisschen anders umgesetzt – Careen

1

Ich habe das Problem gefunden. Ich habe Tiefenprüfung in meiner initGlut() - Funktion anstelle der initGl() -Funktion aktiviert.

glEnable(GL_DEPTH_TEST);