最近在研究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
最后这个问题就是导入的这个点云文件,点云坐标是怎么获取,获取到的点云数据又是怎么渲染的,谁能详细说说啊,哭死!