2017-09-23 77 views
1

我目前正在研究讀取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沒有成功執行。 你有什麼想法爲什麼會發生這種情況。我在代碼中忘記了什麼嗎?

回答

1

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