переключиться с glOrtho на gluPerspective

У меня есть отрисовка автомобиля в (0,0) и установлены некоторые препятствия, но сейчас моя главная забота - переключиться с glPerspective на glOrtho и наоборот. Все, что я получаю, когда я переключаюсь с перспективы на орто, это черный экран.

void myinit(){
    glClearColor(0.0,0.0,0.0,0.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(60,ww/wh,1,100);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(-5,5,3,backcarx,topcarx,0,0,0,1);
}

void menu(int id){
    /*menu selects if you want to view it in ortho or perspective*/
    if(id == 1){
        glClear(GL_DEPTH_BUFFER_BIT);
        glViewport(0,0,ww,wh);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(-2,100,-2,100,-1,1);
        glMatrixMode(GL_MODELVIEW);
        glutPostRedisplay();
    }
    if(id == 2){
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluPerspective(60,ww/wh,1,100);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        viewx = backcarx - 10;
        viewy = backcary - 10;
        gluLookAt(viewx,viewy,viewz,backcarx,topcarx,0,0,0,1);
    }
}

я пробовал использовать чистый буфер глубины и все еще не работает.


person Knitex    schedule 07.11.2012    source источник
comment
Немного не по теме, но, похоже, вы используете фиксированный конвейер функций. Вам лучше переключиться на Shaders и VertexBuffers для лучшей производительности и лучшей помощи (я не могу вам здесь помочь, потому что я больше не использую ffp).   -  person Felix K.    schedule 07.11.2012
comment
Проблема в переключении или в том, что вы не можете правильно увидеть свою сцену с помощью Ortho? (Если вы используете ортопедию вместо перспективы, будет ли виден объект?)   -  person count0    schedule 07.11.2012
comment
да, если я ставлю его в орто, все отображается нормально. проблема в переключении   -  person Knitex    schedule 07.11.2012
comment
изменение с орто на перспективу в порядке, но наоборот, я не могу заставить его работать   -  person Knitex    schedule 07.11.2012
comment
Вы пытались добавить оператор gluLookAt в ветку GlOrtho?   -  person didierc    schedule 07.11.2012


Ответы (1)


Ваше умственное препятствие находится здесь:

void myinit(){
    glClearColor(0.0,0.0,0.0,0.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(60,ww/wh,1,100);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(-5,5,3,backcarx,topcarx,0,0,0,1);
}

OpenGL не инициализирован! Да, некоторые операции выполняются лишь изредка, например загрузка текстур. Но в целом OpenGL — это система рисования, основанная на состоянии. Это означает, что вы устанавливаете все, что связано с рисованием, прямо перед тем, как использовать его. Этот код в функции "myinit" на самом деле относится к функции отображения. И как только он у вас есть, переключение становится тривиальным: установите перечисляющую переменную и настройте правильную проекцию перед рисованием в зависимости от значения переменной.

Как правило: операции рисования OpenGL — и настройка состояния преобразования принадлежат этому набору операций — относятся только к коду рисования. Следовательно, ваша функция «меню» вообще не имеет смысла. Это обработчик событий. Обработчики событий имеют дело с вводом, они не генерируют вывод. В обработчике событий вы изменяете значение переменных, а затем отмечаете, что вывод должен быть выполнен.


Обновление из-за комментария:

typedef enum ProjectionType_t { Ortho, Perspective } ProjectionType;

ProjectionType projection;

void onMenu(int entry)
{
    swtich(entry) {
    case ...:
        projection = Ortho; break;
    case ...:
        projection = Perspective; break;
    }

    glutPostRedisplay();
}

void display(void)
{
    glClear(...);

    glViewport(...);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    switch(projection) {
    case Ortho:
        glOrtho(...); break;

    case Perspective:
        gluPerspective(...); break;
    }    

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    ...

}
person datenwolf    schedule 07.11.2012
comment
это все еще не помогает переходу от перспективы к орто. Я могу изменить ортопедию на перспективу, но я могу вернуться к ортопедии в перспективе - person Knitex; 07.11.2012
comment
@Knitex: см. мой ответ, чтобы узнать, как это сделать. - person datenwolf; 07.11.2012
comment
это заставило переключение обратно в орто-режим работать, но по какой-то причине теперь орто-в-перспективе не работает - person Knitex; 07.11.2012