在pygame中,我創建了3個按鈕的主菜單,前兩個按鈕繪製2D圖形,如果按「退格」或「退出」,它將返回到帶有三個按鈕的主菜單。最後一個(第三個)按鈕從STL文件繪製3D網格。 ____________________________ 圖1:主菜單。 ____________________________ ____________________________ 圖2:按下「A」按鈕時。 ____________________ ____________________________ 圖3:當 「B」 按鈕按下 _____________________ ____________________________ 圖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模式,但沒有奏效。
非常感謝您的快速響應。我對正投影和透視圖矩陣有同樣的想法。這就是爲什麼問上述問題的原因,我不知道將透視視圖矩陣OFF和正交投影ON轉換的功能。我使用的是不到2周的openGl,所以我對它很陌生。正如您所建議的,我試圖遵循代碼,但不幸的是,問題依然如此: glMatrixMode(GL_PROJECTION); gluOrtho2D(45,(顯示[0] /顯示[1]),0。5,40) –
確保將參數設置爲gluOrtho2D正確。檢查api,簽名是:gluOrtho2D(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top)。您必須根據您使用的座標系進行設置。例如。 (-1,1,-1,1),屏幕中心爲(0,0),右上角爲(1,1),左下角爲(-1,-1)。這種情況必須與用於繪製情節的座標一致。即無論是使用屏幕座標還是使用-1到1,如本例中所示。 – sparkplug