网络知识 娱乐 WEBGIS开发 Cesium中3DTiles的加载策略 LOD多层次细节 最大屏幕空间误差解析

WEBGIS开发 Cesium中3DTiles的加载策略 LOD多层次细节 最大屏幕空间误差解析

3DTiles加载策略:

3DTiles数据格式能够支持海量数据渲染的重要因素之一就是其提供了LOD能力,LOD(Levels of Detail)意译为多层次细节技术,它最重要的作用就是决定三维模型渲染时的资源分配,使得模型精度在不同视角下展示不同分辨率。LOD通过使用高效的渲染运算降低了计算机资源的消耗。


1.add和replace

在面对海量数据渲染任务时,由于三维场景中的模型数据较多,且模型细节复杂,所以很多时候需要消耗大量时间和内存进行数据交换和处理,为了调节渲染精度和计算机处理速度,3DTiles采用了LOD多层次细节技术来对三维瓦片进行管理。

LOD技术使得三维场景在渲染时能够根据各个瓦片离视点距离的远近决定模型的精度。当离相机视点距离较远时,渲染低级别低精度的模型文件,距离相机视点较近时,则渲染高级别高精度的模型文件。LOD技术通过设定阈值控制渲染不同精度的模型,提高了系统运行的效率,也避免了不必要的计算机性能消耗。

3DTiles采用的LOD策略有两种,分别为add细化和replace细化,如果原始数据为OSGB格式的实景三维模型,它自带了多级分辨率的LOD数据,这个LOD是在数据生产过程中已经创建好的,是根据密集点云逐级抽稀后构建的三角网模型,所以在OSGB转3DTiles过程中只要确定瓦片的geometricError即可,无需创建LOD。
下面以可视化的表现形式阐述3DTiles中LOD技术的具体实现过程,3DTiles的LOD策略有两种,分别为add方法和replace方法。3DTiles中LOD的add细化策略实现如图所示,Cesium在加载3DTiles过程中,当相机离瓦片距离很远时,只加载重点建筑物模型,而随着视角的不断接近,Cesium开始将周边建筑物在界面上渲染呈现,在视角很近时才会将所有模型的细节全部渲染在屏幕上,add策略就是一个不断添加细化的过程。

add策略:
在这里插入图片描述
3DTiles中LOD的replace细化策略实现如图所示,当Cesium在加载3DTiles过程中,首先计算瓦片与相机之间的屏幕空间误差,然后与阈值比较来决定加载模型的精度。如图,当相机离瓦片距离很远时,只加载瓦片格式为pnts的上层点云模型;当距离拉近时,加载渲染最低级别的b3dm模型;再次拉近视点距离时,可以直观的观察到3DTiles采用了四叉树分割方式对三维模型进行了组织,一块图块被分为了四个部分,这四个部分分别对应各自的b3dm文件;当视点极近时,Cesium加载了级别最高分辨率最高的模型。
replace策略:
在这里插入图片描述
综上,LOD技术的核心就是分级分块,根据数据规模和需求精度对三维场景进行LOD级别划分,划分方式有四叉树、八叉树等,然后依据模型(精确到每个mesh)的材质(含贴图)来组合,优先把使用相同材质的模型放在一起,使得相似纹理存储在一个块中,以用来减少数据大小。合理的利用LOD多层次细节技术使得Cesium在海量数据渲染方面表现优异。


2.屏幕空间误差maximumScreenSpaceError:

如上文所述:当离相机视点距离较远时,渲染低级别低精度的模型文件,距离相机视点较近时,则渲染高级别高精度的模型文件,简单来说就是利用观察点(也就是相机)到观察瓦片的距离来判断。Cesium中这个表达判断是否加载瓦片精度的阈值就是最大屏幕空间误差,即maximumScreenSpaceError参数。
3DTiles采用了树结构来组织空间数据,但是对于开发人员来说,如何利用好3DTiles的组织结构,使得三维场景在浏览器中既能满足应用要求,又能实现流畅浏览,成为了首先需要思考的问题。
LOD详细层次分层结构使得3DTiles能在不同场景情况下加载不同分辨率级别的瓦片,层级越深的模型瓦片精度越高,展示的效果越好,但同时数据量也越大,需要从服务器请求下载并在前端渲染的子瓦片也会更多,进而造成计算机性能的过度消耗。另外,相机设置高度、姿态的不同也会造成展示场景区域范围的不同,加载瓦片数量的需求会根据屏幕显示范围的变化而变化,对模型的展示精度而言,一般要求离视角越近的地方模型展示的精度越高,较远区域的模型则精度要求较低,此举可以减少计算机性能的损耗,缓解前端渲染的压力。利用这些特性,根据不同计算机的性能动态调整加载模型的精度,成为了一种可以妥善解决问题的办法。
Cesium借用了最大屏幕空间误差(maximumScreenSpaceError)概念来控制模型的展示精度,屏幕空间误差(SSE)的计算公式如下:
在这里插入图片描述

其中,geometricError是模型的几何误差,drawingBufferHeight是WebGL底层的参数,指当前绘图缓冲区的实际高度,distance指的是瓦片的边界体积boundingVolume离相机的最近距离,fovy是相机在垂直方向的倾斜角度。
在加载3DTiles三维场景时,Cesium通过设置maximumScreenSpaceError参数值直接改变模型的展示精度,如图为同一视角情况下设定不同最大屏幕空间误差参数值时三维场景的展示效果:
在这里插入图片描述
在这里插入图片描述
在运行过程中,Cesium首先在3DTiles的索引文件tileset.json中读取瓦片的几何误差geometricError,然后计算相机离模型的最近距离和倾斜角,运用公式二计算屏幕空间误差,将得到的结果与maximumScreenSpaceError设置的值进行比较,如果小于设置值则满足要求精度,无需加载更高分辨率的瓦片,如果大于设置值,则继续读取层次更深、精度更高的子瓦片及相机的相关参数重复计算,一直到计算的屏幕空间误差小于等于maximumScreenSpaceError的设置值时才会终止计算,最后将相应瓦片请求加载并在前端渲染展示。
Cesium中maximumScreenSpaceError的默认值是16,它是一个可选属性,允许开发者自由设置大小来调整三维场景的展示精度,设置区间为0至无穷大,特别的,如果将其设置为0时,无论相机视角和姿态如何变化,Cesium都将加载叶子结点的瓦片,以所能达到的最高精度渲染模型。这样的做法对于海量数据或者是计算机性能不强、网络速度较慢的用户而言会造成浏览不畅,浏览器卡顿崩溃等现象。所以,根据使用场景和要求适当的调整最大屏幕空间误差参数值是三维场景前端加载优化的一个可行的办法。