2012-06-22 3 views
0

Я пытаюсь сделать гоночную игру, и у меня возникла проблема с отображением нескольких видовых экранов на экране. Я хочу поставить в правом нижнем углу экрана небольшую «мини-карту» (которая будет фактически отличаться от основной сцены камеры), но в какой-то степени второй видовой экран просто не появляется, и все, что я вижу, это вид основной камеры.Несколько видовых экранов на OpenGL

Здесь следует мой код как:

void mainRender() { 
     updateState(); 

     setViewport(0, windowWidth, 0, windowHeight); 
     setWindow(); 
     renderScene(); 


     setViewport(0, windowWidth, 0, windowHeight/2); 
     renderScene(); 
     gluLookAt(0,88,0, 
        1 ,0 ,0, 
        0.0,1.0,0.0); 



     Sleep(30); 
    } 

    void setWindow() { 
     glMatrixMode(GL_PROJECTION); 
     glLoadIdentity(); 
     gluPerspective(45.0f,(GLfloat)windowWidth/(GLfloat)windowHeight,0.1f, 100.0f); 
     glMatrixMode(GL_MODELVIEW); 
     glLoadIdentity(); 
     gluLookAt(posX,posY + 0.025 * std::abs(sin(headPosAux*PI/180)),posZ, 
     posX + sin(roty*PI/180),posY + 0.025 * std::abs(sin(headPosAux*PI/180)) + cos(rotx*PI/180),posZ -cos(roty*PI/180), 
     0.0,1.0,0.0); 

    } 

    void setViewport(GLint left, GLint right, GLint bottom, GLint top){ 
     glViewport(left, bottom, right - left, top - bottom); 
    } 


    int main(int argc, char **argv) { 
     glutInit(&argc, argv); 
     glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA | GLUT_DEPTH); 
     glutInitWindowSize(windowWidth,windowHeight); 
     glutInitWindowPosition(windowXPos,windowYPos); 

     /** 
     Store main window id so that glui can send it redisplay events 
     */ 
     mainWindowId = glutCreateWindow("TF"); 

     glutDisplayFunc(mainRender); 

     glutReshapeFunc(onWindowReshape); 

     /** 
     Register keyboard events handlers 
     */ 
     glutKeyboardFunc(onKeyDown); 
     glutKeyboardUpFunc(onKeyUp); 



     mainInit(); 

     glutMainLoop(); 

     return 0; 
    } 
+0

Что вы рисуете во втором окне просмотра? Я не вижу никакого кода, который на самом деле рисует что-либо. – Tim

+0

Перейдите сюда, есть загружаемый пример ViewPort. http://zavie.free.fr/opengl/index.html.en#viewports – trumpetlicks

+0

Я не рисую во втором окне просмотра, я просто меняю положение камеры, поэтому он может смотреть на карту сверху и это будет выглядеть как мини-карта (вот что я использую для функции lookAt). – Imperian

ответ

1

Вы должны начать использовать glGetError.

Ваш левый и правый аргумент в вашей функции запутан. Вы проходите слева как ширина/2, а справа - 0. Это создает отрицательную ширину и, следовательно, ошибку. Ваша высота тоже выглядит негативной.

+1

Ваше понимание glViewport может быть неправильным, это x, y, width, height. не левый правый, верх, низ! Хотя я считаю, что ваша оценка может быть правильной, поскольку они путают вещи с помощью собственного метода setViewport. – trumpetlicks

+0

Вы были правы, я исправил это. Тем не менее, похоже, что второй вызов в режиме просмотра просто заставляет первый видоискатель исчезать, теперь все, что я вижу, это второй видовой экран (область экрана, где другая должна быть черной). – Imperian

3

Я не рисую во втором окне просмотра, я просто изменяю положение камеры, поэтому он может смотреть на карту сверху и будет выглядеть как мини-карта (вот что я использую для функции lookAt для).

Я думаю, что у вас есть серьезное непонимание того, как работает opengl. Просто изменение gluLookAt ничего не сделает. Если вы хотите просмотреть сцену под другим углом, вам нужно перерисовать всю сцену после изменения видового экрана. Если вы хотите показать мини-карту, то вы должны сделать всю сцену в обычном режиме, установить видовое окно на мини-карту, установить верхнюю камеру и снова нарисовать всю сцену.

+0

Ну, это объясняет многое ... – Imperian

+0

Я изменил свой код и обновил свой вопрос, но та же проблема сохраняется, я вижу только один видовой экран. – Imperian

Смежные вопросы