Potree:大规模点云渲染

前言

Potree 是基于 WebGL 的开源大规模点云渲染器,其由维也纳工业大学计算机图形与算法研究中心(Institute of Computer Graphics and Algorithms, TU Wien)开发。官网点击这里:Potree
根据相关论文以及展示的介绍,其支持 Billion 级别点云数据的渲染,一个复杂场景渲染示例如下图所示:
CA13

点云数据中本身仅仅包含多个点数据,对于较小规模的点云数据,只需要依次使用面或者点等方式将其全部渲染出来。但是面对较大数据量的点云,就需要考虑许多随之而来的问题:

  • 内存限制:以基于 V8 引擎为例,32 位机器可使用内存约为 0.7 GB,64 位机器可使用内存约为 1.4 GB。而渲染完整的 1 Billion 无 RGB 信息的点云数据就需要超过 22 GB 的内存进行存储(对于 JavaScript 仅有 double 数据,其计算为每个点需要 XYZ 三个点,即存储每个点需要 3 × 8 个 Byte 的内存,1 Billion 点云约为 22.35 GB)。因此,必须将点云数据进行分割,从而按需渲染以减少内存使用量;
  • 实时渲染需求:对于点云渲染的应用场景,往往并不仅仅只需要输出渲染后的可视化结果,而是需要满足基于点云渲染后的具体应用需求,例如游戏或者标注工具等。这对于点云渲染带来了实时性的需求,因此必须对巨大规模的点云数据采取一定的处理以减少 CPU 以及 GPU 的计算压力;
  • 网络传输速度:B/S 架构下由于点云资源需要通过网络进行传输,如果直接传输完整的点云数据,则在渲染计算开始前,用户需要花费大量的等待时间。这一点对于用户体验而言也同样是必须解决的痛点。

以上所述的问题需要对于点云渲染的各个阶段采取一定的措施,包括:数据预处理、数据加载、渲染计算等,但是归根结底,其本质就在于给出高效的点云数据结构

数据结构

在正式介绍 Potree 的数据结构之前,首先对于铺垫产生的这一数据结构的前述研究进行一个简单的介绍。
与大多

  • 21
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
可以使用VTK来显示pcl::PointCloud<pcl::PointXYZ>::Ptr类型的点云。以下是一个简单的示例代码: ```cpp #include <vtkRenderWindow.h> #include <vtkRenderer.h> #include <vtkSmartPointer.h> #include <vtkPoints.h> #include <vtkPolyData.h> #include <vtkPolyDataMapper.h> #include <vtkActor.h> #include <vtkRenderWindowInteractor.h> #include <pcl/point_types.h> #include <pcl/io/pcd_io.h> int main(int argc, char** argv) { pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); pcl::io::loadPCDFile<pcl::PointXYZ>("your_point_cloud.pcd", *cloud); vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New(); for (size_t i = 0; i < cloud->points.size(); ++i) { points->InsertNextPoint(cloud->points[i].x, cloud->points[i].y, cloud->points[i].z); } vtkSmartPointer<vtkPolyData> polyData = vtkSmartPointer<vtkPolyData>::New(); polyData->SetPoints(points); vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New(); mapper->SetInputData(polyData); vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New(); actor->SetMapper(mapper); vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New(); renderer->AddActor(actor); vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New(); renderWindow->AddRenderer(renderer); vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New(); interactor->SetRenderWindow(renderWindow); renderWindow->Render(); interactor->Start(); return 0; } ``` 在这个例子中,我们使用vtkSmartPointer来管理VTK对象的生命周期。首先,我们加载了一个pcl::PointCloud<pcl::PointXYZ>::Ptr类型的点云。然后,我们将点云数据复制到VTK的vtkPoints对象中。接下来,我们使用vtkPolyDataMapper和vtkActor对象将vtkPoints对象中的点云数据可视化。最后,我们创建了一个vtkRenderWindowInteractor对象,它允许用户与渲染窗口进行交互,并启动了渲染窗口的事件循环。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值