2017-06-09 51 views
2

在pygame中,我創建了3個按鈕的主菜單,前兩個按鈕繪製2D圖形,如果按「退格」或「退出」,它將返回到帶有三個按鈕的主菜單。最後一個(第三個)按鈕從STL文件繪製3D網格。 main menu ____________________________ 圖1:主菜單。 ____________________________ A button pressed. ____________________________ 圖2:按下「A」按鈕時。 ____________________ B button pressed. ____________________________ 圖3:當 「B」 按鈕按下 _____________________ 3D button pressed. ____________________________ 圖4:當 「3D」 按鈕按下 _____________________如何在OpenGL和pygame的3D網格之後繪製2D圖像?

問題:我可以很容易地導航在第一個和第二個按鈕之間,但是如果我至少一次繪製3D網格,那麼我可以按下第一個和第二個按鈕。

代碼繪製三維網格:(不幸的是我不能給整個代碼上傳由於私人數據)

def main(): 
pygame.init() 
pygame.display.set_mode(display, DOUBLEBUF|OPENGL) 

# Using depth test to make sure closer colors are shown over further ones 
glEnable(GL_DEPTH_TEST) 
glDepthFunc(GL_LESS) 

# Default view 
glMatrixMode(GL_PROJECTION) 
gluPerspective(45, (display[0]/display[1]), 0.5, 40) 
glTranslatef(0.0,0.0,-17.5) 



inc_x = 0 
inc_y = 0 
accum = (1,0,0,0) 

intro = True 
while intro: 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      pygame.quit() 
      quit() 


     if event.type == pygame.KEYDOWN: 
      #Rotating about the x axis 
      if event.key == pygame.K_UP: 
       inc_x = pi/100 
      if event.key == pygame.K_DOWN: 
       inc_x = -pi/100 

      # Rotating about the y axis 
      if event.key == pygame.K_LEFT: 
       inc_y = pi/100 
      if event.key == pygame.K_RIGHT: 
       inc_y = -pi/100 
      # Reset to default view 
      if event.key == pygame.K_SPACE: 
       accum = (1,0,0,0);inc_x = 0.0;inc_y = 0.0; 



      if event.key == K_BACKSPACE or event.key == pygame.K_ESCAPE: 
       intro = False; 

       glDisable(GL_DEPTH_TEST) 
       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_ACCUM_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 
       glMatrixMode(GL_MODELVIEW) 
       game_intro(); 



     if event.type == pygame.KEYUP: 
      # Stoping rotation 
      if event.key == pygame.K_UP or event.key == pygame.K_DOWN: 
       inc_x = 0.0 
      if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT: 
       inc_y = 0.0 

     if event.type == pygame.MOUSEBUTTONDOWN: 
      if event.button == 1: 
       inc_y = pi/100 

      if event.button == 3: 
       inc_y = -pi/100 

      if event.button == 4: 
       inc_x = pi/100 

      if event.button == 5: 
       inc_x = -pi/100 



    rot_x = normalize(axisangle_to_q((1.0,0.0,0.0), inc_x)) 
    rot_y = normalize(axisangle_to_q((0.0,1.0,0.0), inc_y)) 
    accum = q_mult(accum,rot_x) 
    accum = q_mult(accum,rot_y) 

    glMatrixMode(GL_MODELVIEW) 
    glLoadMatrixf(q_to_mat4(accum)) 

    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT) 
    triangle() 
    pygame.display.flip() 
    pygame.time.wait(10) 
    game_intro() 

我的想法有關問題:我會承擔我當我在我的應用程序中渲染多邊形時,由於啓用了深度測試和混合,所以存在問題。 我試圖禁用深度測試和混合。

  glDisable(GL_DEPTH_TEST) 
      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_ACCUM_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 
      glMatrixMode(GL_MODELVIEW) 
      game_intro(); 

此外,我曾嘗試使用以及功能glDrawPixels和glCopyPixels,以恢復正常的2D模式,但沒有奏效。

回答

1

它看起來像按鈕A和按鈕B觸發調用以在屏幕平面上繪製一個繪圖(這是一個2D繪製,需要一個orphographic投影)。根據您的代碼,按鈕C會觸發一個調用以使用透視圖矩陣呈現3D模型。

當您在渲染調用之間切換時,您需要確保適當地重置視圖矩陣(在調用按鈕A/B渲染代碼之前設置一個orphographic投影矩陣)。看起來您可能忘記將視圖矩陣設置爲按鈕A/B觸發的呈現代碼之前的一個orphographic投影。因此,在按鈕C的結果之後按下按鈕A和按鈕B時,它正在嘗試使用之前設置的透視投影矩陣進行渲染,從而給出奇怪的結果。

您必須創建一個正交投影矩陣並在2D渲染之前加載它。您可以在2D代碼片段中設置矩陣模式後調用gluOrtho2D進行設置,類似於您在3D代碼片段中調用gluPerspectiveThis page describes in great detail如何創建所需的正交矩陣(導航到投影矩陣(GL_PROJECTION)部分以獲取詳細解釋和示例代碼)。

+0

非常感謝您的快速響應。我對正投影和透視圖矩陣有同樣的想法。這就是爲什麼問上述問題的原因,我不知道將透視視圖矩陣OFF和正交投影ON轉換的功能。我使用的是不到2周的openGl,所以我對它很陌生。正如您所建議的,我試圖遵循代碼,但不幸的是,問題依然如此: glMatrixMode(GL_PROJECTION); gluOrtho2D(45,(顯示[0] /顯示[1]),0。5,40) –

+0

確保將參數設置爲gluOrtho2D正確。檢查api,簽名是:gluOrtho2D(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top)。您必須根據您使用的座標系進行設置。例如。 (-1,1,-1,1),屏幕中心爲(0,0),右上角爲(1,1),左下角爲(-1,-1)。這種情況必須與用於繪製情節的座標一致。即無論是使用屏幕座標還是使用-1到1,如本例中所示。 – sparkplug