In Pygame habe ich Hauptmenü mit 3 Tasten erstellt, die ersten beiden Tasten zeichnen 2D-Grafiken, wenn ich "Backspace" oder "Escape" drücken, kehrt es mit den drei Tasten zum Hauptmenü zurück. Die letzte (dritte) Schaltfläche zeigt 3D-Mesh aus der STL-Datei an. ____________________________ Abb. 1: Hauptmenü. ____________________________ ____________________________ Abb. 2: Wenn Taste "A" gedrückt wird. ____________________ ____________________________ Abb. 3:. Wenn Taste "B" _____________________ ____________________________ gedrückt Bild 4: Wenn "3D" Taste _____________________Wie zeichnen Sie 2D-Bilder nach 3D-Mesh in OpenGL und Pygame?
gedrücktDas Problem: kann ich sehr leicht navigieren zwischen 1. und 2. Knopf, aber wenn ich mindestens einmal das 3D-Mesh plotte, dann kann ich noch den 1. und 2. Knopf drücken.
Code, um das 3D-Netz zeichnen: (. Leider bin ich nicht den ganzen Code laden aufgrund von privaten Daten erlaubt)
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()
Meine Gedanken über das Problem: ich würde ich annehmen, habe ein Problem aufgrund aktiviert Tiefenprüfung und Überblendung beim Rendern von Polygonen in meiner Anwendung. Ich habe versucht, Tiefenprüfung und Blending zu deaktivieren.
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();
Auch habe ich versucht, auch Funktionen glDrawPixels und glCopyPixels, um in den normalen 2D-Modus zurückkehren zu verwenden, aber es hat nicht funktioniert.
Vielen Dank für Ihre schnelle Antwort. Ich hatte die gleichen Gedanken über die orthographische Projektion und die perspektivische Ansichtsmatrix. Das ist der Grund, warum die obige Frage gestellt wurde, dass ich die Funktion zum Ausschalten der perspektivischen Ansichtsmatrix OFF und der orthographischen Projektion ON nicht kannte. Ich benutze openGL weniger als 2 Wochen, also bin ich sehr neu dazu. Ich habe versucht, folgenden Code zu folgen, wie Sie vorgeschlagen haben, aber leider blieb das Problem gleich: glMatrixMode (GL_PROJECTION); gluOrtho2D (45, (Anzeige [0]/Anzeige [1]), 0.5, 40) –
Stellen Sie sicher, dass Sie die Parameter korrekt auf gluOrtho2D eingestellt haben. Beim Überprüfen der API lautet die Signatur: gluOrtho2D (GLdoppel links, GLdoppel rechts, GLdoppelboden, GLdoppel oben). Sie müssen diese basierend auf dem von Ihnen verwendeten Koordinatensystem festlegen. Z.B. (-1, 1, -1, 1) für ein Koordinatensystem mit (0, 0) in Bildschirmmitte, Wert von (1, 1) oben rechts und (-1, -1) in der linken unteren Ecke. Dies muss natürlich mit den Koordinaten übereinstimmen, die zum Rendern der Zeichnung verwendet werden. I.e. ob mit Bildschirmkoordinaten oder -1 zu 1 wie in diesem Beispiel. – sparkplug