如何使用面板在穿山甲中显示2D图形

时间:2019-07-17 15:57:08

标签: c++ opengl window opengl-compat

我不知道如何使用穿山甲显示2D openGL图形。

我正在学校的研究部门实习。 我是OpenGl和Pangolin的新手。 我正在尝试向open_source程序添加监视窗口,以使其更加用户友好。该程序为ORB_SLAM2,它已经使用pangolin作为openGL显示管理器。通过这段代码,它已经打开了一些带有面板的窗口和3d openGL显示,例如this

void Viewer::Run()
{
    //...

    pangolin::CreateWindowAndBind("ORB-SLAM2: Map Viewer",1024,768);

    // 3D Mouse handler requires depth testing to be enabled
    glEnable(GL_DEPTH_TEST);

    // Issue specific OpenGl we might need
    glEnable (GL_BLEND);
    glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    pangolin::CreatePanel("menu").SetBounds(0.0,1.0,0.0,pangolin::Attach::Pix(175));
        // ... define elements of the menu (not important)
    // Define Camera Render Object (for view / scene browsing)
    pangolin::OpenGlRenderState s_cam( 
 pangolin::ProjectionMatrix(1024,768,mViewpointF,mViewpointF,512,389,0.1,1000),
pangolin::ModelViewLookAt(mViewpointX,mViewpointY,mViewpointZ, 0,0,0,0.0,-1.0, 0.0));

    // Add named OpenGL viewport to window and provide 3D Handler
    pangolin::View& d_cam = pangolin::CreateDisplay()
            .SetBounds(0.0, 1.0, pangolin::Attach::Pix(175), 1.0, -1024.0f/768.0f)
            .SetHandler(new pangolin::Handler3D(s_cam));

    pangolin::OpenGlMatrix Twc;
    Twc.SetIdentity();
        //...

    while(1)
    {
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

            mpMapDrawer->GetCurrentOpenGLCameraMatrix(Twc);

            //...

            d_cam.Activate(s_cam);
            glClearColor(1.0f,1.0f,1.0f,1.0f);
            mpMapDrawer->DrawCurrentCamera(Twc);
            if(menuShowKeyFrames || menuShowGraph)
                mpMapDrawer->DrawKeyFrames(menuShowKeyFrames,menuShowGraph);
            if(menuShowPoints)
                mpMapDrawer->DrawMapPoints();

            pangolin::FinishFrame();
                        //...
       }

所以我试图复制它并删除它的3D处理部分

void Monitor::Run()
{
    //...

    pangolin::CreateWindowAndBind("ORB-SLAM2: Monitoring",1024,768);

    // Issue specific OpenGl we might need
    glEnable (GL_BLEND);
    glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    pangolin::View& menu = pangolin::CreatePanel("vars").SetBounds(0.0,1.0,0.0,pangolin::Attach::Pix(175));
    //...
    // Add named OpenGL viewport to window

    pangolin::View& graph = pangolin::CreateDisplay()
            .SetBounds(0.0, 1.0, pangolin::Attach::Pix(175), 1.0, 1024.0f/768.0f);
    while (1){
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        graph.Activate();
        glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
// 2D Basic test shape
        glBegin(GL_QUADS);
            glColor3f(0.4f, 0.05f, 0.05f);
            glVertex2f(-0.5, 0.8f);
            glVertex2f(-0.8f, -0.8f);
            glVertex2f(0.8f, -0.8f);
            glVertex2f(0.8f, 0.8f); glEnd();
        pangolin::FinishFrame();
    }
}

但是2D形状并没有消失,它仅显示背景颜色

我尝试了以下操作:

  • 卸下面板:它使形状出现,但我要保留面板。

  • 菜单的zorder和两个形状的更改都没有改变

  • 不将其包含在无限的while循环中:面板和形状均出现,但显然它是静态图像。但是似乎渲染器在首次调用FinishFrame()时起作用,然后不再起作用。

还有其他东西,但我不能在这里列出。

如果不是因为我没有创建OpenGlRenderState对象,我就在徘徊,但是我对OpenGL和Pangolin的理解并不能理解为什么需要2D渲染。

我希望你们能帮助我。

0 个答案:

没有答案