Qt+OpenGL可视化入门基础篇(二)——如何读取点云文件

经过上一阶段的学习,我们已经大致可以用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文件等等

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值