Переключиться с 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);
    }
}

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

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();

    ...

}
Другие вопросы по тегам