经过上一阶段的学习,我们已经大致可以用Qt+OpenGL去显示我们想要的点。接下来我们要去读取点云文件并加以显示
第一步,我们要去读取点云文件:
首先,在界面文件上搞个Push Button按钮,然后改个名字,叫做loadmesh。然后右键转到槽,发现会在界面文件的cpp(一般默认是mainwindow.cpp)里面出现这个:
另外如果不想用此种方式也可以用connect做,在这里不细说。
在界面文件的cpp里添加头文件:
#include<iostream>
#include<string>
然后函数中填写以下代码:
QString fileName = QFileDialog::getOpenFileName(this,
tr("Open Mesh"), QDir::currentPath(),
tr("Poly Model (*.ply);;STL Model (*.stl);;PCD Model (*.pcd)"));
然后可以编译运行一下:
所以根据这个可以理解代码的含义,tr(“Open Mesh”),意思是窗口的名字 QDir::currentPath()意思是打开窗口的时候的默认初始化路径
tr(“Poly Model (.ply);;STL Model (.stl);;PCD Model (*.pcd)”));意思是只能打开这三种格式的文件,注意,文件和文件之间要用两个分号隔开。
然后函数中加上以下代码:
if(!fileName.isEmpty())
emit loadMesh(fileName);
意思就是如果filename不是空的,就是有文件载入,那么就执行loadMesh(fileName);
然后在glarea的头文件里面,就是最早的时候提升的那个类的头文件,加上声明:
void loadMesh(QString filename);
在定义函数之前,要先加一些东西,加一些子类:
using namespace vcg;
class CFace;
class CEdge;//me+
class CVertex;
struct MyUsedTypes : public UsedTypes< Use<CVertex>::AsVertexType,
Use<CEdge>::AsEdgeType,
Use<CFace>::AsFaceType>{};
class CVertex : public vcg::Vertex< MyUsedTypes,
vcg::vertex::Coord3f,
vcg::vertex::Normal3f,
vcg::vertex::BitFlags,
vcg::vertex::VFAdj >{};
class CEdge : public vcg::Edge<MyUsedTypes,
vcg::edge::BitFlags,
vcg::edge::EVAdj,
vcg::edge::EEAdj >{};
class CFace : public vcg::Face< MyUsedTypes,
vcg::face::VertexRef,
vcg::face::Normal3f,
vcg::face::BitFlags,
vcg::face::FFAdj,
vcg::face::VFAdj > {};
class CMesh : public vcg::tri::TriMesh< std::vector<CVertex>, std::vector<CFace> > {};
然后在glarea类里面声明cmesh类的对象mesh:
private:
CMesh mesh;
注意,在vcg中,用的数据类型大多数为cmesh类下的对象。
好,下一步,我们来搞事情:
声明一下函数
void glarea::loadMesh(QString fileName)
{
int err=vcg::tri::io::ImporterPLY<CMesh>::Open(mesh,(fileName.toStdString()).c_str());
if(err!=0)
{
const char* errmsg=vcg::tri::io::ImporterPLY<CMesh>::ErrorMsg(err);
QMessageBox::warning(this,tr("Error Loading Mesh"),QString(errmsg));
}
int pointnum=mesh.vert.size();
std::cout<<"点云个数为"<<pointnum<<std::endl;
}
现在就可以运行一下了:
说明读取赋值正确(在这里有些朋友可能会遇到中文字乱码的问题,可以试试在头文件下加上#pragma execution_character_set(“utf-8”)试一下)感兴趣的小伙伴可以自己修改代码,实现能读入stl文件、obj文件等等