2017-09-23 4 views
1

Ich arbeite derzeit an der Druckschleife meiner Software, die 3D-Obj-Datei liest. Ich habe meine Obj-Datei in der Variablen tie gelesen. Diese Variable enthält eine OpenGL-Liste. Mein Ziel ist es, mit Hilfe der Tastatur in der Lage zu sein, das gelesene Objekt zu bewegen. Das Lesen der Tastatur ist korrekt implementiert (ich kann durch die Protokolle sehen).Unerwartete gluLookAt Verhalten mit einem Punkt auf OpenGL zeichnen

Ausgabe

Wenn ich den folgenden Code Schleife zu kompilieren, die gluLookAt exucute richtig und ich bin in der Lage, indem der Wert der Parameter um meine Aufgabe zu bewegen.

glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 
      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) ; 
      glMatrixMode(GL_PROJECTION); 
      glLoadIdentity(); 
      light(); 
      gluPerspective (60.0, 250/(float)250, 0.1, 500.0); 
      glMatrixMode(GL_MODELVIEW); 
      glLoadIdentity(); 
      gluLookAt(eyeX,eyeY,eyeZ,eyeX+directionX,eyeY+directionY,eyeZ+directionZ,upX,upY,upZ); 

      glPushMatrix(); 
      glRotated(45,0,0,1); 
      glTranslated(0,0,50); 
      glBindTexture(GL_TEXTURE_2D,texture1); 
      //glCallList(xwing); //ICI 
      glEnd(); 
      glPopMatrix(); 
       glColor3d(1,1,1); 
       glDisable(GL_LIGHTING); 
       glBindTexture(GL_TEXTURE_2D,texture2); 
       GLUquadric* params = gluNewQuadric(); 
       gluQuadricDrawStyle(params,GLU_FILL); 
       gluQuadricTexture(params,GL_TRUE); 
       gluSphere(params,100,20,20); 
       gluDeleteQuadric(params); 
       glEnable(GL_LIGHTING); 
      glBindTexture(GL_TEXTURE_2D,texture1); 
      glCallList(tie); //ICI 
      glPointSize(5.0); 
      glBegin(GL_POINTS); 
       glColor3f(1.0f,0.0f,0.0f); 
       glVertex3f(-1.0f,0.0f,0.0f); 
      glEnd(); 


      SwapBuffers(hDC); 
     //} //else 
     Sleep(1); 

Aber wenn ich diese 4 Zeilen Kommentar:

glBegin(GL_POINTS); 
       glColor3f(1.0f,0.0f,0.0f); 
       glVertex3f(-1.0f,0.0f,0.0f); 
glEnd(); 

Mein Objekt mehr bewegt sich nicht. Als ob gluLookAt nicht ausgeführt werden konnte. Haben Sie eine Idee, warum das passiert? Habe ich etwas in meinem Code vergessen?

Antwort

1

glBegin und glEnd begrenzen Sie die Scheitelpunkte, die ein Grundelement oder eine Gruppe ähnlicher Grundelemente definieren. Sie müssen sicherstellen, dass jedem glBegin ein glEnd folgt.
Das bedeutet, wenn Ihr Display Lists einen glBegin enthält, sollte es auch einen glEnd enthalten. Ich empfehle dringend, es so zu machen. Die andere Möglichkeit wäre es nach glCallList manuell zu tun:

glCallList(tie); 
glEnd(); 


glPushMatrix und glPopMatrix werden verwendet, um Push-Matrizen auf und Pop-Matrizen aus dem Matrix-Stack. Wenn Sie der Ansichtsmatrix eine Modellmatrix hinzufügen möchten, müssen Sie die folgenden Schritte ausführen.

  • Drücken Sie die Ansichtsmatrix glPushMatrix. Dies verschiebt eine Kopie der Ansichtsmatrix auf den Stapel.
  • Fügen Sie die Modellmatrix auf die aktuelle Ansicht Matrix (glRotated, glTranslated, ...)
  • das Modell ziehen. (glCallList, gluSphere, ...)
  • Stellen Sie die ursprüngliche Ansichtsmatrix wieder her (glPopMatrix).


Passen Sie Ihren Code irgendwie wie folgt aus:

// set up view matrix 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
gluLookAt(eyeX,eyeY,eyeZ,eyeX+directionX,eyeY+directionY,eyeZ+directionZ,upX,upY,upZ); 

// save view matrix 
glPushMatrix(); 

// add model matrix 
glRotated(45,0,0,1); 
glTranslated(0,0,50); 

// do the drawing 
glColor3d(1,1,1); 
glDisable(GL_LIGHTING); 
glBindTexture(GL_TEXTURE_2D,texture2); 
GLUquadric* params = gluNewQuadric(); 
gluQuadricDrawStyle(params,GLU_FILL); 
gluQuadricTexture(params,GL_TRUE); 
gluSphere(params,100,20,20); 
gluDeleteQuadric(params); 
glEnable(GL_LIGHTING); 
glBindTexture(GL_TEXTURE_2D,texture1); 
glCallList(tie); 
glEnd(); // <-- maybe this could be done in "tie" 

// restore the view matrix 
glPopMatrix(); 
+0

Vielen Dank. Tatsächlich benutzte ich in meiner Listenerstellungsfunktion zuerst 'glEndList' und dann' glEnd'. Also 'glEnd' war kein Anruf in meiner Schleife. Danke –

+0

@GuillaumeMILAN Gern geschehen. – Rabbid76

Verwandte Themen