意外的gluLookAt在OpenGL上绘制点的行为

问题描述:

我目前正在研究读取3D obj文件的软件的打印循环。 我已经将我的obj文件保存在变量tie中。这个变量包含一个OpenGL列表。我的目标是通过使用键盘来移动读取对象。键盘阅读正确实施(我可以通过日志看到)。意外的gluLookAt在OpenGL上绘制点的行为

问题

当我编译下面的代码回路中,gluLookAt exucute正确,我能够通过改变参数的值,在我的对象移动。

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

但是,当我评论这4条线路:

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

我的对象不动吧。仿佛gluLookAt没有成功执行。 你有什么想法为什么会发生这种情况。我在代码中忘记了什么吗?

glBeginglEnd划定定义一个基元或一组相似基元的顶点。您必须确保,每个glBegin后面跟着一个glEnd
这意味着,如果您的Display Lists包含glBegin,那么它也应包含glEnd。我强烈建议这样做。另一种可能性将是glCallList后手工进行:

glCallList(tie); 
glEnd(); 


glPushMatrixglPopMatrix用于从矩阵堆栈推进矩阵和流行矩阵。如果要将模型矩阵添加到视图矩阵,则必须执行以下步骤。

  • 推视图矩阵glPushMatrix。这会在堆栈上推送视图矩阵的副本。
  • 将模型矩阵添加到当前视图矩阵(glRotatedglTranslated,...)
  • 绘制模型。 (glCallList,gluSphere,...)
  • 恢复原始视图矩阵(glPopMatrix)。


莫名其妙地适应你的代码是这样的:

// 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

非常感谢。事实上,在我的列表创建函数中,我首先使用了“glEndList”,然后是“glEnd”。因此'glEnd'在我的循环中没有被调用。谢谢 –

+0

@GuillaumeMILAN不客气。 – Rabbid76