2016-12-03 8 views
0

Вот чего я хочу достичь. У меня есть флаг под названием switch_2D_3D в коде ниже, и когда это правда, я переключаюсь в 2D-режим, иначе в 3D.OpenGL при переключении с 2D на 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 
} 

Все отлично работает при рисовании только в 2D-режиме, но когда я изменить флаг, чтобы переключиться в 3D-режиме, здесь возникает проблема

Каждый раз, когда я изменить размер окна, то, что я рисую в 3d-сцена (например, куб) будет меньше и меньше, в конце концов исчезнет, ​​почему это происходит

И если я вернусь в 2D-режим, все в режиме 2d все еще работает нормально, проблема в 3d-режиме

Кроме того, если я ста rt программа с флагом, установленным на false, я увижу куб, и я все равно буду уменьшаться при изменении размера окна каждый раз

Почему это происходит?

+0

Я думаю, вы должны перестать думать в терминах «2D против 3D». Это различие не имеет смысла, истина должна быть рассказана. То, что вы переключаете туда, - это проекция, и, конечно же, вы можете использовать орфографическую проекцию для 3D-сцен. – datenwolf

ответ

0

Вы должны посмотреть на свои взаимодействия .

Прямо сейчас, у вас есть два различных поведение:

В 2D: вы переустановка матрицы для любого активного при входе в функцию, предположительно GL_MODELVIEW, что вызывает gluOrtho2D вызовов «стек».

В 3D: вы всегда возвращаете проекционную матрицу, что кажется более правильным.

Попробуйте поменять порядок вызовов glLoadIdentity и glMatrixMode только на вашем первом пути (2D).

Это мудрая идея всегда явно задавать матрицу, которую вы хотите изменить, до ее фактического изменения.

+0

Спасибо за ответ. Я попробовал это, но теперь я больше не вижу сцену 2d, и куб в 3d-сцене все еще становится меньше. – RushSykes

+0

Ну, в зависимости от того, как вы обрабатываете вращения, вы можете также сбросить матрицу представления модели, как и раньше. Это не очень хорошая идея, но вот что изменилось, когда вы меняли порядок звонков – ltjax

+0

О, да, я получил его, я использую матрицу проекционного режима для обеих сцен, поэтому я не должен снова задавать матрицу для просмотра модели ... Еще раз спасибо! – RushSykes