手机有问题,看视频看不了,听音乐说es文件浏览器4.1.0不支持,看一会儿就自己突然关机,而且还没有声音

版权声明:本文为博主原创文章,未经博主允许不得转载。 /qq_/article/details/

本论文介绍了Potree,一种基于网络的大点云的渲染器。它允许用户在标准网络浏览器中实时查看来自诸如LIDAR或摄影测量等来源的数十亿个点的数据集。
在网络浏览器中点云可视化的一个主要优点是它允许用户与客户或公众共享他们的数据集,而不需要预先安装第三方应用程序和传输大量的数据。对大点云的重点和各种测量工具也允许用户使用Potree来查看、分析和验证原始点云数据,而不需要耗费时间和可能成本高的网格划分步骤。
在web浏览器中数十亿点的流式传输和渲染,而不需要预先加载大量数据,是通过以不同分辨率存储原始数据的子样本的分层结构来实现的。低分辨率存储在根节点中,并且随着每个级别,分辨率逐渐增加。该结构允许Potree剔除视锥体外的点云的区域,并且以较低的细节水平渲染远处的区域。
结果是一个开源点云查看器,它能够在Web浏览器中实时渲染高达5970亿点的点云数据集,压缩后大约1.6太字节。

点云是由点而不是更广泛使用的三角形模型组成的三维模型。它们最常见的是通过各种扫描方法(例如激光扫描和摄影测量)扫描真实世界的结果。使用案例包括生成三维地图和地球仪(例如Google Maps, Cesium),跟踪建筑进度或城市、森林或其他类型的景观的变化,游戏和电影的三维资产生成,或以捕获运动和姿势(例如,Kinect)。在许多使用情况下,点云被视为原始数据,然后通过将其转换为三角形模型或二维图像来进行细化。

为了向客户或感兴趣的受众展示这些模型,传统上需要传输大量数据并安装第三方应用程序以查看它们。有时,数据必须通过邮件发送硬盘来传输,因为它们需要大量的空间。

随着WebGL的发布,通过Web浏览器的3D内容分发已经变得越来越流行。它已经发展成为所有主流浏览器,台式机甚至移动设备本地支持的标准。 WebGL现在允许开发人员、艺术家、公司、研究人员和其他人与广大的受众分享他们的内容,而不需要安装额外的软件。许多服务,如Sketchfab [61],已经出现,允许用户上传、共享和查看内容,而不需了解底层的WebGL机制。

在大多数情况下,内容相对较小的完整的数据集很适合内存,可以在合理的时间量下载并实时呈现。但是,某些类型的内容超出了这些要求,数据可能不适合内存,或下载完整的数据需要几分钟甚至几个小时。

本论文的目标是开发一个能够流化和渲染点云数据集数十亿点的查看器,而不需要首先传输整个数据集或安装第三方查看器。

诸如激光扫描仪或摄影测量的3D扫描技术产生大量的数据,通常超过数亿或数十亿点。由于点数据的性质,需要大量的点来精确地表示甚至很简单的模型。例如,平坦墙面可以由单个四边形和纹理表示,但是可能需要数千或数百万个有色点来达到相同的细节量。

虽然许多用例将密集点云模型转换为更紧凑的纹理三角形网格,但这并不总是希望的或可能的。低分辨率三角形网格的生成伴随着信息的丢失,由于对于复杂对象或表面的低扫描密度,可能不总是可行的,并且其可能是非常耗时和昂贵的。除此之外,经常有必要能够验证从点云到三维三角网格、二维地图或任何其他最终产品的转换的结果。

点云数据的主要挑战之一是处理和呈现不适合存储器的数据集。这些类型的数据集需要使用外核算法。外核算法一次只加载和处理小块数据。一旦块已经被处理,或者它不再需要,它被从存储器中移除以用于下一个块。

作为点云数据维度的一个例子,美国地质调查局(USGS)目前正在对整个美国进行全国扫描。假设海拔质量水平为2,有效点密度为每平方米3点,预期约27万亿个点[63] [62]。这转换为大约540太字节的未压缩存储。

除了处理和渲染巨大的数据集,使它们随时可用是另一个大的挑战。测量者可能想与他们的客户共享数据或者宣传他们过去的项目;考古学家、艺术家或科学家可能想与公众分享他们的数据集,以使别人对他们的工作感兴趣;而其他人可能希望能够快速分析点云,而不首先复制或下载大量数据。访问越容易,观众越多。很少有用户会只为看看一个数据集的乐趣而升级他们的硬件。如果需要的是半大型下载和第三方查看器,则更多用户将感兴趣。本论文的目的之一是通过使过程像访问网页一样容易,最大限度地增加观众。

为了能够在Web浏览器中实时查看完整的数据集及其所有细节,本硕士论文基于Scheiblauer引入的可修改的嵌套八叉树(MNO)结构[54]。这种结构使得可以剔除视锥体外的点,并以较低的细节水平渲染远处区域。

本论文的主要贡献是采用经过验证的点云渲染方法到不太灵活和资源有限、但广泛可用的运行时环境:标准的Web浏览器。

这种采用包括对网络传输速率的修改,其比从磁盘加载数据低两个数量级,以及以有用的方式或更高质量显示数据的渲染模式,对性能的影响较小
改善慢连接行为的贡献是新的文件格式,二维高度轮廓的逐步加载和渲染,以及逐点自适应点大小,其将每个点的大小调整到细节的水平,作为附加点被流式传输随着时间的推移。

改进渲染结果的贡献是泊松碟采样方法,其产生更均匀间隔的子集,减少来自重叠点的遮挡的内插法以及用于高质量分割的自适应混合深度。

以下列表提供了个人贡献的简短描述:

通过缓慢连接改善行为的贡献:

1.具有层次结构分区的新文件格式,允许Potree按需加载大点云层次结构。大数据集的多分辨率层次结构可以由数百万个节点组成。该大小的层次可以是数百兆字节的大小,如果它们被存储在单个文件中,则显著增加初始加载时间。

2.快速和渐进的高度剖面查询方法。甚至包含数百万或数十亿点的轮廓也会被快速显示,因为只有最重要的点被加载和渲染。

3.自适应点大小模式,可将点大小调整到详细程度。这种适应允许隐藏不同层次的细节之间的密度差异。作为副作用,这种方法可以使点云看起来像一个封闭的表面,只有最接近的缩放级别,没有任何过度绘制。与Scanopy的点尺寸启发式的区别在于,Potree的自适应点尺寸模式将点的大小逐点调整到细节级别,而Scanopy的点尺寸启发式基于节点中点密度的估计来逐节点地调整大小。

1.快速泊松碟采样方法,创建比网格方法更自然的子集。泊松碟样本是均匀点集,每个点之间具有最小距离。

2.产生类似于Voronoi图的最近似相似渲染的内插splat模式。此方法实现为单通道着色器,其修改片段深度以便将点渲染为抛物面而不是屏幕对齐的正方形。它提供了方形或圆形分割的性能和高质量分割方法的质量之间的折衷。

3.自适应混合深度用于高质量分割(高斯分布)。混合深度指定点混合在一起的范围,以创建更平滑和抗锯齿的结果。由于在较低细节水平的点之间的距离增加,常数值不适用于多分辨率渲染系统中的任意缩放级别。自适应混合深度可将混合深度调整为点的世界空间大小。如果与自适应点大小组合,它将混合深度设置为等于点之间的间距。

更一般地,本论文贡献了一个最先进的、高性能、高质量渲染模式的WebGL点云渲染系统和各种有用的工具。此外,实现了各种现有技术的方法,例如Eye-Dome Lighting,其计算照明而不需要法线,GPU上的快速点拾取,剪辑框和注记。

第2章概述了相关工作,包括大点云的其他观察者,以及与点云的高质量渲染相关的工作。在第3章中给出了所采用的可修改嵌套八叉树模型的描述,此结构的构建以及在渲染过程中如何遍历它。第4章描述了如何渲染点云。 这包括颜色和点大小的计算,以及高质量渲染模式和Eye-Dome照明着色器,它可以计算照明和轮廓,而不需要法线。 第5章介绍了Javascript和WebGL的实现细节,并描述了Potree中的一些功能。性能评估,第三方对Potree的应用,以及我们自己的一些结果显示在第6章中。第7章给出了未来任务的结论和非穷尽列表。

处理大量的点,通常不适合内存,需要流入、处理和渲染整个数据的一小部分的核心算法。大多数方法采用分层空间分区结构的变体,也称为多分辨率结构,例如kd树、八叉树或四叉树,并用表示不同分辨率的原始模型的数据填充所有节点。这些方法中的一些在分层结构内重新分布原始点数据,而其他方法仅将原始数据存储在叶节点中,并将内部节点中的下采样平均值存储。

[52]的QSplat渲染系统是第一个能够渲染数亿点的多分辨率系统。QSplat方法从输入点云或网格中创建边界球层次结构,可以遍历以创建逐渐更精细的模型渲染。每个叶节点表示单个点样本,而内部节点表示包围它们各自子树的边界球。通过遍历分层结构直到遇到叶子,或者直到达到期望的细节水平,即当屏幕投影的边界球足够小时,完成渲染。每当在子树中的遍历被暂停时,绘制表示当前边界球或节点的顶点的点划线。QSplats使用一个总是沿其最长轴拆分的二叉树。

Gobbetti和Marton [20]开发了GPU友好的多分辨率结构,分层点云(LPC),显著降低了CPU端的遍历成本,并利用GPU并行渲染数千个几何原语的熟练程度。 LPC结构存储分层结构的每个节点中的点云的子样本。遍历的成本被降低,因为仅需要遍历到覆盖更大区域的子样本之一,而不是覆盖小区域的各个点。子样本是静态的,发送到GPU一次,并且随后由GPU渲染,GPU特别好地平行地渲染数千个多边形或点。LPC使用总是沿其最长轴分裂的二叉树。

Wimmer和Scheiblauer [75]引入了嵌套的八叉树,这是一个类似于LPC的结构,它在其节点中存储原始数据的子样本,但它接受任意点数据集作为输入,而LPC假设输入被均匀采样。

每个节点中的子样本是借助于一个内接的八叉树构建的。这些内切的八叉被称为内八叉,它们被内接的节点是外八叉的一部分,因此名称为嵌套的八分。外部八叉树用于确定可见性,内部八叉树用于创建子样本。

进一步的研究导致不仅适合渲染的结构,而且还适用于大规模点云的修改。 Wand et al [70]提出了一种八叉树结构,其在叶节点中分布原始数据集,并在内部节点中简化多分辨率表示。简化的多分辨率表示可以包括子树中的代表点的选择或子树中的点的平均。在前一种情况下,将创建重复项,而在后一种情况下,将创建新的点。

新插入的点总是向下行进到叶节点并且沿着路径更新多分辨率表示。类似地,当点被删除时,它从相应的叶中被去除,并且多分辨率表示,直到根为止被更新。

Wand et al还描述了在根的边界框外的新添加的点的情况。在这种情况下,将创建一个具有两倍大小的新节点,并且当前根将成为此新节点的子节点。此过程在点的方向上重复,直到八叉树包含新点。

用于编辑点云的另一种结构是Scheiblauer和Wimmer的可修改的嵌套八叉树(MNO)[56]。除了适合于插入和删除操作的八叉树结构之外,它们还引入了选择八叉树,其允许用户使用体积刷选择点。MNO基于嵌套的八叉树,但是为了提高插入和删除操作的性能,内部八叉树已经被网格替换。在MNO中,通过接受落入节点的内接网格的单元中的点来创建点样本。引入选择八叉树,以便用户可以使用体积笔刷选择点,而不会忽略在选择期间不可见的较高细节节点中的点。基本音量刷工具仅能够在选择期间选择核心中的点。然而,选择八叉树记住卷的哪些部分是选择的一部分,并且将确保相应的点被标记为选择,如果稍后加载它们。

2.2基于Web的大规模点云和体素渲染

本节介绍基于网络的点云渲染器,它们也旨在渲染大型数据集。

Greyhound是HTTP请求时将索引数据流式传输到客户端的HTTP服务器。Plasio是一个基于WebGL的点云渲染器,可以渲染las或laz格式的点云,或从灰狗服务器传输点云。他们还创建了一个zipzip的Javascript端口,以便能够直接在浏览器中解压缩laz文件。

PointCloudViz服务器和相应的Web客户端[45]是Mirage Technologies [35]的商业服务,并且是其免费桌面LIDAR查看器的补充。他们的系统使用多分辨率结构来有效地进行流和渲染。值得注意的功能包括定向拼接、照明、不同的材料,如RGB、强度和分类,以及通过滑块改变高度和强度的颜色渐变。

ShareLIDAR [59]是一个具有托管服务的多分辨率点云渲染器。不可取的功能包括通过法线的照明、正交顶视图,截面(高度轮廓)工具和点大小的调整以减少孔。缺点是它在不覆盖整个数据集的较小图块中加载数据,这导致大的空白空间,同时用户等待数据流入。

udWeb Demo [66]是基于Web浏览器的欧几里德无限细节/ Geoverse技术的演示。元素被呈现为块而不是点,这导致了Euclideon使用基于体素的呈现方法而不是点云的假设。这允许在数据集中关闭孔而不引起重叠,这两者在点云渲染中是常见的。块最初非常大,给出数据的粗略表示,并且在新数据流入时缩小大小。

2.3基于桌面的大规模点云和体素渲染

Scanopy [54]是TU Wien的计算机图形部门的一个项目,也是能够渲染并编辑具有数十亿分的点云的第一个点云渲染器之一。 Potree起源于用Scanopy开发的基于网络的结构和算法版本。

Arena4D by Veesus [67]包括一个桌面渲染器和一个点服务器,允许流点云。它能够渲染大量的点云数据集,并包括用于选择和编辑点云的各种工具。

Geoverse [19]是Euclideon的点云查看器,它以其无限细节技术的营销而闻名,并支持在太字节范围内呈现数据集。虽然它被广告为点云渲染器,但是其渲染的性质可以指示它实际上是一个体素渲染器。

PointCloudViz是Mirage Technologies的免费点云查看器[35]。它包括诸如生成数字高程模型(DEM),叠加地理参考图像和测量等功能。

Voxel Quest [68]是GavanWoolery的一个项目,能够创建和渲染大型程序体素环境。作者在其一生中尝试了不同的渲染技术,包括在有符号距离场上的光线投射和作为点原始图像的光栅化体素,有效地将体素数据集视为点云。

2.4基于点的高质量渲染

与多边形网格不同,点云不包含连通性信息,并且表示表面上的一组点而不是封闭的表面。点通常在屏幕上呈现为矩形、圆形或单个像素。这些原语在GPU上快速渲染,但是结果遭受诸如重叠点之间的遮挡和混叠伪像的问题。高质量渲染方法提供了提高点云渲染的质量的方法,而不需要将它们转换为网格。

Hermels [24]介绍了Surfels,表面元素的简称,后来Pfister等人提出了一种渲染原语 [41]。在基于点的渲染的上下文中,Surfel是三维空间中的定向盘或椭圆。Surfel的定向椭圆有助于避免相邻样本之间的孔。

表面划片由Zwicker et al [76]描述了一种高质量的滤波方法,其中投影点的像素由高斯滤波器函数加权。靠近点中心的像素的权重高于远离像素的像素。将所有点的加权贡献相加,然后通过所有权重的和来归一化。

为了确保只有属于同一表面的点对结果有贡献,该方法比较深度值,并且只有在某个值域内时才接受新的贡献。这种方法产生高质量、抗锯齿的结果,但它是实现在软件渲染器在这个时候。

在GPU演进之后,Botsch等人[7]在今天的GPU上引入了高质量表面分割,这是最终使得可以利用GPU以产生高质量的、抗锯齿的点云的原始表面分割的近似。它们的方法包括深度通道、属性通道和归一化通道。深度通道确保只有可见表面的点,即最接近观看者的点加上附加的偏移,有助于结果。属性通道使用添加混合来累积每个点的加权贡献,并且归一化通道将加权贡献归一化为权重的和。

表面划分是考虑到定向拼图而开发的,但由于大多数点云数据集不包含必要的法线或半径,Scheiblauer [55]建议使用屏幕对齐圆,这也是我们在Potree中所做的。

Preiner et al[47]后来开发了Auto Splats,一种在屏幕空间渲染过程中计算缺失法线和半径的方法,以便允许比屏幕对齐圆更高质量的表面划分。在飞行中计算法线也使得可以应用诸如Phong的照明模型。

Eye-Dome-Lighting是一种技术,可以创建照明点云渲染,而不需要法线,由Boucheny描述[8]。此技术类似于边缘检测滤波器,因为其对点周围的邻域进行采样,并基于深度差产生响应。深度上的小差异与面向用户的表面相关,而深度上的较大差异与越来越远离的表面相关。此特性用于计算阴影表面而不依赖于法线。

点云通常太大,无法整合到内存中,因此必须使用核外算法进行处理。一个可能的核外选项是将数据拆分成多个图块,并且一次处理一个或几个图块。这种方法对于处理工作良好,但是对于可视化,通常希望显示整个数据集,而不是一次只显示几个瓦片。

将原始模型的各种级别的细节存储在层次空间分割数据结构中允许点云渲染器快速加载和显示点云的相关部分。靠近照相机的区域被以比远距离区域更高的细节水平呈现,并且在视锥体之外的区域被完全丢弃。八叉树和kd树的变化是用于渲染大点云的两种流行的空间分割结构。一些变体存储原始点云的子样本。其他将原始数据存储在叶节点和下采样平均值或内部节点中的子树的包围体积。我们选择了一种对原始点云进行子采样的结构,因为它不会创建需要额外磁盘空间的新点,并且它允许用户在任何缩放级别对原始未更改的数据进行点选和测量,而不需要以等待直到加载叶节点。第2章给出了大点云的渲染和修改的结构概述。

Potree的结构是基于稍微改编的可修改的嵌套八叉树(MNO)结构,该结构被引入,并被Scheiblauer [54]内置到Scanopy点云渲染器中。图3.1显示了已经划分为MNO的球形点云。
图3.1:低层节点(左)包含大区域上的稀疏模型。每个级别以指数方式增加点和详细信息的数量。

3.2可修改的嵌套八叉树

我们简要描述Potree基于的可修改的嵌套八叉树结构。

可修改的嵌套八叉树结构存储每个节点中原始点云的子样本。低级节点包含大量的稀疏子样本。对于每个级别,节点的大小收缩,而点密度增加。原始数据集的每个点被分配给正好一个八叉树节点。这意味着不创建新点或重复,并且组合所有节点中的所有点返回原始数据集。

原始MNO结构通过具有1283个单元的内切三维网格获得其子样本。最初,点被添加到根节点,并且点将占据其落入的第一个单元。如果点落入已经占用的单元格中,并且节点中的点的总数低于阈值,则该点将被分配给该节点,而存储在填充数组中而不是网格中。填充数组除了网格之外还保持在同一节点中的另外的点,以便避免立即创建新的子节点以存储这些点的需要。一旦落入潜在的新子节点的足够的点已经累积,就创建新的子节点。因此,新的子节点被立即填充最小量的点。

这种子采样方法导致不同的八叉树水平上的点密度变化,并且它也避免了大多数空节点,因为新节点仅在为新的孩子积累了最小量的点之后创建。然而,它并不能保证点之间有一定的最小距离。相邻网格单元可以包含彼此之间彼此接近的点。

MNO的完整层次结构存储在单个文件中。节点存储在每个节点的一个文件中。节点文件以相应节点的标识符命名,该节点由从根节点到所讨论的节点的索引组成。根本身没有索引,因此使用字符r。例如,标识符r042代表节点root.children [0] .children [4] .children [2]。

Potree使用MNO结构的变体,其具有不同的子采样方法和层次结构的分区成更小的、可快速流化的块。为了避免与原始可修改的嵌套八叉树结构混淆,并且因为Potree不提供修改点云的功能,我们将其称为Potree的八叉树结构或简称为八叉树。

节点的分辨率由spacing属性定义,它指定了点之间的最小距离。首先根据边界框的大小为根节点计算间距,然后在每个级别减半。例如,1米的间距可以用于在每个方向上具有200米的范围的数据集。根节点将包含原始数据的低分辨率版本,其中每个点与下一个点相距至少1米。根节点的孩子将具有0.5米的间距,这有效地使分辨率加倍。

间距的不同值影响节点中的点数,存储所有点所需的节点数以及树的深度。较低的间隔导致每个节点中较多的点数、总体较少的节点数和较浅的树深度。间距的最佳值难以定义,并且取决于各种因素,例如CPU和GPU处理能力和连接速度。表3.1列出了间距的低值和高值之间的一些优点和缺点。

表3.1 间距大小的优点和缺点

总体节点较少,树深度较浅 总体节点较多,树深度较深
更精细的空间分割允许剔除更多的点
减少绘制调用和GPU状态更改
减少与每个文件下载相关的开销
由于较粗略的空间分区导致的低效剔除 更多绘图调用和GPU状态更改

我们为间距选择了一个boundingCubeWidth / 128值。它是将节点分割成具有1283个单元网格的同义词,其用于Scanopy的MNO结构,并且它在间隔大小的优点和缺点之间提供了合理的折衷。

与MNO一样,如果在构建期间将一定量的点添加到节点,则节点仅被拆分。 多分辨率八叉树中的任何叶节点是由于已经添加到该节点的点数量少而尚未进一步分裂的节点。它们用作剩余点的桶,并且因此不强制点之间的间隔。

除了间距,输入点的数量是影响八叉树的深度和输出中节点数量的另一个因素。AHN2点云的转换,包括640亿点,导致一个八叉树有13个级别和3800万个文件[33]。单独的八叉树层次需要190MB的磁盘空间,假设每个节点的层次结构编码为5个字节。客户端需要层次结构以确定哪些节点必须加载,哪些节点是可见的,但是发送数百兆字节将导致长的初始加载时间。为了减少初始加载时间,层次结构被分成包含hierarchyStepSize级别的多个较小的块。图3.2示出了已经被分成具有2个级别的块的多分辨率八叉树分层结构的示例。基本上,这产生另一个浅的八叉树,存储多分辨率八叉树的深层次结构。这个层次结构八叉树允许根据需要快速加载实际需要的层次结构。


图3.2:八叉树层次结构被分割为具有hierarchyStepSize的批次,在本示例中为2级,然后根据需要加载层次结构。

3.3.1泊松碟子采样

本节将详细介绍Potree中的泊松碟采样,它用于生成点之间具有最小距离的均匀间隔的子采样。每个节点存储具有特定分辨率的点子集。各种抽样方法,其中一些是在找到一个合适的过程中组成和测试,如图3.3所示。

图3.3:通过不同的抽样策略从输入集(a)中选择的大致相同数量的点。(b)随机子集。(c)点以随机顺序,选择先落入单元格的点。(d)选择最接近网格单元中心的点。(e)选择彼此间具有最小距离的点。(f)按Morton排序的点,选择每第n个点。(g)沿轴排序的点,选择先落入单元格的点。(h)沿轴排序的点,选择每第n个点。

可修改的嵌套八叉树结构使用基于网格的方法,其中三维网格被刻写到体积中,并且落入单元格中的第一点将被接受。如果点落在已经占用的单元格内,则将其丢弃。这种方法简单而快速,但是它具有不强制点之间的最小间隔的缺点。即使相邻单元内的点彼此接近,也可以选择相邻单元内的点。较高质量的抽样方法确保点之间有一定距离。例如,在Entwine [26]中使用的改进的基于网格的方法倾向于在单元格的中心的点,并且如果新的一个更靠近中心,它可以用新的交换已经接受的点。

对于本论文,我们选择使用泊松碟采样方法。在泊松碟样本中,每个点具有到所有其他点的最小距离。结果数据显示比网格采样集更看起来更美观的图案,并且它还提供具有少量点的优异覆盖。然而,在点之间实施严格的最小距离是计算成本昂贵的任务,并且需要更复杂的数据结构。

泊松碟样本可以通过被称为飞镖投掷的一类算法来创建。他们通过创建点创建泊松碟样本,然后检查到先前创建和接受的点的距离是否足够大。如果距离太小,点将被丢弃。 Cook [11]是第一个提出用于计算机图形的泊松碟样本的例子,并且给出了一个幼稚的投掷算法的例子,它的成本应该避免。原生的投掷检查从每个新点到所有以前接受的点的距离,这是不可行的,当处理百万点。改进的投掷算法在空白区域创建样本,并检查局部邻域[9]。许多飞镖投掷算法关注点样本如何以及在何处产生,以便提高性能。在对点云进行子采样时,我们已经有一组固定的样本,并且只关心丢弃彼此太靠近的点。

为了减少点之间的距离检查量,我们将每个节点划分为网格,并且仅计算到相同和相邻单元内的点的距离。

样本网格实现为稀疏数组,因为点云通常描绘表面而不是体积。因此,只有一小部分单元格实际上被填充,使稀疏阵列显著更多的记忆友好的选择。C ++标准库提供了一个哈希映射的实现,称为std :: unordered_map,用作三维稀疏数组。 unordered_map是一个通过设计的1维集合,但它可以通过将3个整数分量编码为单个64位整数键来用作三维稀疏数组。

每个单元存储接受的点以及对相邻单元的引用,以便快速迭代通过邻居中的点,而不需要相对昂贵的散列图访问。如果到该单元内的所有点以及相邻单元中的所有点的最小距离大于间隔,则单元接受新点。当新添加的点第一次落入其中时,创建单元实例。在单元创建期间,检查相邻空间是否已经存在邻居。如果邻居存在,则将其添加到邻居的新小区列表,并且新创建的小区也将被添加到邻居列表。

单元的大小可以是节点本身的间距和大小之间的任何值。只有等于或大于间隔的单元尺寸确保与距离检查相关的点被存储在相同或相邻的单元中。最初,为单元尺寸选择间距本身以将距离检查的量保持尽可能低。Yin Fei发现这导致不必要的高内存使用和低性能,并建议使用更大的单元格大小。增加网格单元的大小减少了单元的数目,并且减少了存储器使用以及管理许多单元实例的处理开销。

图3.4显示了不同网格尺寸的影响。每当添加点时,计算到相同单元及其相邻单元内的点的距离。通过最小距离检查的点将添加到网格中。然后对已经通过测试的点对随后的点进行距离检查。只有被占用的单元格(红色)被初始化并存储在稀疏结构中。每个单元保持接受点的列表和被占用的邻居的列表。
图3.4:稀疏距离检查网格,必须对相同单元内的点和相邻单元内的点进行距离检查。(a)较少的距离检查,内存占用和处理开销较大。(b)更多的距离检查,但记忆友好。实际实现中的间隔和单元尺寸低于所描绘的。

构建过程采用一个或多个点云作为输入,将点分割成八叉树,并将结果存储在文件系统上,每个节点有一个文件。

转换过程遵循以下规则:

1.八叉树由单个根节点组成,其在这一点上也用作叶。

2.将点逐个添加到根节点。

3.如果没有其他点在最小距离(间距)内,则内部节点保留点,否则将其传递给其子节点。

4.每个级别的间距减半。

5.叶节点首先保持所有点。

6.如果达到点的某个阈值,则扩展叶节点。它成为一个内部节点,并将所有存储的点添加到自身,但这次遵循内部节点规则。具有某一最小距离的点保留在前叶节点中,并且所有其它点被向下传递到其新创建的子节点。

7.将数据定期刷新到磁盘,例如每次处理1000万个点。

8.如果自上次刷新以来尚未触及节点,则其数据将在下一次刷新期间从存储器中移除。

9.如果一个点即将添加到已从内存中删除的节点,数据将首先从磁盘读回到内存。

规则3和4导致具有较低级别的低分辨率和较高级别的渐高分辨率的子样本。低级节点保持彼此具有大距离的点。该距离随每个级别减半,从而提高分辨率。

规则5和6允许根据需要扩展八叉树分层结构。层次结构首先较浅,并且随着添加新点而增加深度。内部节点内的点有一定的间距。另一方面,叶节点是其中存储所有剩余点的桶。

规则7允许用户在每次刷新后查看Potree中的转换的当前状态,而无需等待转换完成。由于浏览器倾向于缓存文件,因此可能需要禁用缓存或刷新页面,而不是简单地访问URL。否则,可以示出来自先前刷新的旧数据。

规则8和9通过删除一段时间没有使用的数据来确保内存使用率保持较低。如果随后的点具有特定的局部性,即它们彼此相对接近并因此落入相同的八叉树节点,则这是最理想的情况。它增加了高级节点仅在一个或几个刷新周期中被完全处理的机会,并且不需要在大多数时间在存储器中。将整个数据集存储在多个图块中是确保一定量的局部性并且因此减少存储器使用并且通过减少节点必须被读回到存储器的次数来提高性能的有效方式。Scheiblauer [54]和Leimer [28]已经表明,如果点云提前分类,可以减少建立时间。最好的情况是Morton有序数据集,其中落入同一节点的所有点彼此相邻存储。因此,节点被完全处理,一旦卸载,将不必再次触摸。另一方面,如果随后的点相对均匀地分布在整个体积上,则转换器必须将所有或大多数数据保存在存储器中或更频繁地读回。

虽然此实现在每个节点中创建泊松碟采样子集,但是对于节点的组合不会这样做。在渲染期间,多个节点被组合,但是没有为相邻或相交节点实施泊松碟属性。对于相邻节点,这可以导致在它们的边界附近的点的明显更高的密度。相邻节点问题可以通过对这些节点中的点进行距离检查来解决。然而,这是非常昂贵的。一种避免在边界处增加点密度的廉价启发法是,丢弃边界附近一定距离内的所有点并立即将它们传递到下一级。

虽然当前的采样算法产生泊松碟集,但是覆盖可能不是最优的。点的处理顺序影响结果,不利的情况会导致明显的条纹和洞。图3.5显示了一个优化和一个严重抽样的点集。初始测试表明,随机化点的输入顺序有助于解决这个问题。

图3.5:(a)输入点以最优顺序处理,结果有很好的覆盖。(b)投入以不利的顺序处理,采样点之间的间隙在没有违反最小距离约束的情况下不再有任何点的位置。(c)已经以不利的点顺序处理的点云的真实世界示例

3.4八叉树遍历和可见节点确定

八叉树结构允许通过在接近相机的更高细节水平处的视锥体剔除和渲染来高效地渲染大数据集,如图3.6所示。视锥截球跳过可见区域外的节点。具有不同级别的八叉树节点重叠并且联合渲染以增加细节水平。区域中的细节级别等于其中的最高级节点的级别。细节约束水平确保更靠近相机的节点优先于远处的节点。点预算限制在任何给定时间加载和渲染的点数,这有助于使性能要求适应不同硬件的能力。

图3.6:(a)视锥体和LOD外的截锥体剔除节点,有利于靠近观察者的高分辨率节点。(b)以颜色编码的LOD

应该渲染的节点在八叉树遍历步骤中确定。遍历以屏幕投影大小的顺序完成。屏幕上最大的节点首先被访问,然后是第二大节点,依此类推。投影尺寸是作为视场、到节点中心的距离、节点的边界球半径和屏幕的高度的函数获得的。图3.7和公式3.1显示了视场如何与视锥体的斜率有关。方程3.2给出了节点的投影尺寸,其与斜率和距离成反比。节点的半径和屏幕的高度用于将结果缩放到节点的像素大小。此时,Potree只考虑以遍历顺序的屏幕投影大小。Scanopy渲染器还考虑了节点到屏幕中心的距离,这导致在最重要的中心处的较大量的细节。

在遍历期间,Potree保留可见节点的列表,可见但尚未加载的节点的列表,以及所有可见节点中的点的总和。如果节点的边界框与视图平截头相交,则该节点被认为是可见的。如果不是这种情况,则该节点将被丢弃,并且其子节点将不会被进一步遍历。遍历继续,直到没有更多的节点访问,或者直到满足两个条件之一。最重要的条件,通常是限制因素,是可见点的总和保持低于阈值点预算。点预算允许用户减少渲染点的数量以获得更好的性能,或者增加渲染点以获得更好的质量。第二个条件是被访问节点必须具有最小屏幕投影大小。当点云远离时,该条件减少不必要的工作,在这种情况下,渲染多个点远低于点预算将是足够的。

遍历之后,可见但未加载的节点列表中的节点被调度加载。为了避免一次加载太多的节点,并且还避免加载在几帧时间内不再可见的节点,只有列表中的前X节点被调度加载。由于遍历顺序,列表中的前个X节点是具有最大屏幕投影大小的节点,因此是最重要的节点。X = 5的值在实践中证明工作良好。

遍历的一个重要考虑是根据需要加载八叉树层次结构。因此,遍历认为节点首先可见但稍后不可见。如果卸载的层次结构的节点具有比已有可用节点更高的重要性,则会发生这种情况。一旦层次结构的这一部分被加载,它将占据点预算的一部分,该部分将不再可用于先前可见的节点。

可见节点的渲染由three.js处理。可见节点被标记为具有一个标志,然后three.js渲染器将执行其自己的遍历,为所有标记为可见的节点调用绘制调用。

本章介绍了在Potree中实现的点云的各种渲染技术,它描述了如何对点云数据可视化和用不同的方法来照亮和绘制点。

点云可以使用点属性来着色,包括但不限于RGB。除了RGB之外的属性必须在运行时映射到RGB颜色。除了坐标之外,点属性还存储在点云中,或者在仰角的情况下,作为坐标轴之一。细节层次是不在磁盘存储、运行时计算的唯一坐标。

根据用于捕获数据的扫描设备以及用于增强数据的后处理算法,不同种类的属性存储在点云中。激光扫描器通常至少提供强度,而摄影测量通常提供至少RGB数据。某些属性(如分类)需要在捕获数据后进行后处理步骤。

以下段落描述了Potree支持的属性。

RGB通常描述观察到的现实世界的点的颜色。RGB颜色由摄影测量软件自动捕获,因为它们是输入图像的一部分。它们不是激光扫描的固有属性,但是另外捕获的照片可以用于将色彩投影到点上。然而,该属性还可以用于存储映射到RGB的任何其他类型的信息。例如,一些软件包可以计算环境遮挡并将其存储在RGB通道中。高度和强度也经常存储在RGB中以提供用于否则未着色的点云的颜色。

强度表示激光扫描中反向散射信号的强度或导出的表面反射率。强度受诸如扫描仪和表面之间的距离、大气条件、扫描仪类型和表面反射率等各种条件的影响[69]。由于这一点,合并多个空中激光扫描通常会导致不均匀的结果,对于相同类型的表面,强度有显著的差异。

高程或高度不需要额外的空间,因为它已经是欧几里德坐标的一部分。借助颜色渐变将高程值映射到颜色。梯度通过高程值及其相应颜色的有序列表来定义。中间值被内插,外部值被钳位。彩色渐变允许用户快速识别高峰和低谷,例如山脉和山谷或建筑物和地形之间。

分类是从其他点属性或相关资源(如地理参考图像)派生的。它指示点是否是地面、植被、建筑物或其他类的一部分。在最基本的方法中,最底点可以被分类为地。在森林地区,地上的任何东西都可以归类为植被。点的类被存储为单个数字。每个数字然后映射到一种颜色。查找表用于从类映射到颜色。

回波数指定从单个光束捕获点的顺序。某些材料,如树上的树叶,反射或吸收激光束的一部分,让另一部分通过。该剩余能量可以击中另一物体并且也被反射。一些激光扫描器能够捕获不仅第一次而且后续的击中。树木特别容易产生多次点击。首先命中由树的最顶层生成,并且最后命中通常由地面、树干或者在树冠下的任何结构生成。

点源表示点源自哪个文件或源。在机载激光扫描的情况下,点源通常指示飞行线。

细节级别(LOD)在渲染期间即时计算。它等于区域中最详细的可见节点的级别。LOD是0和可见层次结构的深度之间的整数值,然后通过梯度查找将其映射到颜色。

由于顶点之间缺少连接性,点通常呈现为单个像素或屏幕对齐的正方形或圆形。这些原语是快速渲染的,它们由图形库本身支持或轻易实现。然而,与高质量融合和插值技术相比,视觉质量较低。以下部分提供了不同点拼接技术的优点和缺点的描述。


图4.2:点在WebGL中呈现为正方形,通过丢弃片段获得圆圈。 (a)gl_PointCoord存储原点在左上角的正方形的归一化坐标。(b)坐标映射到距离正方形中心的距离。(c)丢弃具有大于1的距离的片段。

正方形由具有gl.POINTS原语的WebGL原生支持。顶点着色器成员gl_PointSize定义了以像素为单位的正方形的大小。圆圈本身不受支持。相反,通过渲染方块来显示圆圈,并丢弃落在圆圈边界外的所有片段,如图4.2和代码4.1所示。

代码4.1 通过丢弃渲染的方形的一些片段来渲染WebGL中的圆
这种渲染模式的一个共同特征是使得点云渲染具有嘈杂外观的混叠伪像, 这在具有高频颜色信息的点云中和在运动期间尤其明显。

Botsch等人[7]提出了一种高效、GPU友好的算法,通过将点混合在一起提高质量,而不是只取最近的一个。这种方法的想法是在一定范围内的所有点被认为是表面补丁的一部分,因此应该有助于结果。此方法减少遮挡,在点之间创建平滑过渡,并减少在点云渲染中常见的混叠伪像。

该方法包括深度、属性和归一化通道。它的初衷是面向拼图而开发的,但由于很少的点云数据集包含必要的正常信息,甚至更少的额外需要的椭球半径,我们实现时使用屏幕对齐的圆圈,如Scheiblauer等人提出的[55]。

图4.3:一个点被另一个点遮挡,具有相同或相似深度的点应该混合在一起
深度通道将最近片段的线性深度值写入帧缓冲区。

属性通道产生一个加权的属性值之和(RGB、法线、…)与一个权重之和。由于结果的高精度要求而使用浮点纹理,并且将混合模式设置为加法以获得相应的和。

在第一步中,属性通过将片段的深度与深度缓冲器内的深度进行比较,在一定范围内的所有片段通过该测试并有助于结果,更远的片段将被丢弃。在下一步中,将权重分配给通过深度测试的片段。该权重取决于从片段到对应点原语的中心的距离。越靠近中心,重量越高。在最后一步中,片段值乘以权重并存储在rgb通道中。权重本身存储在Alpha通道中。由于添加混合,此通道的结果是颜色通道中加权的属性值之和与Alpha通道中的权重之和,如图4.4所示。

图4.4:属性通道生成加权的属性值之和与权重之和 归一化通道将加权的属性值除以权重的总和,这将属性值从任意范围返回到0到1的范围。

转换的平滑度取决于在属性通道中使用的权重函数。Botsch和Scheiblauer建议了一个高斯权重函数,其中心具有峰值,随着到中心的距离增加,光滑的衰减。对于Potree,我们还试验了其他权重函数,我们选择了公式4.1中所示的函数。这个权重函数的行为类似,它在中心有一个峰值和一个平滑的衰减,但是在一个距离处接近零。该属性导致在两个点的交点的边界附近的平滑过渡。另一方面,高斯函数在距离为1处不接近零,这导致两个点相交的权重之和的突然跳跃,如图4.5所示。然而,也可以偏移高斯权重,使得其在距离1处接近零。在实践中,我们使用的高斯权重和权重函数的结果几乎不可区分,所有这些都可能存在我们此时没有探索的信号处理相关差异。

图4.5:(a)高斯权重函数在两点相遇的权重(绿色)之和上显示出断开。(b)抛物线函数从边缘处的零开始,从而避免权重之和的断开。

图4.6:高斯和抛物线权重的差异。权重总和中的跳跃仅在交叉点的边界处显著。

公式4.1中的权重函数定义为在点的中心为0,在边界为1的标准化距离。硬度因子允许调节过渡的平滑度。图4.7显示了权重函数和最终的归一化结果如何受硬度影响。

点混合在一起的范围由混合深度指定。图4.9显示了不同值的结果。当值为零时,只有最接近观察者的片段和具有完全相同的深度值的片段将被混合在一起。当使用值10时,最接近的10个单位的所有片段也将混合。小值有助于创建平滑混合的曲面,而较大的值允许用户查看对象。

图4.7:不同数值的硬度的影响。顶行:重量功能; 底行:归一化后的图像。硬度因子影响点之间的过渡的平滑度。高值产生类似于Voronoi图的结果。

图4.8:圆(a)和硬度2(b)和50(c)的高质量焊片的比较。海底设备点云由Weiss AG [73] 提供 使用恒定的混合深度并不总是有用的,特别是在分层渲染系统中。如果查看者缩小,则会删除详细的节点。剩下的是彼此间距离很大的点,它们不会与低的和固定的混合深度混合在一起。在我们的实现中,一个点的世界空间半径加上一个可选的偏移因此被用作混合深度。通过将点从屏幕空间投射回世界空间来获得世界空间半径。结果,点自动地以任意距离和物体尺度混合在一起,而不用透过表面。如果需要透视,用户可以手动定义附加偏移。

插值模式是为Potree开发的,以在单个通道中创建高质量点云渲染[57]。这通过将点渲染为抛物面而不是平面、屏幕对齐的矩形或圆形来实现,如图4.10所示。结果是类似于Voronoi图的点的最近似邻近内插。

图4.9:大混合深度值允许透视表面,表面和边缘的交叉点云[64]

图4.10:为片段添加深度偏移将平面屏幕对齐的正方形转换为抛物面。渲染点作为抛物体减少了不期望的遮挡,并导致最近似的内插。图取自[57]。

其他形状如锥体和球体也可用于提高质量,但是抛物体具有几个优点。球体只能与圆形形状一起使用,而锥体和抛物面也与矩形形状一起使用。抛物面的权重函数也是三者中最简单的。然而,最重要的优点是重叠抛物面具有直的交叉点,而在不同深度的圆锥和球体将产生弯曲边缘。在许多情况下,直边缘可以说是更愉快和更少刺激。

该方法通过修改片段着色器内屏幕对齐方块的深度值来实现。需要执行以下步骤。首先,通过将顶点着色器的屏幕空间像素大小投射回世界空间中,来计算点的世界空间半径。在下一步中,片段着色器从半径和给定的权重函数计算片段的深度偏移。最后,修改的depth-value被写入gl_FragDepth输出变量。

图4.11:使用相应形状渲染点时,由不同权重函数产生的形状和可能的结果。从[57]摘取和修改的图。

插值模式提供了方块、圆的性能与高质量融合之间的折衷。它减少重叠,并提高高频细节(如文本、线条和图案)的可读性。它还避免了当遮挡点从一帧到下一帧突然变成遮挡点时出现的弹出伪像。然而,它不处理噪声和混叠。两者都像使用正方形和圆形渲染模式一样,具有最近似相似内插。

确定点大小是速度和视觉质量的重要因素。低点尺寸提高了性能并减少了点之间的遮挡,但它也导致渲染图像中的孔。较大的点尺寸减小点之间的孔,但是它也降低性能并增加遮挡伪像。以下部分描述了用于点尺寸确定的3种不同算法。

固定的屏幕空间点大小意味着相同的像素大小用于所有点。这种模式在许多情况下实现和完全使用是微不足道的。这种模式的主要缺点是:当用户缩小时,它很容易在近距离出现孔洞和冗余绘制。

不是指定像素大小,而是在此模式下将大小定义为世界空间半径,这导致在近距离处的更大尺寸和对于远距离的减小的尺寸。

图4.13显示了视场如何与视锥体的斜率有关。


等式4.3示出了如何使用视锥体的斜率的倒数来从世界空间半径投影到图像空间像素半径。

自适应点大小模式是为Potree开发的,用于将点大小调整到细节级别,它隐藏了在不同细节级别之间的点密度的明显差异。

类似的点尺寸模式在Scanopy中以“加权点尺寸”或“点尺寸启发式”的名称可用[54]。目标是相同的,即:避免不同细节水平之间的点密度的显著差异,并且实现点云的或多或少的封闭表面表示。这可以通过使点大小等于点之间的距离来实现,这被假定为对应于Potree中的间距和在Scanopy中的内接网格中的单元格的大小。

将点大小设置为等于间距的问题是在本工作中使用的分层结构中,更高细节的节点与所有它们的祖先(包括根节点)联合呈现,这意味着来自更高细节节点的点将被混合来自较低细节节点的点。对于叶节点,点大小可以增加到点之间的间距,以便关闭孔。然而,较低细节节点中的点不能被放大超过其最深的孩子的间距,而不遮挡该节点的点,如图4.15所示。
图4.14:(a)固定像素或世界空间大小导致不同细节层次之间密度的明显差异。 (b)颜色编码的细节水平。(c)点尺寸已经调整到细节水平以减少孔而没有过度的过度拉伸。(d)两个不同级别的细节符合固定点尺寸的特写。(e)对于自适应点尺寸,较低细节层中的点被放大,但是较高细节层中的点保持较小,以避免过度的过度绘制和遮挡。Whitby点云由GeoM提供[18]

Scanopy的点尺寸启发法以避免过度遮挡同时仍然获得闭合表面的方式调整节点中的点的大小。它考虑节点的后代的深度和估计的点密度,并且仔细地调整内部节点的点大小以尽可能少的遮挡和过度绘制来关闭洞。

图4.15:在节点方面调整点大小的难度。(a)等级。(b)以相同尺寸呈现的所有点。(c)节点r2是一个叶子,所以它的点可以放大而不遮挡更高的细节。(d)r1中的点不能在没有更详细地遮挡节点的情况下扩大。(e)根部中的点不能在没有遮挡更高水平的细节的情况下扩大。

Potree的自适应点大小模式通过逐点调整点大小而不是逐节点来解决这个问题。这个想法是,点的大小被调整到在特定细节水平的点之间的间距。计算点的细节水平是问题,因为单个节点中的点可能是不同细节水平的一部分。特定区域中的细节等级等于其中的最高级别可见节点。因此,通过将八叉树从点的节点遍历到包含该点的最深可见节点来获得。在本上下文中,可见性包括将被渲染的所有节点,即,通过可见性确定步骤并且其点被加载的节点。

方程4.4返回点的世界空间大小,给定根节点内的点的间隔和细节的水平。分辨率有效地与每个级别加倍,因此,点大小减半。最终像素大小通过应用从世界空间半径到像素大小的投影来获得,如上一节所述。
计算每个点的细节水平的八叉树遍历在GPU上完成。层次结构的可见部分被传递到着色器,然后着色器从当前处理点的方向的根遍历八叉树,直到它到达包含该点的最深节点。此时,为了简单起见,遍历总是从根开始,但它应该足以从点所在的节点开始。我们将在未来作为性能改进的一部分探讨这一点。当到达包含点的最深可见节点时,遍历停止。遍历的节点数为LOD。理论上,遍历对于叶节点不是必需的,因为叶中所有点的LOD是叶本身的级别。Potree在这个时候没有出现异常,但是我们将来会探索这个选项,作为性能改进的另一部分。
(e)以广度优先顺序将层次编码为纹理。中间行表示RGB纹理值。指示哪些子节点存在的子代bitet存储在红色通道中。绿色通道包含对纹理中节点的第一个子节点的偏移量。蓝色通道未使用并用零填充。底行显示存储在红色通道中的子代bitet的二进制表示。
图4.16:计算点的LOD。(a)等级,(b + c + d)从根到r3,最后到r30。(e)层次结构,编码为RGB纹理。

为了将可见层次传递到顶点着色器,它以宽度优先顺序存储在1维RGB纹理中。红色值的8位表示8个孩子中的哪一个是可见的。绿色通道包含与节点的第一个子节点的相对偏移量。这两个属性和八叉树大小,足以从顶部到底部遍历八叉树。蓝色通道是一个空白填充,以将数据对齐到RGB纹理布局。

图4.16显示了层次结构,其编码以及如何为特定点获取LOD的示例。以下示例计算可能源自节点r,r3,r30的点的LOD,其最终并不重要。重要的是其位置的层次结构的深度。在第一步中,我们找出这个点落在哪个根的孩子中并计算它的索引,在这种情况下,我们然后检查孩子bitet的位在索引3,看看是否有一个子节点在这个位置。该位设置为1,因此有一个子节点并且遍历继续。接下来,我们需要将纹理跳转到r3,这是根节点的第二个子节点。到第一个孩子的偏移量已经存储在绿色通道中。到索引的1位数(下划线为绿色)代表我们必须跳过的孩子的数量,以获得我们感兴趣的孩子。对于r3重复相同的过程,以发现我们必须跳转到r30。到r3的第一个孩子的偏移量是3,并且由于r30已经是r3的第一个孩子,因此不需要跳过额外的子节点。现在在r30,点落入的下一个子节点是r302。但是,索引2处的位为0,这意味着r302不存在或不可见。遍历在r30停止,这是在八叉树水平2.因此这一点的LOD是2。

每个遍历的级别需要一次纹理查找,计算一个字节中已经设置了多少位,以及是否设置了某个位。纹理查找和位计数在顶点着色器上增加了额外的开销,但它也减少了填充孔所需的顶点和片段的数量。

图4.17:LIDAR扫描通常在一个方向具有高扫描密度,在另一个方向具有较低密度。叶节点的级别不足以推断出有意义的点大小。除此之外,这也是试图关闭两个方向上的间隙引起沿着更密集方向的重叠的情况。在较低分辨率节点中,在两个方向上的密度变得均匀,因为它们具有低于两个方向上的原始密度的子采样密度。

图4.18:具有均匀密度但不同八叉树深度的点云

作为最后一点,自适应点尺寸不会创建真正封闭的表面,因为它仅涉及将点尺寸调整到细节水平的间距,而不是调整点之间的真实间距。这导致叶节点的两个问题。第一个问题是点密度低于某个八叉树级别的预期密度的叶节点。在这种情况下,选择叶节点级别的间距作为点大小将不足以覆盖空洞。图4.17显示了叶节点中的密度低于预期的情况,即使只有一个方向。另一个问题是具有比在某个八叉树级别预期密度更高的叶节点。如果点云的密集部分落入节点的小部分,则会发生这种情况。节点不分裂,因为相对少量的点被添加到它。在该区域中,八叉树的深度保持较低,这促使自适应点尺寸算法增加其中的点的尺寸,即使由于其高密度,点应当以低点尺寸被渲染。图4.18显示了具有均匀密度但不同八叉树深度的点云的示例。绿色点的密度与橙色点的密度相同,但因为八叉树没有进一步分裂,所以错误地假定它的细节水平较低。

照明模型用于增强场景的深度感知并使结果看起来更愉快。没有由照明提供的阴影,变得难以甚至不可能感知形状。具有来自照片或烘烤环境遮挡的颜色的点云模型已经具有一种形式的静态照明。

大量的点云不包含表面法线,这对于诸如Phong或Blinn的照明模型是必要的。广泛使用的点云格式,如LAS,甚至没有指定的正常属性。

图4.19:Eye-Dome照明工作流程。首先,渲染颜色和深度;然后从深度图计算阴影,并最终用颜色值组合以获得阴影图像。 图像取自大量数据的科学可视化:对于一个有洞察力的方法 [8]。

眼球照明(EDL)是一种沿着剪影创建照明表面和轮廓的方法,而不需要法线[8]。该算法在概念上类似于深度图上的边缘检测滤波器。与周围值的高差异导致高反应。指向相机的表面在深度上具有相对较小的差异,并导致低响应。最大的反应是沿着silhouttes经历的,这是黑色轮廓的原因。图4.20显示了一个渲染的例子,其中EDL帮助感知对象。 EDL工作流的概述如图4.19所示。

Potree使用EDL的变化与对数深度。通过计算深度与周围样本的差异来获得响应,如等式4.5所示。此方程式将阳性深度差值相加,并对结果进行归一化,使其与样品数量无关。基数2的对数导致阴影与对象的比例无关。靠近相机的小对象将以与两倍大小的对象相同的方式被加阴影。

理论上,邻域样本的数量可以增加以实现更高的质量,但是我们已经对具有四个样本的结果和保持样本量低的性能好处感到满意。默认情况下,通过评估左侧、右侧、顶部和底部邻居的深度值来对4连接的邻域进行采样。另外,提供半径参数,其允许用户将样本放置在距离当前像素更远的位置,例如2个像素或3个像素,这样做会增加轮廓的厚度。

方程4.6将响应变换为阴影因子。将颜色值乘以阴影因子得到最终的EDL阴影结果。因子300是用于合适的基底阴影强度的经验确定的值。edlStrength变量允许用户进一步修改阴影的强度。值为零会导致无阴影,即原始颜色值保持不变。随着edlStrength的增加,阴影将变得更强,导致更暗的输出图像。
图4.21显示了通过将不同强度的EDL应用于没有颜色和法线的点云所获得的结果。

  • 已删除标准双曲线深度缓冲区的线性化。代替双曲线深度缓冲器值,将基底2的对数值渲染到浮点纹理的阿尔法分量,然后从其中读取。这主要是因为Potree没有访问WebGL的深度缓冲区,但使用自定义对数深度缓冲区也有一些优势。我们直接将非归一化的log2(深度)渲染到纹理中,这完全独立于近和远剪裁平面。使用双曲线深度缓冲器,需要线性化来解决这种依赖性。否则,阴影会受到剪切平面的影响。对数值还具有更加有利的近距离和远距离物体之间的精度分布,这使得Potree中的EDL不太容易由于突然的深度跳跃而产生楼梯伪影。
  • CloudCompare的EDL着色器支持光方向向量。在Potree中,物体总是从前面照亮。
  • CloudCompare计算完整,一半和四分之一解析度的阴影,然后合并结果。 Potree使用单一的全分辨率通道,因为它已经产生令人满意的结果。



本章介绍了Potree查看器的实现细节和功能。

WebGL [72]是用于web浏览器的OpenGL的变体,其旨在向各种设备(包括台式PC、笔记本、移动电话和平板电脑)上的网页提供GPU再现能力。因此,它是基于最低的公分母OpenGL ES 2.0,以确保WebGL应用程序将尽可能多的设备上运行。WebGL Extensions [71]公开了ES 2.0和WebGL的基本规范中没有包括的其他功能。但是,它们不能保证在所有符合WebGL的设备或浏览器上工作。

Potree中的一些功能,如高质量Splatting和点插值,使用WebGL扩展,如浮点纹理或修改片段着色器中的深度值。在安装过程中,Potree会检查相应的扩展是否可用,如果不是,则会禁用这些功能。因此,高质量Splatting、点插值和Eye-Dome照明通常不能在移动设备上使用。 Potree使用three.js [65]渲染库来处理场景图形和绘制调用。直接使用WebGL API和GLSL仅限于three.js不提供某些必要功能的特殊情况。这包括基于GPU的点拾取和用于Eye-Dome照明和基于点的渲染的着色器。

WebGL的一个限制是它不提供位操作,这是自适应点大小模式所需要的。必要的位操作,即计数到某个索引的位和检查是否已经设置了某个位,在自定义函数numberOfOnes 5.1和isBitSet 5.2中实现。位操作的这些算术实现远慢于GLSL的较新版本中的本地可用的位操作。在这个着色器的OpenGL 4.5实现中,它们已经显示出比这种方法所需的纹理像素提取更大的瓶颈。

渲染的主要要求是始终保持应用程序响应。任务不应该阻塞控制流并留下足够的周期来维持稳定的帧速率。

任何Javascript代码(Web Workers除外)都在一个线程中执行。Javascript应用程序不维护自定义主循环。相反,当满足某些条件(例如超时,新帧的开始或用户输入)时,它们提供由浏览器调用的回调。在执行回调之间,浏览器将处理页面和渲染元素的更新。回调应该快速返回,否则会阻止浏览器更新页面,从而有效地冻结它。

Javascript提供异步函数来调度稍后调用的回调,或者并行执行特定任务,而不是代码。例如,流行的setTimeout函数在设定的时间量过去之后执行回调。由于Javascript的单线程性质,回调将一个接一个地运行,而不是同时运行。 XMLHttpRequest函数的异步版本告诉浏览器加载资源并在进度或加载完成后调用回调。资源加载本身是并行完成的,并且XMLHttpRequest的多个调用可能导致同时加载多个资源,但是与setTimeout一样,回调的执行是一个接一个地执行的。

异步回调哲学也适用于Javascript中的渲染循环,如清单5.3所示。 requestAnimationFrame函数接受由浏览器自行决定调用的回调。为了保持循环运行,回调调用另一个对其自身的requestAnimationFrame调用,它将在下一帧期间执行。浏览器根据几个条件决定何时调用回调。如果选项卡处于活动状态,通常会尝试保持每秒60帧或更少(如果不可能)。如果某个选项卡在后台被隐藏或运行,浏览器可能不会调用回调以减少CPU使用率,并延长移动设备的电池寿命。

代码5.3:一个基本的渲染循环。Javascript应用程序重复地向浏览器发送请求,以在下一次重绘之前调用回调,而不是保持无休止的循环。
Workers是通常单线程环境的例外,并且运行与主线程并行的Javascript代码。然而,他们有相当严格的限制。由Worker执行的代码在其自己的执行环境中运行,并且无法访问主线程的元素,不可能直接更改html页面或访问主线程的任何对象。相反,Worker通过消息与主线程通信。主线程向Worker发送消息,通常具有要处理的工作负载,并且Worker将使用另一消息(通常是任务的结果或有关进度的信息)进行回复。消息由回调处理,如通常一样,回调将与其他挂起的回调顺序执行。

异步函数和WebWorkers之间的区别是异步函数可以做并行的特定事情,例如加载文件,但是提供给函数的任何Javascript代码将在主线程中执行。另一方面,Web Workers则并行执行Javascript代码。

Potree使用异步函数从远程位置加载文件,WebWorkers用于在并行线程中解析和准备加载的数据,如图5.1所示。

图5.1:Potree中的时间线。黑色矩形:在主线程内运行的任务和回调,包括键和鼠标事件。每个框架中最大的任务是更新和渲染回调。蓝色:由浏览器并行加载资源。红色:Web Worker并行执行Javscript代码。(1)开始使用XMLHttpRequest加载节点的数据。(2)数据已加载,完成回调被安排在主线程内运行。(3)完成回调在主线程内执行,它产生一个Web Worker,准备在并行线程中加载的数据。(4)Web Worker完成,并且结果将由主线程中的回调处理,它将加载的数据发送到three.js,该节点现在可以渲染。

通过各种导航和交互操作(例如缩放到点或创建测量)需要点拾取。鼠标点交点可以在CPU或GPU上计算。两个选项都进行了评估,并在以下部分进行描述。

CPU方法迭代通过鼠标相交的节点内的所有点。对于相交测试,点被视为具有一定半径的圆盘。这种方法的优点是其实现需要较少的复杂性,它不需要潜在的慢速GPU停止操作,并且它可以以异步方式实现,尽管我们没有探究后者。缺点是,它需要额外的努力来解决投影像素大小和点的可见性,如顶点和片段着色器计算。

这种方法通过在GPU上绘制鼠标周围的区域并在CPU上评估结果来进行点选择。将渲染由鼠标相交的所有节点,而不是颜色,点索引被写入输出。从GPU获取鼠标周围的小窗口以提取最接近鼠标的点的索引。

为每个渲染点分配唯一索引。它由其节点内的点的序列号和节点本身的序列号组成。点的序列号为3字节,节点序列号为1字节。由于这些大小限制,点选择工作用于节点,每个具有高达大约1600万个点,并且一次最多可以达到255个节点。节点序列号从1开始,因此索引值0可以安全地用于空白区域。这些限制不在Potree中实施,因为两者都不可能达到。八叉树生成创建远小于1600万点的节点,并且没有被鼠标相交的所有节点的剔除显著地减少了在拣选期间将被渲染的节点的数量。后一种情况可能发生在罕见的情况下,可以通过忽略具有较大体积的节点来避免。由于WebGL中缺少gl_VertexID,点序列号存储在一个额外的顶点属性数组中。节点序列号作为统一值传递。片段着色器将前者写入RGB通道,后者写入Alpha通道。

在点被渲染到帧缓冲器之后,使用readPixels()将围绕鼠标指针位置的小窗口(例如17×17像素)读回CPU。读取单个像素是不够的,因为在点之间可能存在空洞,在这种情况下,选取功能应该捕捉到窗口内的最近点。零值表示空区域。最接近中心的大于零的值是最靠近鼠标指针位置的点的索引。然后将该索引分成节点和点序列号,用于检索实际点属性,最重要的是它的坐标。

这种方法的主要优点是它基于用户看到的相同的点尺寸和遮挡进行点选择。缺点是使用readPixels()需要CPU等待,直到GPU完成渲染,这可能会导致显著的性能下降。为了降低性能损失,仅渲染由鼠标指针相交的那些节点。在实践中,这种方法仍然比我们探索的CPU方法执行得更快,即使readPixels同步CPU和GPU。

图5.2:拾取渲染通道的输出。点云在鼠标指针附近更密集,因为不与鼠标相交的节点不被渲染。补丁是明显的,因为存储在RGB通道中的点序列号在每个节点中从零开始。

不同的任务需要不同的工具。导航也是如此;没有单一导航模式适合在所有情况下。

OrbitControls(轨道控制)是一组控件,让用户绕着目标或枢轴运行,类似于卫星轨道地球。与跟踪球控制的区别在于对象保持直立,即,轨道控制感觉像在对象上下移动或在对象上方移动而不触摸对象,而轨迹球控制器感觉像以任何可能的方式旋转对象本身。

可以使用鼠标滚轮更改到枢轴的距离。变化量随着到目标的距离而增加,因此使其独立于对象标度。它可以用于行星大小的对象以及小雕像。双击任何点将会将相机变焦到该点,并将目标更改为点位置。在按住鼠标右键的同时拖动将平移屏幕,本质上,转换相机以及目标完全相同的值。

OrbitControl是直观的,易于使用,但功能强大的同时,这是他们被选择为默认模式在Potree的原因。

FirstPersonControls或FlightControls为用户提供了一种飞行或穿行类的体验。这对于在封闭空间或广阔景观中导航非常有用。平移(鼠标右键)和点击放大工作与OrbitControls完全相同。拖动鼠标左键可旋转相机,并允许用户查看所有方向。W,A,S,D或箭头键可将相机向前,向左,向后或向右移动。

EarthControl提供与Google地球中的导航模式类似的导航模式[21]。鼠标左键允许用户使用目标点的高度沿着地平面拖放对象。通过拖动鼠标右键,用户围绕所点击的位置旋转。最后,滚轮可用于向目标位置缩放。这种模式旨在快速,准确地导航广阔的、开放的风景。

剪辑框允许用户通过在框内突出显示点或通过在框外剪裁点来关注特定的感兴趣区域,如图5.3所示。它们可用于剔除否则会分散或闭塞的点。

图5.3:使用剪贴框来聚焦在单个对象上,Retz点云由Riegl提供[50]
夹盒的流行用例是建筑物的内部。没有剪切区域,用户将必须在房间内导航以便能够感知数据。剪辑框允许用户从建筑物的墙壁,天花板或整个部分上剔除,并从外部分析其内部,如图5.4所示。

图5.4:使用剪贴框显示interiour。点云由Ogle,Tucker和Hicks提供[38] 对于高亮和裁剪,顶点着色器检查点是否在其中一个框内。然后它修改其颜色(突出显示)或丢弃它(剪辑)。

算法5.1显示了顶点着色器如何处理剪辑框的渲染。剪辑框及其逆世界矩阵的数量传递给着色器。对于每个顶点,着色器循环遍历所有框并将点转换到剪贴框对象空间。在对象空间中,所有剪辑框的宽度,高度和深度都为1,位于原点。因此,如果所有坐标分量大于-0.5且小于0.5,则点在剪辑框内。根据剪辑模式,该点现在或者突出显示,如果它在这个间隔内,或者如果它在外面被丢弃。丢弃顶点不是WebGL直接支持的。为了丢弃它,它的坐标被设置为剪辑区域之外的任何值。

Potree提供距离、面积和角度测量工具。虽然它们显示不同的信息,但它们工作非常相似,因此在同一个MeasuringTool类中实现。每个度量由一个顶点数组和一些指示如何显示它们的标志组成。例如,距离测量将激活距离标签,但禁用角度标签和关闭边缘。另一方面,角度测量将具有激活的闭合边缘和角度标签,但是没有距离标签。区域测量通常具有距离标签、区域标签和关闭边缘。然而,也可以定义标志的任何其他组合。

测量工具使用先前描述的点选择方法以允许实时地拖放和折叠顶点。由于GPU采集,下降位置正好是当前悬停的点或其周围最近的点。

相对于接地平面进行面积测量,高度差异被忽略。结果显示没有单位,因为Potree不对坐标单位做任何假设。
图5.5:不同的测量工具。(c)由sigeom sa提供的公路建设点云的抠图[60]。

在渲染和后处理场景之后,不进行深度测试来渲染测量。因此,它们不被点云遮挡,并且不受眼球照明的影响。

通过绘制到二维画布元素中来更新标签的纹理。二维画布元素是html标准的一部分,可以像任何其他元素一样插入html页面。canvas API提供了将元素中的文本,线条和样条曲线绘制的功能。对于测量标签,画布元素被绘制到并且它们的内容被发送到GPU,而不将它们添加到网页。

高度轮廓或高度轮廓由折线组成,其中每个边缘或段具有宽度和无限高度。在段的边界内的点是简档的一部分。图5.6显示了在三维视图和二维视图中具有三个顶点的高度剖面的示例。

图5.6:由跨越2个段的3个顶点组成的概要文件。(a)默认情况下,高度剖面中的点被突出显示。(b)在二维视图中,每个段的平行投影彼此相邻。点云由Open Topography和PG&E提供[42]。

高度剖面允许用户获得数据的切除,并且测量和分析,而不会被环境阻挡或分散注意力。距离和其他测量工具以及导航工具可以通过切换到剪辑外模式而限制到轮廓内的点。
图5.7:在2种不同颜色和剪辑模式下渲染的相同高度轮廓。点云由sigeom sa提供[60]

Potree.PointCloudOctree.getPointsInProfile()函数返回给定高度剖面中的所有点。它有2个版本。同步的,它立即返回内存中的结点的结果;异步的,创建一个ProfileRequest,每当新的点被加载时,请求频繁地调用回调。为了保持应用程序响应,每个帧只加载和处理少量的节点。可以通过调用request.cancel()随时停止请求。取消操作对于密集点云是有用的,即使小的轮廓可能包含数十万或数百万的点。

与三维渲染不同,三维渲染按屏幕投影大小优先顺序遍历节点,高度剖面检索进行水平顺序遍历。其背后的原因是,高程剖面的二维表示采用正交投影,其将低层节点映射到更大的屏幕投影尺寸。水平顺序确保结果以均匀的方式朝向最终轮廓收敛。对于二维表示,这意味着可以在提取一定数量的点之后对结果的最小或甚至可忽略的影响来消除高度轮廓请求。对于500x300像素的画布,阈值为20000点在实践中效果很好。其他点将主要闭塞或被先前提取的点遮挡。

实施了用于绘制高度剖面的两种不同选择。可以使用在三维视图中具有无限高度的剪辑框或者在正交二维视图中投影和绘制的轮廓段。

三维视图提供与剪辑框相同的呈现选项。轮廓内的点可以被突出显示,轮廓之外的点被剪裁或剪切可以被禁用。测量工具和导航被限制在可见点,允许用户在感兴趣的区域上工作,而不会被环境遮挡或分散注意力。

二维视图使用异步版本的getPointsInProfile(profile、callback)。回调的onProgress函数在流入时继续将新点绘制到二维画布元素中。如果通过移动顶点或更改其宽度来修改高度剖面,当前请求将被取消,并创建一个新的请求。在绘制了一定数量的点之后,该请求也被取消。附加点不太可能改进结果,并且停止请求减少了不必要的计算开销。由于其异步性质,用户可以继续使用观看者,同时逐渐改进二维视图。2D方法沿着x轴对齐所有轮廓段,导致所有段的并排正交投影,如图5.8所示。


图5.8:2D投影轮廓,每个段的开始和结束由底部的红点指示

每个段被视为具有开始、结束、无限高度和宽度的框。由于每个段被单独处理,重叠的部分将多次返回相同的点。这个问题在具有尖锐角的附近节点上很普遍,如图5.9所示。
图5.9:(a)相邻段重叠并且返回相同点两次。在(b)和(c)中建议可能改进的边界以避免交叉。CA13点云由Open Topography和PG&E [42]提供

Potree提供了将高度剖面中的点保存在LAS文件中的选项。 在这种情况下,点阈值的影响更加显著。放大数据会暴露点密度差异,因为某些区域的加载深度比其他区域高,如图5.10所示。此时,考虑到高度剖面可能包含数百万甚至数十亿的点,对于完全客户端的点云查看器,没有阈值的完整高度剖面是不可行的。


图5.10:导出的高度剖面,在CloudCompare点云查看器中打开。点阈值在以特定距离查看数据时工作。特写视图显示密度差异,因为进一步处理在达到阈值之后被取消。

除了呈现原始三维模型之外,内容提供商还可能想要突出显示和提供关于特定兴趣点的信息。注释使开发人员能够插入文本标签,将摄像机移动到预定义的位置并显示简短描述。注释使用HTML元素实现,以利用其广泛的功能。


图5.11:狮子模型上的三个注释

清单5.4显示了如何将具有所有可用功能的注释添加到场景中。必须指定注释和摄像机位置。单击注释将把用户移动到摄像机位置。其他属性是可选的。如果未指定目标,则将注释位置用作目标。标题定义标签的文本。如果省略此属性,将使用一个从1开始的序列号。当鼠标移动到注释上方时会显示说明。描述可以由文本以及HTML元素组成。


单击注释将会将摄像机移动到用户指定的位置。即时改变位置和方向可能导致迷失方向和混乱,因为用户失去他们到达目的地的背景。因此通过平滑内插的动画路径实现朝向指定目标和相机位置的移动。动画持续时间为800ms已被证明足够短,以迅速达到目标,但设置为足够长时以掌握观众到达目的地的方式。将鼠标放在注释上将显示可选定义的描述。描述可能包含HTML标签,允许开发人员包括标准文本以及超链接、图像等,如图5.12所示。

地理参考是将二维或三维坐标链接到真实世界位置的过程。这对于各种应用是至关重要的,例如创建和显示地图、创建表示真实世界的场景、进行测量等等。

在地球上,可以通过角坐标来指定位置,即纬度和经度,其给出了在南北和东西方向上的角度。另一个选项是以地心为中心的地球固定(ECEF)坐标系中的笛卡尔坐标。在这个系统中,原点在地球的质心,坐标单位为米。第三选项是局部地图投影,其中拍摄和投影地球的小片段,使得真实世界地面与虚拟场景地面对准。

地球的形状大致类似于扁圆球体。球体在平面上的任何投影将引起一定量的失真。通常使用的Web墨卡托投影,也称为EPSG:3857,显示朝向极的越来越大的失真。靠近极点的国家看起来比它们更大,相对于赤道附近的国家,如图5.13所示。


图5.13:地图投影引起的失真。(a)使格陵兰看起来像非洲一样大,而(b)使格陵兰看起来更小。摘自维基百科横轴墨卡托投影[74]

为了减少失真误差,一些投影仅对某些区域有效,如图5.14所示。在指定的范围内,失真足够小,使得测量产生有用的结果。瑞士坐标系CH1903 / LV03或EPSG:21781定义在瑞士的边界内。其他国家也有自己的空间参考系统。通用横轴墨卡托坐标系统(UTM)是一个世界范围的系统,在赤道附近的60个地带分裂地球。每个区域具有6度的宽度,以减少东西变形。然后将区域圆柱形地投影以减少南北扭曲。随着坐标越来越接近每个区域的边界,失真增加。调查数据可能不会总是落在单个地图投影的范围内。在这种情况下,可以分割数据集并且为每个图块使用不同的投影。或者,如果一定量的失真是可接受的,则即使部分数据在该范围之外,相同的投影也可用于整个数据集。

Potree为地理配准提供基本支持。在转换期间,用户必须以proj4格式指定数据集的空间参考系,然后将其存储在转换的数据集的元数据中。坐标本身保持不变。如果带有空间参考系统的点云由Potree查看器加载,则它将创建一个二维地图叠加,显示点云的范围以及添加到三维场景的测量。地图叠加层是使用openlayers3库创建的,并且使用OpenStreetMap作为其地图提供程序。地图的空间参考系是Web墨卡托。 proj4js库允许在点云和地图的空间参考系之间进行转换。

图5.15:单精度浮点数没有足够的精度来存储许多类型的地理参考坐标。点云由sigeom sa提供[60]。

地球参考坐标的问题是它们的大值。例如,瑞士坐标系的最小范围是[8,]。然而,浮点数的精度随着值变大而减小。这个问题可以在运动或条纹期间表现为抖动,因为一个轴上的坐标被四舍五入到浮点数能够表示的最接近的值,如图5.15所示。

  • 为了计算的目的,转换器将坐标作为双精度数处理。
  • 对于存储,使用32位定点数。64位双值需要太多磁盘空间,32位浮点值对于大型模型不够精确。格式的更详细描述在第5.5节中给出。
  • 对于渲染,浮点坐标用于利用GPU对浮点操作的熟练程度,但是对象空间中的坐标保持接近原点(0,0,0),以保持精度。点云的世界矩阵通常用于将点云从其对象空间转换为其在世界空间中的地理参考位置。然后,视图矩阵将相机的位置转换为新的坐标系原点。世界视图变换的点云坐标然后相对于附近的相机原点,而不是非常遥远的世界原点。两个矩阵的平移部分有效地相互抵消。然而,为了这样工作,两个矩阵将必须使用双精度以能够存储巨大的平移部分并且确保矩阵乘法的精确结果。因为three.js的版本,我们使用只提供单精度浮点值,我们不能依赖这种技术。

作为解决方法,我们不会将点云转换为地理参考空间。相反,第一点云保持在原点,并且随后加载的点云相对于第一点放置。如果需要地理参考坐标,例如使场景与地图叠加同步,则可以通过定制和更精确的变换将坐标从局部场景坐标系统变换到地理参考坐标系。这种解决方法的缺点是坐标系原点保持在第一点云附近,并且放置得离第一点云太远的任何其他模型将仍然遭受精度问题。

图5.16:带有地图叠加的点云。地图显示了点云的范围,相机的位置和距离测量。点云由sigeom sa提供[60]。

每个八叉树节点包含存储在其自己的磁盘文件中的点云模型。Potree提供了3种不同的点云文件格式供您选择。默认值是基于Scanopy格式的自定义二进制格式,区别在于坐标存储为定点数字而不是浮点数。其他两种支持的格式是LAS和LAZ。

Potree逐点、逐属性进行存储,元数据文件指定哪些属性可用。唯一的强制属性是点的欧几里得坐标,可选属性是RGBA、强度和分类。属性及其数据类型的列表如表5.1所示。该格式基于Scanopy的文件格式,主要区别是浮点坐标被量化为并存储为定点值。

浮点值不是存储坐标的合适数据类型。双精度浮点值具有高精度,但需要64位,这在磁盘空间使用方面非常低效。单精度浮点值只需要32位,但是对于许多大型模型,它们没有足够的精度。这是因为即使浮点值具有大范围,它们仍然具有非常有限的数字量。

它使它们对于小值更加精确,其中那些数字可以自由地用于小数部分,但对于大值不太精确。

在该上下文中,坐标量化意味着将坐标值从浮点表示变换到定点表示。定点值在整个坐标范围内具有一致的精度。可用位可以在坐标范围和小数位数之间折衷。使用32位,可以存储232,刚好超过42.94亿,唯一值。如果我们以毫米为单位,我们最终能够以毫米精度存储一个具有4294公里范围的模型。

定点值存储在32位无符号整数中,因为不存在本地定点数据类型。定点值的小数部分通过将值向上扩展10位数来保留。

公式5.1显示了如何将坐标从float或double值量化为具有由scale给出的精度的整数。刻度0.001将小数点向右移动3位数,有效地将单位从米转换为毫米。剩余小数部分在转换为整数期间丢失。减去节点边界框??的最小值可确保量化值从零开始。这样做也避免了超出界限的错误,当已经较大的坐标通过除以小于1的标度除以更大时会发生。


在加载期间,执行相反操作以从定点表示变换回浮点表示。

量化坐标的压缩目前正在开发中,而不是公共Potree存储库的一部分。

量化本身很适合简单的压缩形式。量化后,我们得到在零和boxWidth / scale之间的整数。这个范围通常是整个32位范围的一小部分。通过量化进行压缩的想法是在所需的位数中存储一个数,而不是更多。

公式5.2给出了存储量化坐标所需的位数。根据这个公式,19位足以存储一个大小为400米,毫米精度的模型,减少约40%。

通过量化不是到整个点云的边界框,而是每个节点的边界框,获得额外的节省。对于每个级别,边界框大小减半。将值空间减半减少了每个轴1位所需的位数,每个三维坐标总共3位。在八叉树级别8,坐标需要比0级的坐标少3个字节。

LAS是一种广泛使用的点云格式,由大多数点云应用程序支持。它还将坐标存储为定点整数。用户不是指定每个期望的点属性,而是在预定义的记录格式与固定的属性集合之间进行决定。因此,用户被迫存储属性,即使它们没有在使用,这导致增加的文件大小。

LAS的压缩版本LAZ格式由Martin Isenburg [49]创建,以提供一种存储效率高的方式来保存LAS文件的内容。LAZ文件往往比LAS约小70到90%。

Workers来并行解压缩多个LAZ文件。

解压缩是一个计算昂贵的任务,并且由于emscripten生成的代码的性质,解码器的每个实例需要几百MB的存储器。因此,使用LAZ压缩不太适合具有低存储量的移动设备或具有非常快速连接的机器,其中较大文件的传输比较小文件的传输和解压缩更快。具有4GB RAM或更多内核的多核设备将极大地受益于压缩文件的更快传输,尤其是在网络速度低的情况下。

本章包含转换器和查看器的性能评估,第三方对potree的应用,以及由第三方提供的我们自己的点云渲染。

本节列出了转换器和查看器的性能评估。

表6.1显示了测试机器的列表。转换器性能在笔记本电脑、SSD和服务器系

统上进行了测试。笔记本和SSD是相同的,除了磁盘驱动器。SSD系统使用的磁盘根据其规格具有540MB / s的读取性能和520MB / s的写入性能。在Notebook系统和三个移动设备(三星Galaxy S4 Active、三星Galaxy S7 Edge和iPhone 6S)上测试了观看者的性能。

Potree转换器的性能受到磁盘速度和CPU的限制。表6.2显示,SSD系统的性能优于Notebook系统,即使它是相同的,除了磁盘。服务器系统具有显著更高的CPU性能,但在笔记本和SSD之间的预期磁盘性能优于两者。

磁盘速度瓶颈源于必须读取和写入的大量数据。由于缺少核心方案,点可以从磁盘读取并多次写回磁盘,因此进一步增加了I / O操作的数量。

CPU瓶颈的一大部分来自于单线程实现的八叉树构建,即使它是一个潜在的高度并行化的任务。当前,每个点被一个接一个地处理。第二个线程用于从输入读取点,而构建线程处理已经读取的点。多线程构建方法将在未来进行调查。 Hobu的Entwine [26]和NLeSC的修改的Massive-PotreeConverter [34]等

Explorer简称ES文件浏览器,是安卓文件管理的NO.1品牌。全世界下载总数已超过3亿次。它能够很好的帮助你管理手机、平板、电脑以及云盘等。ES文件浏览器自带简体中文。界面清晰,操作简单。点击就可以播放音乐、查看图片、阅读文档、安装应用、查看压缩文件、进行搜索、更改视图等,所有的操作都是轻轻一个点击就可以完成。非常方便实用。即使是小白也能够轻松使用。该软件还附带海量的网盘储存空间。全世界上亿用户都在使用的最强安卓文件管理器!喜欢的下载体验吧!

1、去除程序主页的推广应用的工具箱选项。
2、去除收藏列表的与百度相关的广告行为。
3、去除任务管理器以及应用锁的下载弹窗。
4、去除多余选项内容如使用帮助反馈问题。
5、调整根目录零散文件到同一数据文件夹。
6、禁止程序检测升级应用市场无更新提示。
7、精简大量多余的语言文件仅保留简繁英。
8、优化其他一些细节内容及界面选项菜单。
9、解锁高级功能:实时文件检索、系统隐藏文件、SMB 2.0、主题皮肤
10、禁止启动广告页面、去所有广告横幅及活动项,锁屏体验、赞助横幅

  1. 面对现在各种软件的流氓行为,本站的宗旨就是为大家提供免费好用安全的软件资源!
  2. 所有软件由测试安装并运行,尽量保证无插件无流氓行为让大家下的放心用的放心。
  3. 由于注册机和一些补丁的特殊性可能会出现报毒的情况,首先本站保证不会上传任何病毒资源!
  4. 为了防止网盘误删添加解压密码:(部分老教程资源解压密码:)
  5. 不会下载请或查看,如有下载地址失效或解压错误的烦请留言,以便让本站尽快修复!
  6. 本站所有资源收集于网络,仅为网友学习交流之用!如果喜欢软件请试用后24小时内删除并购买支持正版!
  7. 如有不慎侵犯了您的权益请联系进行删除相关内容!
  8. 如有遗漏请指出 谢谢合作!

ES文件浏览器是一个能管理手机本地、局域网共享、FTP和蓝牙文件的管理器。通过ES文件浏览器用户可以在本地、局域网共享、FTP和蓝牙设备中浏览、传输、复制、剪切、删除、重命名文件和文件夹等等,还可以备份系统的已装软件。注:默认模式下,用户可以浏览手机存储卡和部分手机系统文件,想要访问所有文件并对其进行操作,请启动超级用户管理选项(在设置菜单中)。1.SD卡文件管理器,进行各种文件操作、多种文件视图选项 多选和功能更强的剪贴板功能,搜索功能2.应用程序管理器,安装、备份、卸载、快捷方式3.进程管理器4.访问局域网计算机、FTP和蓝牙上的文件,可以在计算机和手机进行无缝的文件操作5.本地、共享、FTP、蓝牙查看、打开多媒体文件,内置文本编辑器ES文件浏览器4.1.7新版特性稳定性改进和错误修正。ES文件浏览器4.1.4.31. 修复安卓7.0上的快传问题2. 更美观的视频播放器3. 适配安卓6.0“格式化为内部存储”功能4. 解决安卓5.0及以上的外置卡写操作问题5. 支持更多Root方式6. 新增日志快捷提醒功能 ES文件浏览器4.1.4.增加快传功能.全新的主页图标设计.增加剪贴板悬浮按钮,您可以在设置中打开.修复一些bugES文件浏览器4.1.3.增加快传功能.全新的主页图标设计.增加剪贴板悬浮按钮,您可以在设置中打开.修复一些bugES文件浏览器4.1.1*修复了云盘从”复制到“目录中消失的bug *修复了若干已知bugES文件浏览器4.0.5*修复FTP server在更改路径后失效的问题*修复安卓6.0菜单背景问题*更新网盘图标ES文件浏览器4.0.4*新增文件分析器,帮助用户找到应用关联文件夹、大文件、最近新增文件、重复文件、冗余文件;帮助用户分析应用敏感权限、缓存、内存占用情况等 *修复bugsES文件浏览器4.0.3.4*修复FTP server在更改路径后失效的问题*修复安卓6.0菜单背景问题*更新网盘图标ES文件浏览器4.0.3.2*修复安卓6.0显示问题*更新字符串翻译*其他改进ES文件浏览器4.0.3.1*修复安卓6.0显示问题*更新字符串翻译*其他改进ES文件浏览器4.0.3*修复安卓6.0显示问题*更新字符串翻译*其他改进ES文件浏览器4.0.2.7*修复crash *新增垃圾文件清理功能 *修复部分bugES文件浏览器4.0.2.4*对部分界面设计进行了调整;*修复了一些错误;ES文件浏览器4.0.2.3*对部分界面设计进行了调整;*修复了一些错误;ES文件浏览器4.0.2.2*修改文件浏览器及主题包的样式;*只允许默认主题和HOLO主题修改导航栏配色;*更新远程管理器的桌面图标;*修复一些引起崩溃的问题,增强稳定性;ES文件浏览器4.0.2.1*解决部分手机因兼容性导致的死机问题*增加导航栏和窗口颜色的设置功能*双工具栏可以在显示设置中恢复ES文件浏览器4.0.2*增加新皮肤和新布局,默认主题支持Material Design*接入ES应用锁功能*改版音乐播放器*增加沉浸模式*修改部分bugES文件浏览器3.2.5.4*增加新的语言卡纳达语*修复图片不能上传至Facebook的问题。*修复android5.x不能备份应用到外置卡的问题。*大量bug修复ES文件浏览器3.2.5.2*增加新的语言卡纳达语*修复图片不能上传至Facebook的问题。*修复android5.x不能备份应用到外置卡的问题。*大量bug修复ES文件浏览器3.2.5.1*在手机上远程操作安卓电视*修复5.0外置卡写问题*大量bug修复ES文件浏览器3.2.5*在手机上远程操作安卓电视*修复5.0外置卡写问题*大量bug修复ES文件浏览器3.2.4.1 ···*改进平板分辨率*数十项改进ES文件浏览器3.2.4 ···*改进平板分辨率*数十项改进ES文件浏览器3.2.3.1 ···*修复部分Android5.0兼容性问题(主题...)*数十项改进(卸载OTG设备、文件夹图标可选系统应用...)ES文件浏览器3.2.2版更新信息:*支持Chromecast插件*支持东芝系列无线设备*支持tar、cab、bz2等的解压*数十项改进ES文件浏览器3.2.1.2版更新信息:1)增加压缩插件,支持7z等2)个人云合并到网络硬盘3)可新建百度网盘,支持第三方登录4)导航支持主目录、应用、磁盘分析器、音乐播放器等长按建立桌面快捷方式5)提高网络扫描性能6)几十多项小的改进ES文件浏览器3.2.1.1版更新信息:2)个人云合并到网络硬盘3)可新建百度网盘,支持第三方登录4)导航支持主目录、应用、磁盘分析器、音乐播放器等长按建立桌面快捷方式5)提高网络扫描性能6)几十多项小的改进ES文件浏览器3.2.1版更新信息:1)增加压缩插件,支持7z等2)个人云合并到网络硬盘3)可新建百度网盘,支持第三方登录4)导航支持主目录、应用、磁盘分析器、音乐播放器等长按建立桌面快捷方式5)提高网络扫描性能6)几十多项小的改进ES文件浏览器3.2.0版更新信息:-增加我的网络窗口-UI改进-剪贴板移到窗口中-数十项改进ES文件浏览器3.1.9.1版更新信息:-改进局域网性能-OTG设备支持NTFS-增加MediaFire网盘-支持文件夹加密-清理关联文件夹-等几十项改进ES文件浏览器3.1.8版更新信息:-增加热门资源-增加分享和在浏览器中打开-sftp支持私钥文件登录-十多项小的改进ES文件浏览器3.1.7.1版更新信息:-文件加密解密菜单-打开为中可清除默认打开方式-十多项小改进ES文件浏览器3.1.6版更新信息:1.修复部分2.3机型滑动卡顿2.增强底层安全性3.新建窗口功能4.USB提醒默认关闭5.数十项小改进ES文件浏览器3.1.5.3版更新信息:1.修复部分2.3机型滑动卡顿2.增强底层安全性3.新建窗口功能4.USB提醒默认关闭5.数十项小改进ES文件浏览器3.1.5版更新信息:1.修复部分2.3机型滑动卡顿2.增强底层安全性3.新建窗口功能4.USB提醒默认关闭5.数十项小改进ES文件浏览器3.1.5版更新信息:1.修复部分2.3机型滑动卡顿2.增强底层安全性3.新建窗口功能4.USB提醒默认关闭5.数十项小改进ES文件浏览器3.1.4版更新信息:1.支持OTG设备(FAT32,不需要root)2.支持系统应用备份ES文件浏览器3.1.3版更新信息:1.文档库图书类型设置2.当前目录(搜索)过滤功能3.属性中增加目录分析ES文件浏览器3.1.2版更新信息:1、支持应用关联文件夹2、支持按照数字大小排序3、已Root机型支持4.4外置卡写入4、支持M3U格式ES文件浏览器3.1.1版更新信息:1)解决三星等机型4.4外置卡的写入限制 2)支持多线程下载和复制 3)支持网络历史记录 4)支持音频、视频文件缩略图 5)支持下载部分视频网站ES文件浏览器3.1.0.3版更新信息:1、性能改进,网盘和计算机上传速度倍增2、修复网速慢时播放器开启慢的问题3、网络视频管理支持切换视频网站ES文件浏览器3.1.0.2版更新信息:1、网页缩放功能2、小说搜索功能3、解决部分兼容性问题ES文件浏览器3.1.0.1版更新信息:修复了使用ES音乐播放器播放云端音乐的bugES文件浏览器3.0.9.1版更新信息:增加回收站功能(在左侧导航栏中)增加应用升级下拉检测ES文件浏览器3.0.9.0版更新信息:1)增加回收站功能(在左侧导航栏中打开)2)增加应用升级下拉检测ES文件浏览器3.0.8.0版更新信息:1)解决Android4.4外置卡读写问题2)支持百度云登录保护3)自动上传缓存本地编辑过的网盘文件ES文件浏览器3.0.7.0版更新信息:1、网络硬盘秒传2、失败文件断点续传(支持本地、局域网)3、窗口滑动速度优化,网络性能改进如软件更新后有问题,卸载并重装解决一切ES文件浏览器3.0.6.0版更新信息:1、手势支持更多选项2、支持播放m3u3、优化代码,增强稳定性4、升级Box到新APIES文件浏览器3.0.5.5版更新信息:1、修复部分2.3机型无法进行磁盘分析。ES文件浏览器3.0.5.4版更新信息:1、任务管理器升级1.4版本,适配ES3.02、支持网络硬盘扩容2T空间3、设置水珠位置、空间提醒4、支持有线网5、下拉发现应用ES文件浏览器3.0.5.3版更新信息:1、支持网络硬盘扩容1T空间2、在导航菜单中加入快捷开关组3、解决部分机型无法通过蓝牙发送apk问题4、解决部分LG机型点更多菜单闪退问题ES文件浏览器3.0.5.2版更新信息:1) 体积精简15%,速度更快2) 手势小水滴3) 全屏模式调出工具栏的按钮4) 增加安全和盗版提醒5) 恢复apk可选恢复数据6) 增加过滤短音乐设置ES文件浏览器3.0.5.1版更新信息:1)支持Root模式修改所有者和组2)支持Root或FTP上的链接文件3)Google Drive app因自身bug崩溃问题4)百度网盘升级个人云ES文件浏览器3.0.5版更新信息:1)增加网络硬盘文件夹(长按删除,可从设置中启用)2)改进Root工具箱3)改进播放器4)支持Dropbox等外链5)修复一键云分享到新浪微博ES文件浏览器3.0.3:提高启动速度(平均40%)增加土耳其语增加在历史记录中显示磁盘空间的选项修复用户反馈问题(部分4.0机型上移动后无法在图库中找到图片等)ES文件浏览器3.0.2:1)增加语言:葡萄牙语,立陶宛语,加泰罗尼亚语;2)修复Yandex登陆问题;3)增加“打开为”功能;4)修复用户反馈的问题(系统图库无法显示图片,剪切无法取消等)ES文件浏览器1.6.2.5版更新信息:1)一键安装卸载前要求确认2)支持同一网盘建立多个账号3)支持Intel CPU的Root模式4)支持SFTP的交互认证方式5)修复ES播放器在开启状态耗电的问题提示,1)有外置卡的机器,按工具栏第一个按钮访问外置卡2)如果软件更新后无法进入,卸载并重装会解决一切问题ES文件浏览器1.6.2.4版更新信息:1)加速Root模式下的启动时间2)Root模式下批量一键卸载的功能3)应用排序功能4)支持打开网络端文件5)修复RAR解压取消后再解压失败的问题提示,1)有外置卡的机器,按第一个按钮访问外置卡2)如果软件更新后无法进入,卸载并重装会解决一切问题ES文件浏览器1.6.2.3:1)在来电时暂停音乐播放(增加了一个权限要求:获得手机状态)2)在关于中增加反馈按钮3)支持对服务器列表排序4)支持Webdav的文摘、NTLM等认证方式提示,1)有外置卡的机器,按第一个按钮访问外置卡2)如果更新后无法进入,卸载并重装会解决一切问题ES文件浏览器1.6.2.2版更新信息:修复上一版本Apk无法通过蓝牙分享的问题ES文件浏览器1.6.2.1:1)改进平板上的快速滑动2)Root管理支持小米等机型3)支持远程分享菜单ES文件浏览器1.6.2.0:修复了上一版本中自动横屏无法关闭的Bug.ES文件浏览器 4.1.8.1 中的新功能优化体验,增强稳定性。ES文件浏览器 4.1.8.2.2 中的新功能V4.1.8.2.21.增加云盘引导功能2.添加社交功能引导入口3.功能优化及bug修复ES文件浏览器 4.1.8.3.2 中的新功能更稳定、更优质,邀您一起体验。ES文件浏览器 4.1.8.4 中的新功能1.smb2.0及隐藏系统文件功能开放;2.修复已知BUG;ES文件浏览器 4.1.8.4.2 中的新功能为您优化了体验细节。

我要回帖

更多关于 es文件浏览器4.1.0 的文章

 

随机推荐