2016-12-03 2 views
0

Hier ist, was ich erreichen möchte, ich habe eine Flagge namens switch_2D_3D in dem Code unten, und wenn es wahr ist, wechsle ich in 2D-Modus, sonst 3D.OpenGL beim Umschalten von 2D nach 3D

void reshape(GLsizei width, GLsizei height) 
{ 
    if (switch_2D_3D) 
    { 
     // GLsizei for non-negative integer 
     // Compute aspect ratio of the new window 
     if (height == 0) 
      height = 1;    // To prevent divide by 0 

     GLfloat aspect = (GLfloat)width/(GLfloat)height; 

     // Reset transformations 
     glLoadIdentity(); 

     // Set the aspect ratio of the clipping area to match the viewport 
     glMatrixMode(GL_PROJECTION); // To operate on the Projection matrix 

     // Set the viewport to cover the new window 
     glViewport(0, 0, width, height); 

     if (width >= height) 
     { 
      // aspect >= 1, set the height from -1 to 1, with larger width 
      gluOrtho2D(-1.0 * aspect, 1.0 * aspect, -1.0, 1.0); 
     } 
     else 
     { 
      // aspect < 1, set the width to -1 to 1, with larger height 
      gluOrtho2D(-1.0, 1.0, -1.0/aspect, 1.0/aspect); 
     } 

     winWidth = width; 
     winHeight = height; 
    } // 2D mode 
    else 
    { 
     // Prevent a divide by zero, when window is too short 
     // (you cant make a window of zero width). 
     if (height == 0) 
      height = 1; 

     float ratio = width * 1.0/height; 

     // Use the Projection Matrix 
     glMatrixMode(GL_PROJECTION); 

     // Reset Matrix 
     glLoadIdentity(); 

     // Set the viewport to be the entire window 
     glViewport(0, 0, width, height); 

     // Set the correct perspective. 
     gluPerspective(45.0f, ratio, 0.1f, 100.0f); 

     // Get Back to the Modelview 
     glMatrixMode(GL_MODELVIEW); 

     winWidth = width; 
     winHeight = height; 
    }// 3D mode 
} 

Alles funktioniert perfekt, wenn nur im 2D-Modus zeichnen, aber wenn ich die Flagge wechseln Sie in den 3D-Modus zu wechseln, hier kommt das Problem

Jedes Mal, wenn ich die Größe des Fensters, die Dinge, die ich in zeichnen die 3D-Szene (zum Beispiel ein Würfel) würde kommen smallerand kleiner, schließlich verschwand, warum ist das passiert

Und wenn ich zurück in 2D-Modus, alles im 2D-Modus funktioniert immer noch gut, das Problem ist mit dem 3D-Modus

Auch, wenn ich sta rt das Programm mit dem Flag auf false gesetzt, würde ich einen Würfel sehen und es wird immer kleiner, wie ich das Fenster jedes Mal

Warum ändert sich das?

+0

Ich denke, Sie sollten aufhören zu denken in Bezug auf "2D vs. 3D". Diese Unterscheidung ergibt keinen Sinn, Wahrheit zu erzählen. Was Sie dort schalten, ist die Projektion und natürlich können Sie eine orthographische Projektion auch für 3D-Szenen verwenden. – datenwolf

Antwort

0

Sie sollten sich Ihre glLoadIdentity()/glMatrixMode() Interaktionen ansehen.

Gerade jetzt haben Sie zwei unterschiedliche Verhaltensweisen:

In 2D: Sie Ihre Matrix für das Zurücksetzen sind, was auch immer aktiv ist, wenn Sie die Funktion eingeben, vermutlich GL_MODELVIEW, die die gluOrtho2D Anrufe verursacht zu „stapeln“.

In 3D: Sie setzen immer die Projektionsmatrix zurück, die korrekter erscheint.

Versuchen Sie, die Reihenfolge der Aufrufe glLoadIdentity und glMatrixMode nur in Ihrem ersten Pfad (2D) zu vertauschen.

Es ist eine kluge Idee, die Matrix, die Sie ändern möchten, immer explizit festzulegen, bevor Sie sie tatsächlich ändern.

+0

Danke für die Antwort. Ich habe es versucht, aber jetzt kann ich die 2D-Szene nicht mehr sehen und der Würfel in der 3D-Szene wird immer kleiner. – RushSykes

+0

Nun, abhängig davon, wie Sie mit Rotationen umgehen, möchten Sie vielleicht auch die Modellansichtsmatrix wie zuvor zurücksetzen. Es ist keine gute Idee, aber das hat sich geändert, als Sie die Rufreihenfolge vertauscht haben. – ltjax

+0

oh ja ich habe es, ich benutze eine Projektionsmodus-Matrix für beide Szenen, also sollte ich die Matrix nicht wieder auf Modellansicht setzen .... Danke nochmal! – RushSykes