C++学习笔记——Pangolin模块(3D绘图)

c++的Pangolin模块的学习笔记。

运行系统:ubuntu
使用IDE:Visual Studio Code
运行方式:cmake项目

参考资料:

1. Pangolin绘图主体部分写法

// 主函数
ThisClass::ThisClass()
{
    // 创建gui窗口
    pangolin::CreateWindowAndBind(win_name_, 1280, 960);
    // 启用深度
    glEnable(GL_DEPTH_TEST);

    // 启动pangolin线程
    pangolin_run_thread_ = std::thread(&ThisClass::DrawPangolin, this);

    // 多线程需要先分离线程
    pangolin::GetBoundWindow()->RemoveCurrent();
}


// 单独线程中运行的函数
void ThisClass::DrawPangolin()
{
    // 绑定绘图线程
    pangolin::BindToContext(win_name_);

    // 启动深度测试
    glEnable(GL_DEPTH_TEST);

    // 创建观测相机视图
    int view_w_ = 640;
    int view_h_ = 480;

    pangolin::OpenGlRenderState visualization3d_camera(
        pangolin::ProjectionMatrix(view_w_, view_h_, 400, 400, view_w_ / 2, view_h_ / 2, 0.001, 20),
        pangolin::ModelViewLookAt(0, -1, -2, 0, 0, 0, pangolin::AxisNegY));

    // 创建3D视图
    pangolin::Handler3D handler_3d(visualization3d_camera);
    int UI_WIDTH = 200;
    //  右侧:交互视图
    pangolin::View &visualization3d_display =
        pangolin::CreateDisplay()
            .SetBounds(0.0, 1.0, pangolin::Attach::Pix(UI_WIDTH), 1.0, -640.0f / 480.0f)
            .SetHandler(&handler_3d);
    // 左侧:控制面板
    pangolin::CreatePanel("control_panel")
        .SetBounds(0.0, 1.0, 0.0, pangolin::Attach::Pix(UI_WIDTH));
    // 单选框
    // 坐标轴
    pangolin::Var<bool> DrawAxis("control_panel.DrawAxis", true, true);

    // 每一帧的循环绘制
    while (!pangolin::ShouldQuit() && !GetStopFlag())
    {
        // 固定等待刷新周期
        std::this_thread::sleep_for(10ms);

        // 清屏并激活视图
        // 清空颜色和深度缓存
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        visualization3d_display.Activate(visualization3d_camera);

        // 设置背景颜色
        glClearColor(0.5f, 0.5f, 0.5f, 0.5f);

        // 在这里绘制需要绘制的内容
        if (DrawAxis) {
        }
        // 运行帧循环以推进窗口事件
        pangolin::FinishFrame();
    }

    // 分离线程
    pangolin::GetBoundWindow()->RemoveCurrent();

    stop_ = true;
}
}

2. 可绘制的内容

2.1 坐标轴

// 在原点绘制坐标轴
pangolin::glDrawAxis(0.5);

2.2 点

//  设置点大小
glPointSize(15.0);
//  开始画点
glBegin(GL_POINTS);

// 调试用的绿色点
glColor3f(0, 1, 0);
glVertex3f(0.025, 0.025, 0.025);
glColor3f(0, 1, 0);
glVertex3f(0.075, 0.075, 0.075);

//  结束画点
glEnd();

2.3 立方体

// 绘制自带的彩色立方体
// 可以基于头文件中该函数的写法修改,渲染自定义位置和颜色的立方体/平面
glDrawColouredCube();

2.4 线

// 画线
// 设置线宽
glLineWidth(1);
// 设置颜色
glColor4f(0.0f, 0.0f, 0.0f, 1.0f);
// 2点为1条线
glBegin(GL_LINES);
// 第一条线
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(1.0f, 1.0f, 1.0f);
// 第二条线
glVertex3f(1.0f, 1.0f, 1.0f);
glVertex3f(1.0f, 1.0f, 2.0f);
// 结束
glEnd();

2.5 移动轨迹

使用path_储存历史位姿的世界坐标。

if (path_.size)
{
    glLineWidth(1);
    glBegin(GL_LINE_STRIP);
    glColor3f(r, g, b);
    for (size_t i = 0; i < path_.size(); i++)
    {
        glVertex3d(path_[i][0], path_[i][1], path_[i][2]);
    }
    glEnd();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值