新知识总是让人很兴奋。
虽然别人看起来很low,但是,我开心就好了。
分享给有需要的人,代码质量勿喷。
一、新建类,继承QGLViewer
1.1 头文件 xjQGLViewer.h
#include <math.h>
#include <stdlib.h>
#include "QGLViewer\qglviewer.h"
class xjQGLViewer : public QGLViewer
{
Q_OBJECT
public:
xjQGLViewer();
~xjQGLViewer();
protected:
virtual void draw();
virtual void init();
private:
bool bShowPointCloud;
std::map<int, std::vector<double>> mLasPont;
std::vector<double> centerPoint;
void DrawPointCloud(const std::map<int, std::vector<double>> &mLasPont, const std::vector<double> ¢erPoint);
public:
bool ShowPointCloud(const bool &bReadLas, const std::map<int, std::vector<double>> &mapLasPont, const std::vector<double> &xjCenterPoint);
};
1.2 源文件 xjQGLViewer.cpp
#include "xjQGLViewer.h"
xjQGLViewer::xjQGLViewer()
{
bShowPointCloud = false;
mLasPont.clear();
centerPoint = { 0,0,0 };
}
xjQGLViewer::~xjQGLViewer()
{
}
void xjQGLViewer::init()
{
restoreStateFromFile();
setSceneRadius(20);
camera()->fitSphere(qglviewer::Vec(0, 0, 0), 20);
}
void xjQGLViewer::draw()
{
if (bShowPointCloud)
{
DrawPointCloud(mLasPont, centerPoint);
}
}
//是否显示点云
bool xjQGLViewer::ShowPointCloud(const bool &bReadLas, const std::map<int, std::vector<double>> &mapLasPont, const std::vector<double> &xjCenterPoint)
{
bShowPointCloud = bReadLas;
if (bShowPointCloud)
{
mLasPont = mapLasPont;
centerPoint = xjCenterPoint;
}
return bShowPointCloud;
}
//加载点云:XXX有点慢...
void xjQGLViewer::DrawPointCloud(const std::map<int, std::vector<double>>& mLasPont, const std::vector<double>& centerPoint)
{
glPointSize(3);
glBegin(GL_POINTS);
int pcCount = mLasPont.size();
for (int i = 0; i < pcCount; i++)
{
std::vector<double> p = mLasPont.at(i);
qglviewer::Vec Pt;
Pt.x = p[0] - centerPoint[0];
Pt.y = p[1] - centerPoint[1];
Pt.z = p[2] - centerPoint[2];
glColor3f(p[6], p[7], p[8]);
glVertex3fv(Pt);
}
glEnd();
}
二、主函数
//打开点云文件
void PointCloudDispose::on_actionOpen_triggered()
{
QString fileAbsolutePath = QFileDialog::getOpenFileName(this, "选择LAS...", mTemPath, "*.las");
if (fileAbsolutePath.isEmpty())
return;
if (!QFile::exists(fileAbsolutePath))
return;
mTemPath = QFileInfo(fileAbsolutePath).absolutePath();
mLasAbsolutePath = fileAbsolutePath;
//PDAL读取Las
std::map<int, std::vector<double>> mapLasPont;
std::vector<double> xjCenterPoint = { 0,0,0 };
bool bReadLas = ReadLasTomap(fileAbsolutePath, mapLasPont, xjCenterPoint);
//加载显示点云
xjViewer->ShowPointCloud(bReadLas,mapLasPont, xjCenterPoint);
}