参考文献:3D绘图程序库Pangolin安装以及快速入门,使用教程介绍详细,使用Pangolin绘制点云、直线、轨迹等,设置按钮,进行多窗口、多线程操作,以及Pangolin怎么使用等等
2. Base
#include <unistd.h>
#include<pangolin/pangolin.h>
using namespace std;
// 世界坐标: 右, 上, 前 = X, Y, Z
int main()
{
pangolin::CreateWindowAndBind("My Window");
glEnable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_CONSTANT_ALPHA);
pangolin::OpenGlRenderState s_cam(
pangolin::ProjectionMatrix(640, 480, 420, 420, 320, 240, 0.2, 100),
pangolin::ModelViewLookAt(0, 0, 2, 0, 0, 0, pangolin::AxisY) // 设置向上的坐标方向
);
pangolin::Handler3D hander(s_cam);
pangolin::View &d_cam = pangolin::CreateDisplay();
d_cam.SetBounds(0.0, 1.0, 0.0, 1.0, -640.0f/480.0f);
d_cam.SetHandler(&hander);
while (! pangolin::ShouldQuit())
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
d_cam.Activate(s_cam);
// 绘制所需要的东西
// 点
// glBegin(GL_POINT);
// glColor3f(1.0, 1.0, 1.0);
// glVertex3f(0.0f, 0.0f, 0.0f);
// glVertex3f(1, 0, 0);
// glVertex3f(0, 2, 0);
// glEnd();
// 线
glBegin(GL_LINES);
glLineWidth(2.0);
glColor3f(1.0, 0.0, 0.0);
glVertex3f(0,0,0);
glVertex3f(1,0,0);
glColor3f(0.0, 1.0, 0.0);
glVertex3f(0,0,0);
glVertex3f(0,1,0);
glColor3f(0.0, 0.0, 1.0);
glVertex3f(0,0,0);
glVertex3f(0,0,1);
glEnd();
// 三角
// glBegin(GL_TRIANGLES);
// glVertex3f(0,0,0);
// glVertex3f(0,1,0);
// glVertex3f(1,0,0);
// glEnd();
pangolin::FinishFrame();
}
return 0;
}
1. 创建3D窗口
#include<pangolin/pangolin.h>
int main()
{
pangolin::CreateWindowAndBind("My Window");
glEnable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_CONSTANT_ALPHA);
pangolin::OpenGlRenderState s_cam(
pangolin::ProjectionMatrix(640, 480, 420, 420, 320, 320, 0.2, 100),
pangolin::ModelViewLookAt(2, 0, 2, 0, 0, 0, pangolin::AxisY)
);
pangolin::Handler3D hander(s_cam);
pangolin::View &d_cam = pangolin::CreateDisplay().SetBounds(0.0, 1.0, 0.0, 1.0, -640.0f/480.0f)
.SetHandler(&hander);
while (! pangolin::ShouldQuit())
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
d_cam.Activate(s_cam);
// 绘制所需要的东西
pangolin::FinishFrame();
}
return 0;
}
2. 基本画图操作
#include<pangolin/pangolin.h>
int main()
{
pangolin::CreateWindowAndBind("My Window");
glEnable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_CONSTANT_ALPHA);
pangolin::OpenGlRenderState s_cam(
pangolin::ProjectionMatrix(640, 480, 420, 420, 320, 320, 0.2, 100),
pangolin::ModelViewLookAt(2, 0, 2, 0, 0, 0, pangolin::AxisY)
);
pangolin::Handler3D hander(s_cam);
pangolin::View &d_cam = pangolin::CreateDisplay().SetBounds(0.0, 1.0, 0.0, 1.0, -640.0f/480.0f)
.SetHandler(&hander);
while (! pangolin::ShouldQuit())
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
d_cam.Activate(s_cam);
// 绘制所需要的东西
glBegin(GL_POINT);
glColor3f(1.0, 1.0, 1.0);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(1, 0, 0);
glVertex3f(0, 2, 0);
glEnd();
glBegin(GL_LINES);
glLineWidth(2.0);
glColor3f(1.0, 1.0, 1.0);
glVertex3f(0,0,0);
glVertex3f(1,1,1);
glColor3f(1.0, 0.0, 0.0);
glVertex3f(0,0,0);
glVertex3f(0,1,1);
glVertex3f(0,0,0);
glVertex3f(1,0,1);
glEnd();
glBegin(GL_TRIANGLES);
glVertex3f(0,1,1);
glVertex3f(0,0,0);
glVertex3f(1,0,1);
glEnd();
pangolin::FinishFrame();
}
return 0;
}
3.GUI操作
#include <pangolin/pangolin.h>
void function(){
std::cout << "Hello pangolin" << std::endl;
}
int main() {
pangolin::CreateWindowAndBind("Main",640,480);
glEnable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
pangolin::OpenGlRenderState s_cam(
pangolin::ProjectionMatrix(640,480,420,420,320,320,0.2,100),
pangolin::ModelViewLookAt(2,0,2, 0,0,0, pangolin::AxisY)
);
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);
pangolin::CreatePanel("ui").SetBounds(0.0, 1.0, 0.0, pangolin::Attach::Pix(180));//创建
pangolin::Var<bool> a_button("ui.A_Button", false, false);//设置一个按钮,默认值为false,最后一个false表示按钮形式
pangolin::Var<double> a_double("ui.A_Double", 3, 0, 5);//设置一个double的、可拖动变换值
pangolin::Var<int> a_int("ui.A_Int", 2, 0, 5);//设置一个int的、可拖动变换值的玩意
pangolin::Var<std::function<void(void)>> reset("ui.Reset", function);//设置一个按钮,用于调用function函数
while( !pangolin::ShouldQuit() )
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
d_cam.Activate(s_cam);
if (pangolin::Pushed(a_button)){//如果a_button按钮被点,就运行if里面的语句
std::cout << "You tough a_buttom" << std::endl;
a_double = 0;
a_int = 0;
}
glColor3f(1.0, 1.0, 1.0);
pangolin::glDrawColouredCube();
pangolin::FinishFrame();
}
return 0;
}
4. 多窗口显示
#include <iostream>
#include <pangolin/pangolin.h>
void setImageData(unsigned char * imageArray, int size){
for(int i = 0 ; i < size;i++) {
imageArray[i] = (unsigned char)(rand()/(RAND_MAX/255.0));
}
}
int main(/*int argc, char* argv[]*/)
{
pangolin::CreateWindowAndBind("Main",640,480);
glEnable(GL_DEPTH_TEST);
glEnable (GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
pangolin::OpenGlMatrix proj = pangolin::ProjectionMatrix(640,480,420,420,320,240,0.1,1000);
pangolin::OpenGlRenderState s_cam(proj, pangolin::ModelViewLookAt(1,0.5,-2,0,0,0, pangolin::AxisY) );
pangolin::OpenGlRenderState s_cam2(proj, pangolin::ModelViewLookAt(0,0,-2,0,0,0, pangolin::AxisY) );
pangolin::View& d_cam1 = pangolin::Display("cam1")
.SetAspect(640.0f/480.0f)
.SetHandler(new pangolin::Handler3D(s_cam));
pangolin::View& d_cam2 = pangolin::Display("cam2")
.SetAspect(640.0f/480.0f)
.SetHandler(new pangolin::Handler3D(s_cam2));
pangolin::View& d_cam3 = pangolin::Display("cam3")
.SetAspect(640.0f/480.0f)
.SetHandler(new pangolin::Handler3D(s_cam));
pangolin::View& d_cam4 = pangolin::Display("cam4")
.SetAspect(640.0f/480.0f)
.SetHandler(new pangolin::Handler3D(s_cam2));
pangolin::View& d_img1 = pangolin::Display("img1")
.SetAspect(640.0f/480.0f);
pangolin::View& d_img2 = pangolin::Display("img2")
.SetAspect(640.0f/480.0f);
pangolin::Display("multi")
.SetBounds(0.0, 1.0, 0.0, 1.0)
.SetLayout(pangolin::LayoutEqual)
.AddDisplay(d_cam1)
.AddDisplay(d_img1)
.AddDisplay(d_cam2)
.AddDisplay(d_img2)
.AddDisplay(d_cam3)
.AddDisplay(d_cam4);
const int width = 64;
const int height = 48;
unsigned char* imageArray = new unsigned char[3*width*height];
pangolin::GlTexture imageTexture(width,height,GL_RGB,false,0,GL_RGB,GL_UNSIGNED_BYTE);
while( !pangolin::ShouldQuit() )
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
setImageData(imageArray,3*width*height);
imageTexture.Upload(imageArray,GL_RGB,GL_UNSIGNED_BYTE);
glColor3f(1.0,1.0,1.0);
d_cam1.Activate(s_cam);
pangolin::glDrawColouredCube();
d_cam2.Activate(s_cam2);
pangolin::glDrawColouredCube();
d_cam3.Activate(s_cam);
pangolin::glDrawColouredCube();
d_cam4.Activate(s_cam2);
pangolin::glDrawColouredCube();
d_img1.Activate();
glColor4f(1.0f,1.0f,1.0f,1.0f);
imageTexture.RenderToViewport();
d_img2.Activate();
glColor4f(1.0f,1.0f,1.0f,1.0f);
imageTexture.RenderToViewport();
pangolin::FinishFrame();
}
delete[] imageArray;
return 0;
}