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