1.基础使用
#include <pangolin/pangolin.h>
int main(int , char **)
{
//1.创建一个窗口
pangolin::CreateWindowAndBind("window_title",1000, 600); //w=1000 h=600
//2.启用深度测试
glEnable(GL_DEPTH_TEST);
//3.创建一个观察相机视图(定义目标并初始化)
pangolin::OpenGlRenderState s_cam(
pangolin::ProjectionMatrix(1000,600,420,420,320,240,0.2,100), //配置相机内参
//内参依次为相机的图像高度,宽度,4个相机内参,最近最远视距
pangolin::ModelViewLookAt(-5,5,-5,0,0,0,pangolin::AxisY)
//相机所在坐标x,y,z 视点所在坐标x,y,z, y轴为正方向
);
const int UI_WIDTH = 500;
//4.创建交互视图
pangolin::Handler3D handler(s_cam); //创建一个相机
pangolin::View& d_cam = pangolin::CreateDisplay().SetBounds(0.0, 1.0, 0.0, 1.0, -640.0f/480.0f).SetHandler(&handler);
//视图在视图内的的范围(上,下,左,右,长宽比) 比值0:最下端 比值1:最上端
//7.创建控制面板
pangolin::CreatePanel("ui").SetBounds(0.0, 1.0, 0.0, pangolin::Attach::Pix(UI_WIDTH));
pangolin::Var<int> a_int("ui.A_Int", 2,0,5);
while (!pangolin::ShouldQuit()) {
//5.清空颜色和深度缓存,如果不清空则会保留上一帧图形
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
d_cam.Activate(s_cam); //个人理解:将相机加载到视图上
//6.绘制图形
//6.1绘制立方体
//pangolin::glDrawColouredCube(-0.1,0.1); //参数决定边长
//6.2绘制点
glPointSize(20.0);
glBegin(GL_POINTS);
glColor3f(0,1,0); //三元色
glVertex3f(0,0,0);
glVertex3f(0,1,0);
glVertex3d(0,0,1);
glEnd();
//6.3绘制线
glLineWidth(20); //设置线宽
glBegin(GL_LINES);
glColor3f(0,255,0);
//两点绘制一条直线
glVertex3f(1,0,0);
glVertex3f(0,1,0);
glColor3f(255,0,0);
glVertex3f(1,0,0);
glVertex3f(0,2,0);
glEnd();
pangolin::FinishFrame();
}
return 0;
}
2.轨迹绘图部分
文件读入进一个vector容器
void DrawTrajectory(vector<Sophus::SE3d, Eigen::aligned_allocator<Sophus::SE3d>> poses) {
//vector< Sophus::SE3> poses
if (poses.empty()) {
cerr << "Trajectory is empty!\n";
return;
}
// create pangolin window and plot the trajectory
pangolin::CreateWindowAndBind("Trajectory Viewer", 1024, 768);
glEnable(GL_DEPTH_TEST);
glEnable(GL_BLEND); //使用OpenGL混合功能
//GL_SRC_ALPHA:使用源颜色的alpha值作为因子
//GL_ONE_MINUS_SRC_ALPHA:表示用1.0减去源颜色的alpha值作为因子
/*
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
则表示源颜色乘以自身的alpha 值,目标颜色乘以1.0减去源颜色的alpha值,
这样一来,源颜色的alpha值越大,则产生的新颜色中源颜色所占比例就越大,而目标颜色所占比例则减小。
这种情况下,我们可以简单的将源颜色的alpha值理解为“不透明度”。
*/
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
pangolin::OpenGlRenderState s_cam(
pangolin::ProjectionMatrix(1024, 768, 500, 500, 512, 389, 0.1, 1000),
pangolin::ModelViewLookAt(0, -0.1, -1.8, 0, 0, 0, 0.0, -1.0, 0.0)
);
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));
while (pangolin::ShouldQuit() == false) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
d_cam.Activate(s_cam);
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glLineWidth(2);
for (size_t i = 0; i < poses.size() - 1; i++) {
glColor3f(1 - (float) i / poses.size(), 0.0f, (float) i / poses.size());
glBegin(GL_LINES);
auto p1 = poses[i], p2 = poses[i + 1]; //这一部分暂时先记住使用方法
glVertex3d(p1.translation()[0], p1.translation()[1], p1.translation()[2]);
glVertex3d(p2.translation()[0], p2.translation()[1], p2.translation()[2]);
//translation() 将群取平移部分
glEnd();
}
pangolin::FinishFrame();
usleep(5000); // sleep 5 ms
}
}