基于Cesium 的三维瓦片构建技术研究

2021-01-20 08:43孟天杭
科学技术创新 2021年1期
关键词:数据格式三维空间瓦片

孟天杭

(北京建筑大学测绘与城市空间信息学院,北京100000)

1 概述

近年来,随着无人机、激光扫描等数据采集技术的发展,有效降低了三维空间数据的获取成本和时间周期,提高了数据精度。然而,随着大规模三维空间数据的不断积累,三维空间数据如何在B/S 下高效地发布、共享、交换、传输,成为一个亟待解决的问题。

Cesium 是当前应用最广泛的三维GIS 框架之一,无需任何插件可直接在浏览器端展示三维虚拟地球并叠加丰富的地理空间数据,是一个跨平台、开源、轻量级的WebGis 表现层库。Cesium 使用的三维瓦片数据格式是3D Tiles,该数据格式是由AGI 公司于2015 年6 月制定的一套用于流式传输大量异构3D地理空间数据集的开放规范[1]。3D Tiles 是一个开放规范,可用于在台式机、Web 程序和移动应用程序之间共享,可视化,可以包含多种类型的3D 地理空间内容,比如倾斜摄影测量模型、BIM建筑模型、人工模型、点云、矢量数据等都可以转化为三维瓦片,从而高效地进行可视化、共享和互操作等难题[2]。

3D Tiles 虽然是开源的一套规范,但如何对多源异构数据建立三维瓦片,目前还存在很多的问题。虽然AGI 公司开源了部分3D Tiles 处理工具,在倾斜摄影数据方面已经能很好地进行处理,但在人工大模型和点云方面还没有很好地解决方案。本文通过详细研究3D Tiles 的规范,致力于形成一套针对人工大模型和点云三维瓦片构建的解决方案[3]。

2 3Dtiles 格式说明

构成3D Tiles 的基本框架是瓦片集,瓦片集包括索引文件和瓦片数据。索引数据是对整个瓦片集的说明以及瓦片的空间组织结构的存储,而瓦片数据负责存储单个瓦片内所有的三维空间数据,包括模型数据、点云数据、影像数据、矢量数据、属性数据等。索引文件包含了版本号、资产说明、根节点、几何误差等属性,其中根节点又包含了boundingVolume、refine、content、children、transform 等信息; 瓦片数据有b3dm、pnts、i3dm、cmpt 四种瓦片数据格式[4]。

3 三维场景分割

三维瓦片构建之前首先对三维场景进行分割,包括八叉树构建、网格简化、点云抽稀三个关键的步骤。

3.1 八叉树构建

场景分割的方法有很多种,其中最常见的有网格划分、四叉树分割、k-d 树,八叉树等[5]。应用八叉树在对三维空间数据的处理中是效果很好的一种数据结构,因此在海量三维体数据处理过程中,应用八叉树数据结构对数据进行分解,按实际需要进行分级分块,可以实现对大规模三维数据的高效存储和管理。本文将使用八叉树数据结构对三维场景进行划分,通过将大场景细分为很多子场景,进而生成3D Tiles 瓦片数据。

图1 八叉树基本结构图

如图1 所示,每次将立方体分为八个子立方体,第一次分割得到8 个立方体,第二次分割得到64 个立方体,每个立方体都有对应的唯一编码且对应三维场景中一小部分,这也符合3D Tiles 的设计理念。将模型数据和点云数据按照此八叉树的结构进行分割,为后续三维瓦片构建做准备。

3.2 网格简化

网格简化采用的是一种三角形折叠算法,对原始模型的三角形预分类,简化过程中以三角形的狭长度、局部区域面积控制三角形简化顺序,较好地保持了模型原始特征,简化速度较快[6]。

图2 简化折叠示意图

此算法是将三角网中某个满足条件的三角形简化为一个顶点V,并将此三角形三个顶点所有的关联点与新顶点V 相连,同时删除与该三角形相邻接的三角形,此种简化方法删除的基本元素是三角面片。如图2 所示,一次折叠过程可删除三角形T0、T1、T2、T3,顶点V1、V2、V3并生成一个新顶点V0,并将V4到V9分别与V0相连。

3.3 点云抽稀

点云抽稀算法有很多种,基于八叉树的格网抽稀、基于系统抽稀、基于距离和高差抽稀、基于曲率的点云抽稀等,本文采用基于八叉树的格网抽稀算法。

图3 点云抽稀示意图

如图3 所示,点云抽稀的原理为计算在此格网内所有点到网格中心的距离,进行距离排序,选择距离最小的点作为代替点,用该点去取代整个格网内所有点。

基于八叉树的格网抽稀算法步骤为:

a.散乱点输入;b.计算包围盒;c.判断是否满足划分条件;d.网格划分;e.计算距离最小点;f.进行点替代。

4 三维瓦片构建

4.1 glTF 组成

glTF 是一种适用于海量三维空间数据传输的三维格式。这种数据格式的内部结构与WebGL 的渲染机制基本一致,所以更加符合基于WebGL 的应用需要。由于其紧凑的文件结构,使得用glTF 来表示三维空间数据所占用的容量更小,同时也减少了转换与使用这些三维数据的成本。glTF 能够快速加载且不依赖特定的应用、它的内容具有可扩展性更适合开发者用来定义独有的数据格式。

glTF 的组成具有一定的规则,它包含了场景、节点、网格、访问器、材质等。由这些属性组成了场景入口、场景的组织者、几何的定义者、外观决定者、数据访问规则、数据的存储者。其中scene 代表场景的入口;node 代表场景的组织者;mesh 代表几何的定义者;material、texture、image 代表外观决定者;accessor 代表数据访问规则;buffer 代表数据存储者。三维空间数据的几何信息和纹理信息都存在二进制buffer 中,并通过bufferView 去访问,并可通过设置偏移量来访问某一部分数据这也是glTF 加载效率快的原因之一。

4.2 瓦片构建

场景分割完之后要进行三维瓦片的构建,实质上是多源异构数据向3D Tiles 转换的过程。由于3D Tiles 所能包含的数据类别太多,本文只针对人工大模型和点云的三维瓦片构建。三维场景在进行八叉树分割完后生成很多小文件,瓦片的构建过程就是把这些小文件转化为3D Tiles 支持的文件格式,b3dm、i3dm、pnts 等。

图4 b3dm 文件结构图

由图4 所示,b3dm 文件大体分为两部分,第一部分由28 字节的文件头组成,包括了标识头、版本号、总字节长度、特征表、要素表等。第二部分由特征表、(要素表)和glb(glTF 的二进制形式)组成。其中glTF 格式在上文已经进行介绍,在gltf 的基础上加入一些要素信息就形成了b3dm 文件。

pnts 文件也是由两部分组成,第一部分由28 字节的文件头组成,第二部分由特征表和要素表组成。不同的是点云信息存储在featureTable 中,而不是存储在gltf 中,featureTable 包括点的颜色、法线、RGB、RTC_CENTER、BATCH_ID 等信息。

通过c++程序语言将场景分割生成的场景小文件转换为b3dm 或者pnts 瓦片数据。瓦片数据生成完以后重要的是如何去组织这些瓦片数据,也就是生成索引文件的过程。索引文件可以是具有空间一致性的任何空间数据结构,包括k-d 树、四叉树、八叉树和网格等。每一个瓦片都有对应的包围盒、旋转矩阵、几何误差、父节点、子节点等信息,索引文件的构建就是把瓦片之间的层级关系,每个瓦片的描述信息等用某一种空间数据结构组织起来。

5 结论

本文通过对Cesium 框架和三维瓦片数据格式的深入剖析,通过对三维场景八叉树的构建,进行场景分割、网格简化、点云抽稀等操作,建立模型和点云的多细节层次文件。利用c++编程语言将场景小文件转化为3DTiles 所支持b3dm、pnts 瓦片数据格式,将每个瓦片数据的包围盒、旋转矩阵、几何误差等信息按照八叉树空间数据结构组织生成索引文件,最终生成具有多分辨率层次的三维瓦片数据格式。

猜你喜欢
数据格式三维空间瓦片
前庭刺激对虚拟环境三维空间定向的影响及与空间能力的相关关系
打水漂
乡村瓦语
惯性
红领巾环保走进三维空间——“6·5世界环境日”活动方案
超时空转换(时空启蒙篇)
三维空间的二维图形
MIT—BIH心率失常数据库的识读
基于RFID的户外广告监管系统的设计与实现
一种融合多业务的信息化系统框架研究