2012-06-27 2 views
0

Я использую OpenGL в приложении Visual C++ Visual Studio 2008, и я хочу, чтобы GLcontrol переключался между 3D и 2D, когда bool имеет значение true/false.C++ OpenGL переключение с 2D на 3D

Чертеж в 3D прекрасно работает, рисунок в 2D прекрасно работает, проблема возникает при переключении с одного на другой. Поэтому, если я начинаю рисовать приложение в 2D, он отлично работает и то же самое с 3D, но если я изменю логическое значение во время работы, он ничего не рисует.

Вот код, в котором я перехожу от одного к другому.

if(opciones->draw3D){ 
    GL::MatrixMode(MatrixMode::Modelview); 
    GL::LoadIdentity(); 
    GL::Viewport(0, 0, w, h); 
    Matrix4 lookat = Matrix4::LookAt(100, 100, 100, 0, 0, 0, 0, 0, 1); 
    GL::LoadMatrix(lookat); 
    GL::Scale(this->zoom, this->zoom, this->zoom); 

    GL::Rotate(xrot, 1.0f, 0.0f, 0.0f); 
    GL::Rotate(yrot, 0.0f, 1.0f, 0.0f); 
    GL::Clear(ClearBufferMask::ColorBufferBit | ClearBufferMask::DepthBufferBit); 
    GL::ClearColor(Color::LightGray); 
// Draw3D 
} 
else { 
    GL::MatrixMode(MatrixMode::Projection); 
    GL::LoadIdentity(); 
    GL::Ortho(5, w-5, 5, h-5, -1, 1);  
    GL::Viewport(5, 5, w-5, h-5);  

    GL::Clear(ClearBufferMask::ColorBufferBit|ClearBufferMask::DepthBufferBit); 
    GL::ClearColor(Color::LightGray); 
    GL::MatrixMode(MatrixMode::Modelview); 
    GL::LoadIdentity(); 

// Draw 2D 
} 

Я не знаю, что я делаю неправильно, но я предполагаю, что я не прояснить некоторые матрицы или что-то, потому что, как я уже говорил ранее, когда переменная draw3D==true в начале он рисует отлично и когда переменная - draw3D==false, в начале она отлично рисуется в 2D, но изменение во время выполнения делает ее неработоспособной.

+0

, когда вы измените значение draw3D на исходное значение до его начального значения, затем оно снова работает или больше ничего не работает после того, как этот флаг изменился? – catchmeifyoutry

ответ

6

Вам необходимо установить матрицу проекции в трехмерном режиме. Я предполагаю, что по умолчанию ваша инфраструктура создает для вас перспективную проекцию. Это переписывается, когда вы выполняете GL :: Ortho() в 2-й части.

+0

Точно! Я просто добавил следующий код (используемый при настройке установки для GLcotroller), чтобы снова настроить proyection: 'float aspect_ratio = w/(float) h;' 'Matrix4 perpective = Matrix4 :: CreatePerspectiveFieldOfView (MathHelper :: PiOver4 , aspect_ratio, 0.1f, 100000.0f); ' \t \t \t \t' GL :: MatrixMode (MatrixMode :: Проекция); ' ' GL :: LoadMatrix (perpective); ' –