七斤古 2024-07-01 18:03 采纳率: 0%
浏览 9

探究cloudcompare对打开的点云文件的渲染分析

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

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-07-01 18:03
    关注

    引自免费微信小程序:皆我百晓生

    首先,我理解你对cloudcompare中的点云加载和渲染过程感到困惑。这是一个涉及多个步骤和组件的复杂过程。我会尝试用简单的语言来解释这个过程,并帮助你理解它。

    1. 点云文件的加载

    首先,你提到了通过FileIOFilterLoadFromFile方法来加载点云文件。这个方法的主要目的是从文件中读取点云数据并将其加载到内存中。这里的container是一个对象,用于存储从文件中加载的点云数据。这个数据可能包括点的坐标、颜色、法线等。

    2. 点云数据的处理

    在加载过程中,可能会涉及到各种过滤器(例如你提到的PlyFilter),这些过滤器专门处理特定格式的点云文件。这些过滤器读取文件并提取点云数据,然后可能进行某些处理或转换,以适应内存中的数据结构。

    3. 点云数据的获取和渲染

    一旦点云数据被加载和处理,它就可以被获取并用于渲染。在cloudcompare中,渲染通常在一个GL窗口(如ccGLWindowInterface)中进行。这个窗口负责显示点云数据和其他图形数据。获取点云数据通常意味着从之前创建的container对象中读取点的坐标和其他相关信息。然后,这些数据被传递给渲染引擎进行可视化。

    渲染过程通常涉及将点云数据转换为图形硬件可以理解的形式,并在屏幕上显示出来。这可能包括计算点的位置、颜色、大小等,然后将这些信息传递给图形处理单元(GPU)进行渲染。

    详细解释

    • 文件加载:你通过用户界面选择文件并点击打开,程序会调用相关函数(如LoadFromFile)来加载文件。这些函数会解析文件并提取点云数据。
    • 数据处理:提取出的数据可能需要进行一些处理或转换,以适应内存中的数据结构或满足特定的需求。
    • 数据存储:处理后的数据存储在container对象中,这个对象包含了点的坐标和其他相关信息。
    • 渲染过程:在GL窗口中,从container中获取点云数据,并将其转换为图形硬件可以理解的形式。然后,这些数据被渲染并显示在屏幕上。

    为了更深入地理解这个过程,你可能需要查看cloudcompare的源代码和文档,特别是关于点云处理、渲染和图形用户界面的部分。此外,关于计算机图形学和三维可视化的一般知识也会很有帮助。希望这个解释能帮助你更好地理解这个过程!

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 7月1日

悬赏问题

  • ¥15 这个如何解决详细步骤
  • ¥15 在微信h5支付申请中,别人给钱就能用我的软件,这个的所属行业是啥?
  • ¥30 靶向捕获探针设计软件包
  • ¥15 react-diff-viewer组件,如何解决数据量过大卡顿问题
  • ¥20 遥感植被物候指数空间分布图制作
  • ¥15 安装了xlrd库但是import不了…
  • ¥20 Github上传代码没有contribution和activity记录
  • ¥20 SNETCracker
  • ¥15 数学建模大赛交通流量控制
  • ¥15 为什么我安装了open3d但是在调用的时候没有报错但是什么都没有发生呢