最近在研究cloudcompare的源代码,分析点云渲染是怎么实现的,问题就是导入的这个点云文件,点云坐标是怎么获取,获取到的点云数据又是怎么渲染的,谁能详细说说啊,哭死!!!
初步解答思考:
首先在mainwindow.cpp中找到
//"File" menu connect(m_UI->actionOpen, &QAction::triggered, this, &MainWindow::doActionLoadFile);
然后进入doActionLoadFile这个槽函数看看
void MainWindow::doActionLoadFile() { //一大堆有的没的 ... //load files addToDB(selectedFiles, currentOpenDlgFilter); }
然后进入到addToDB这个函数中,
void MainWindow::addToDB( const QStringList& filenames, QString fileFilter/*=QString()*/, ccGLWindowInterface* destWin/*=nullptr*/) { //一大堆有的没的。。 for ( const QString &filename : filenames ) { CC_FILE_ERROR result = CC_FERR_NO_ERROR; //把点云的数据存到newGroup中 ccHObject* newGroup = FileIOFilter::LoadFromFile(filename, parameters, result, fileFilter); //一大堆有的没的。。 addToDB(newGroup, true, true, false); //一大堆。。 }
找到LoadFromFile函数,进入到其定义:
ccHObject* FileIOFilter::LoadFromFile( const QString& inputFilename, LoadParameters& loadParameters, CC_FILE_ERROR& result, const QString& fileFilter ) { ...... return LoadFromFile(filename, loadParameters, filter, result); }
return这个函数的结果,在进入到LoadFromFile的定义:
ccHObject* FileIOFilter::LoadFromFile( const QString& filename, LoadParameters& loadParameters, Shared filter, CC_FILE_ERROR& result) { ...... //load file ccHObject* container = new ccHObject(); result = CC_FERR_NO_ERROR; ...... try { result = filter->loadFile( filename, *container, loadParameters); } ....... return container; }
可以知道container就是用来装点云的容器,这里用了多态调用函数对container赋值,
result = filter->loadFile( filename, *container, loadParameters);
进入到PlyFilter.cpp中的loadFile,
CC_FILE_ERROR PlyFilter::loadFile(const QString& filename, ccHObject& container, LoadParameters& parameters) { return loadFile(filename, QString(), container, parameters); }
再进入到return的loadFIle的定义中,然后就开始蒙了
我也参考了如下这篇文章,稍微理解了一点:https://spacevision.blog.csdn.net/article/details/125237542?spm=1001.2014.3001.5502最后这个问题就是导入的这个点云文件,点云坐标是怎么获取,获取到的点云数据又是怎么渲染的,谁能详细说说啊,哭死!!!
全部评论
(0) 回帖