2017-06-09 2 views
2

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. main menu ____________________________ Abb. 1: Hauptmenü. ____________________________ A button pressed. ____________________________ Abb. 2: Wenn Taste "A" gedrückt wird. ____________________ B button pressed. ____________________________ Abb. 3:. Wenn Taste "B" _____________________ 3D button pressed. ____________________________ gedrückt Bild 4: Wenn "3D" Taste _____________________Wie zeichnen Sie 2D-Bilder nach 3D-Mesh in OpenGL und Pygame?

gedrückt

Das 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.

Antwort

1

Es sieht so aus, als würden die Schaltflächen A und B Aufrufe auslösen, um ein Diagramm in der Ebene des Bildschirms zu rendern (dies ist ein 2D-Render, der eine orphographische Projektion erfordert). Basierend auf Ihrem Code löst Schaltfläche C einen Aufruf aus, um das 3D-Modell mit einer perspektivischen Ansichtsmatrix zu rendern.

Wenn Sie zwischen Renderaufrufen wechseln, müssen Sie sicherstellen, dass Sie die Ansichtsmatrix entsprechend zurücksetzen (stellen Sie eine orphographische Projektionsmatrix ein, bevor der Button A/B-Rendercode aufgerufen wird). Es sieht so aus, als würden Sie vielleicht vergessen, die Ansichtsmatrix vor dem Rendering-Code, der durch die Schaltfläche A/B ausgelöst wurde, auf eine orphorische Projektion zu setzen. Wenn Sie also die Taste A und die Taste B nach dem Ergebnis der Taste C drücken, wird versucht, mit der zuvor eingestellten perspektivischen Projektionsmatrix zu rendern, was zu seltsamen Ergebnissen führt.

Sie müssen eine orthographische Projektionsmatrix erstellen und diese vor dem Rendern in 2D laden. Sie können dies mit einem Aufruf von gluOrtho2D einstellen, nachdem Sie den Matrix-Modus im 2D-Code-Snippet gesetzt haben, ähnlich wie Ihr Aufruf an gluPerspective im 3D-Code-Snippet. This page describes in great detail wie Sie die erforderliche orthographische Matrix erstellen (navigieren Sie zum Abschnitt "Projektionsmatrix (GL_PROJECTION)", um eine detaillierte Erklärung und einen Beispielcode zu erhalten).

+0

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

+0

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

Verwandte Themen