2012-06-22 44 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/2,右传递为0。这会生成负宽度,因此会产生错误。你的身高也看起来很负面。

+1

您对glViewport的理解可能不正确,它是x,y,宽度,高度。不是左,右,上,下!虽然我认为你的评估可能是正确的,因为他们用自己的setViewport方法混淆了事情。 – trumpetlicks

+0

你说得对,我修正了这个问题。不过,它看起来像第二个视口调用只是使第一个视口消失,现在我所看到的只是第二个视口(另一个应该是黑色的屏幕区域)。 – Imperian

3

我没有绘制第二个视口,我只是改变相机的位置,所以它可以从向上看地图,它会看起来像一个小地图(这就是我使用lookAt函数)。

我认为你对opengl的工作原理有一些严重的误解。只是改变gluLookAt不会做任何事情。如果您想以不同角度查看场景,则必须在更改视口后重新绘制整个场景。如果要显示小地图,则应正常绘制整个场景,将视口设置为小地图,设置高架相机,然后再次绘制整个场景。

+0

嗯,这解释了很多... – Imperian

+0

我已经更改了我的代码并更新了我的问题,但同样的问题仍然存在,我只能看到一个视口。 – Imperian