在特定视图端口中绘制摄像机位置

时间:2011-01-03 23:31:04

标签: c++ visual-c++ opengl camera

这些代码大部分应该是相当自我解释的。我有一个显示功能和我的视口功能。有两种模式,即窗口中的4个小视口或一个大视口。 我有一个可以移动的摄像头,如果在4视口模式下只有3个固定角度。问题是我希望自由移动的摄像机位置显示在其他3个视口中。我尝试通过使用opengl绘制球体来做到这一点,但问题是,当位置显示相同的场景时,位置也会在自由漫游相机中进行绘制。

它不一定是一个球体,只是表示这三个其他视图中相机空间位置的简单。

使用显示三个视口的相机对象绘制场景一次,渲染到纹理。清除并绘制没有相机对象渲染到场景的场景,然后在实际绘制场景之前将这些场景拼接在一起似乎很容易就可以轻松完成。

void display(int what)
    {
        if(what==5){
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        camControll();}

        if(what==1){
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        gluLookAt(75,15,-5,0,5,-5,0,1,0);}

        if(what==2){
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        gluLookAt(0,110,0,0,0,0,1,0,0);}

        if(what==3){
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluPerspective(45.0f, float(320) / float(240), 0.1f, 100.0f); 
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        camControll();}

        if(what==4){
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        gluLookAt(185,75,25,0,28,0,0,1,0);}



        glClearColor(0, 0, 0, 1);
        glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
        drawScene();
        drawCamera();
        glutSwapBuffers();
    }

    void viewport(){
    glEnable(GL_SCISSOR_TEST);

        if(!divided_view_port)
        {
        glViewport(0, 0, w, h);
        glScissor(0,0,640,480);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluPerspective(45.0f, w / h, 0.1f, 100.0f);
        display(5);
        }

    else
    {
        ////////////////////// bottom left - working
        glViewport(0, 0, w/2, h/2);
        glScissor(0,0,w/2,h/2);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluPerspective(45.0f, w / h, 0.1f, 300.0f);
        display(1);
        //////////////////////


        ////////////////////// top right - working
        glViewport(w/2, h/2, w/2, h/2);
        glScissor(w/2,h/2,w/2,h/2);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluPerspective(45.0f, w / h, 0.1f, 300.0f);
        display(2);
        //////////////////////

        ////////////////////// bottom right -working
        glViewport(w/2, 0, w/2, h/2);
        glScissor(w/2,0,w/2,h/2);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluPerspective(45.0f, w / h, 0.1f, 300.0f);
        display(3);
        ////////////////////////

        ////////////////////////// top left
        glViewport(0, h/2, w/2, h/2);
        glScissor(0,h/2,w/2,h/2);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluPerspective(45.0f, w / h, 0.1f, 300.0f);
        display(4);
        ///////////////////////////
    }

    glDisable(GL_SCISSOR_TEST);
    glMatrixMode(GL_MODELVIEW);
    }

所以我基本上需要的是在特定的视口中隐藏这个对象。

3 个答案:

答案 0 :(得分:0)

为什么不让单个Sphere对象(或负责绘制球体的实体)知道“当前视口”(恰好是代码中的what变量)并让它在不可见的情况下隐藏给定的视口?

此解决方案完全符合此处涉及的逻辑,听起来既简单又正确。

更通用的解决方案是为每个“摄像机”提供GUID,并使其可用于负责绘制摄像机的实体,以检查绑定到此时正在渲染的视口的“摄像机”的GUID。如果它们恰好相同,则在此绘制过程中忽略相机对象。

答案 1 :(得分:0)

我认为如果你只是绘制点就应该很容易,因为如果你想在视口中看到点,它的中心必须在视口中,否则即使你设置了很大的点大小也不会显示它。然后你有两个选项来消除闪烁效果(当你在同一个位置放置2个方格时,它们会闪烁一个在另一个上方)。您可以将这一点移动到相机后面,或者在glFrustrum / gluPerspective调用中使用非零值用于近剪裁平面...如果您每次移动相机时更新点位置,则无法在移动相机中看到该点你可以使用单一场景。

第二个选项,我不知道你是否可以更新单个视口,但可能只是设置场景,将其显示到移动摄像机,绘制摄像机位置并显示其他3个视口也应该很容易..

答案 2 :(得分:0)

为什么不在飞机附近的移动摄像机后面绘制球体?这应该确保移动的相机根本看不到球体,但其位置明显标记为其他球体。