收稿日期:2021-02-24;修回日期:2021-04-26;责任编辑:盛男,郑海霞。
基金项目:北京市科技计划应用技术协同创新资助项目(Z201100004520015);中国煤炭科工集团有限公司科技创新创业资金专项资助项目(2019-2-ZD002)。
作者简介:陈龙(1987—),男,山西山阴人,工程师,硕士,主要从事三维地理信息系统研发工作,E-mail:chenlong@ccteg-bigdata.com。
引用格式:陈龙,郭军,张建中.三维模型轻量化技术[J].工矿自动化,2021,47(5):116-120.
CHEN Long,GUO Jun,ZHANG Jianzhong.3D model lightweight technology[J].Industry and Mine Automation,2021,47(5):116-120.
随着WebGL技术的出现,用户无需安装任何插件就可在浏览器端直接打开三维可视化系统,提高了用户体验[1]。Cesium是一款基于WebGL技术实现的三维渲染引擎,在HTML5标准的浏览器和移动端运行[2],有详细的API文档和活跃的社区支持,可实现2D、2.5D、3D形式的地图展示。通过Cesium将煤矿空间地理信息进行可视化表达,为煤矿“一张图”、管控一体化、煤矿数字孪生等应用提供了保障[3]。
随着三维模型数据量的增大,模型加载速度降低且浏览不流畅,因此需要对三维模型进行轻量化处理,但是Cesium并没有提供三维模型轻量化工具[4]。本文在分析Cesium的模型格式3DTiles的基础上,从批渲染、带宽节省和数据量降低3个方面提出了一种三维模型轻量化技术,可达到三维模型高效加载且浏览流畅的目的。
3DTiles是散列文件的合集,记录了模型属性数据、逻辑关系等,是一种对数据的组织方式[5]。3DTiles在glTF基础上加入了 多细节层次(Level of Detail,LOD)结构,如图1所示。
图1 3DTiles结构
Fig.1 3DTile structure
3DTiles包括tileset.json文件和Data文件。Data文件里面包括多个三维瓦片文件集Tile_0_0,Tile_0_1,…,每个瓦片文件集包括1个json文件和Tiles,Tiles里面包含多个Tile文件。
tileset.json文件是3DTiles的入口文件,用来描述整个三维瓦片文件集,记录逻辑信息及其他元数据[6]。tileset.json文件中的属性content记录了瓦片文件集的相对路径,通过该属性可进行数据查找。
Tile是一个二进制的瓦片数据,包括Batched 3D Model (b3dm)、Instanced 3D Model (i3dm)、Point Cloud(pnts)、Composite(cmpt) 4种格式,可用于不同场景。
Tile文件结构如图2所示。
图2 Tile文件结构
Fig.2 Tile file structure
(1) header。header格式见表1。header占28 byte,包括7个属性数据。header主要对Tile文件进行了描述,且记录了Tile的类型、版本号、文件大小、FeatureTable的json长度、FeatureTable二进制数据长度、BatchTable的json长度、BatchTable二进制数据长度。
表1 header格式
Table 1 Format of header
名称类型长度/bytemagicunsigned char4versionuint324byteLengthuint324FeatureTableJsonByteLengthuint324FeatureTableBinaryByteLengthuint324BatchTableJsonByteLengthuint324BatchTableBinaryByteLengthuint324
(2) FeatureTable。FeatureTable记录整个瓦片渲染的相关数据,由FeatureTableJson和FeatureTableBinary组成。FeatureTableJson是元数据的角色,以json方式记录模型的个数、坐标中心等。FeatureTableBinary记录二进制本体数据。
(3) BatchTable。BatchTable记录每个模型的属性数据及扩展数据,由BatchTableJson和BatchTableBinary组成。BatchTableJson记录属性的描述信息、字节偏移长度、数据类型等。BatchTableBinary记录二进制本体数据,根据BatchTableJson记录的信息可在二进制本体数据中进行定位。
(4) glb。内嵌的glb符合glTF数据格式规范,所有的几何信息、纹理信息、可编程管线等均存储在glb中。
影响三维场景渲染性能的因素有CPU、GPU和带宽。CPU性能降低的原因包括使用过多的DrawCall、复杂的脚本或物理模拟。如果GPU中使用了过多的顶点及逐顶点计算,会造成GPU资源浪费。三维模型是由几何信息、材质、贴图组成,为了减小模型文件大小,要求模型中使用的贴图尺寸不能过大,将纹理图片和几何信息进行压缩,从而可降低三维模型的文件大小,利于网络传输。
图形渲染的原理是CPU向GPU发送渲染命令,GPU接收并执行相应的渲染命令。DrawCall是CPU通过调用DirectX或OpenGL的图形编程接口来命令GPU进行渲染操作,CPU每一次提交命令给GPU,都需要做大量工作[7]。在渲染每个不同材质的物体时,均需要调用相应的API。当DrawCall过多,CPU就会产生很多额外开销用于准备工作,花费大量时间将命令提交给GPU,造成CPU负载增加,GPU资源浪费。采用批渲染将渲染状态(如材质、贴图、可编程管线、几何信息等)一致的物体合成1个大物体,放在1个DrawCall中,在1次渲染任务中进行绘制,GPU不用多次切换渲染状态[7],提高了渲染效率。
(1) 材质共享。将模型中使用的纹理图片通过算法进行合并,重新计算并记录纹理坐标,将多张小纹理图片合并成1张大纹理图片。使用了同一张纹理图片,就可以使用同一种材质,然后使用不同的采样坐标对纹理图片采样[8],就能实现正确的纹理贴图。CPU无需多次调用图形API,在1个DrawCall中就可以加载合并后的大纹理图片。多张小纹理图片合并成1张大纹理图片的效果如图3所示。
图3 纹理图片合并
Fig.3 Texture image merge
(2) 模型网格合并。对于使用了同一种材质的纹理,它们之间仅模型的几何信息不同,如顶点、索引、法线、纹理坐标等。如果将这些数据在允许的数量范围内进行合并,将合并后的顶点缓存对象提交给GPU,就可以在1个渲染批次完成三维模型渲染。
影响浏览器加载三维模型速度的重要因素是带宽。对网络传输数据进行压缩,最大限度地节省带宽,提高三维视觉体验。
(1) 纹理压缩。Crunch是一个开源的压缩算法,其解压速度很快。该算法可大幅降低纹理的存储大小,降低显存及数据请求时间,压缩经过合并的纹理,将压缩后的纹理通过二进制方式写入Tile的glb中,在使用的时候进行解压,提升数据解析及加载渲染的效率。
(2) 顶点压缩。使用Draco对模型几何网格的连接信息和几何信息分别进行编码,之后进行压缩,将压缩后的信息通过二进制方式写入Tile的glb中,加载模型时,通过解析压缩信息,得到正确的模型几何信息。使用Draco压缩算法可节省约80%的存储空间[9]。
(3) 多级渐远纹理(Mipmap)。因为模型数据要生成多级LOD模型,如果每一级都使用同一高精度纹理,会产生纹理浪费。对合并后的大纹理图片进行重采样,逐级生成低精度的Mipmap层级,保证在每一级使用不同精度的纹理图片,最大限度降低显卡显存占用率[10-11]。利用Mipmap将合并的纹理图片转换成不同分辨率的纹理图片,如图4所示。
图4 多级纹理图片
Fig.4 Multi-level texture image
GPU的渲染能力与模型的顶点数量有关,顶点数量庞大,GPU负载增加。在不影响视觉体验的情况下,减少模型的顶点数量,可减轻GPU负载压力。
(1) LOD。在三维场景中,如果相机位置较远,肉眼难以区分模型的细节部分,采用LOD技术逐级减少模型的顶点数量,从而减少GPU的渲染数据量,提高三维场景流畅性[12]。为同一个对象准备多个包含不同细节程度的模型,并将模型赋值给LOD的不同等级,将不同细节程度的模型组织好父子关系,并设置相机参考值,Cesium在加载模型时,会自动根据相机位置来判断加载哪个等级的模型[13]。
(2) 三角面简化。采取边折叠算法生成连续的细节层次,该算法的优势在于移除不必要的硬边及纹理衔接,避免边界平滑和纹理分离[14]。通过对边折叠算法进行改进,可设置三角面简化的比例,在允许范围内尽量保持简化模型一致。不同三角面简化比例模型如图5所示。可看出原始模型表面光滑,具有很多细节,三角面数量较多;三角面简化50%后的模型细节有所简化;三角面简化80%后的模型三角面数量已大量减少。
图5 不同三角面简化比例模型
Fig.5 Simplified scale model of different triangles
在最大程度保持模型外观的基础上,通过逐级简化来减少顶点数量。如果模型在距离相机较远的位置,使用三角面简化80%的模型;若模型在距离相机较近的位置,使用三角面简化50%的模型;若模型在距离相机很近的位置,使用原始模型,这样可以缓解GPU压力。
(3) 数据空间结构组织。3DTiles在三维模型中支持自适应空间细分,包括kd树、四叉树、八叉树等空间数据结构。每种空间数据结构具有不同的使用场景,本文采用八叉树算法[15-16]对模型数据进行分块。根据模型复杂程度,自适应设置八叉树深度。按需加载模型的某一部分并进行渲染,从而提高场景流畅度。
使用CPU I7-8750、内存为16 GB、显卡 NVIDIA GTX1060、显示器刷新率为60 Hz的电脑,基于Cesium平台对三维模型轻量化处理前后的帧速率进行测试,结果见表2。可看出三维模型轻量化后的帧速率有所提高,达到了提高加载速度、使浏览更加流畅的目的。
表2 三维模型轻量化前后帧速率对比
Table 2 Frame rate comparison before and
after 3D model lightweight
轻量化技术轻量化前帧速率/(帧·s-1)轻量化后帧速率/(帧·s-1)帧速率提高比例/%材质共享253020模型网格合并252916纹理压缩25264顶点压缩25264Mipmap253124LOD253540三角面简化252812数据空间结构组织253228
在分析Cesium的模型格式3DTiles的基础上,提出了三维模型轻量化技术。将模型中的纹理图片依据材质和模型网格进行合并,实现正确纹理贴图,降低了DrawCall调用次数;将纹理和顶点进行压缩,降低了纹理图片文件大小;采用Mipmap生成不同分辨率的纹理图片,有利于网络传输;使用LOD和三角面简化技术,逐级降低模型的顶点和三角面数量;根据模型复杂程度,自适应选择八叉树深度,按需加载模型的某一部分,从而降低GPU的渲染数据量,提高三维场景流畅性。基于Cesium平台对三维模型轻量化处理前后的帧速率进行测试,结果表明,三维模型经轻量化处理后帧速率有所提高。
[1] 李梅,姜展,姜龙飞,等.三维可视化技术在智慧矿山领域的研究进展[J].煤炭科学技术,2021,49(2):153-162.
LI Mei,JIANG Zhan,JIANG Longfei,et al.Research progress on 3D visualization technology for intelligent mine[J].Coal Science and Technology,2021,49(2):153-162.
[2] 牛艺博.基于WebGL的地理信息三维可视化技术研究[D].兰州:兰州交通大学,2015.
NIU Yibo.Research on technologies of geographic information 3D visualization based on WebGL[D].Lanzhou:Lanzhou Jiaotong University,2015.
[3] 赵旭坤,张能,李威.基于WebGIS的矿区二三维地图联动技术研究[J].工程建设与设计,2019(4):279-280.
ZHAO Xukun,ZHANG Neng,LI Wei.Research on linkage technology of 2D and 3D map in mining area based on WebGIS[J].Construction & Design for Engineering,2019(4):279-280.
[4] 张建中.基于Web3D技术的煤矿BIM模型集成及可视化研究[J].煤炭工程,2020,52(7):161-168.
ZHANG Jianzhong.Integration and visualization of coal mine BIM model based on Web3D[J].Coal Engineering,2020,52(7):161-168.
[5] 孟天杭.基于Cesium的三维瓦片构建技术研究[J].科学技术创新,2021(1):119-121.
MENG Tianhang.Research on Cesium-based 3D tile construction technology[J].Science and Technology Innovation,2021(1):119-121.
[6] 曹浩泽.3D Tiles定义解析与生产规范设计[D].武汉:武汉大学,2018.
CAO Haoze.Analysis for 3D Tiles definition and design for production standard[D].Wuhan:Wuhan University,2018.
[7] STRING K.对DrawCall的理解[EB/OL].(2017-06-19)[2021-02-23].https://blog.csdn.net/srk19960903/article/details/73457321.
STRING K.Understanding of Drawcall[EB/OL].(2017-06-19)[2021-02-23].https://blog.csdn.net/srk19960903/article/details/73457321.
[8] 戴雪峰,熊汉江,龚健雅.一种三维城市模型多纹理自动合并方法[J].武汉大学学报(信息科学版),2015,40(3):347-352.
DAI Xuefeng,XIONG Hanjiang,GONG Jianya.A multi-texture automatic merging approach for the 3D city models[J].Geomatics and Information Science of Wuhan University,2015,40(3):347-352.
[9] 艾达,卢洪颖,杨玉蓉,等.三维点云数据压缩技术研究综述[J].西安邮电大学学报,2021,26(1):90-96.
AI Da,LU Hongying,YANG Yurong,et al.A brief overview 3D point cloud data compression technology[J].Journal of Xi'an University of Posts and Telecommunications,2021,26(1):90-96.
[10] 谢丰,姜弢.Mipmap应用于纹理绘制的新算法及实现[J].应用科技,2008(4):57-60.
XIE Feng,JIANG Tao.New algorithm and realization of Mipmap for texture rendring [J].Applied Science and Technology,2008(4):57-60.
[11] 徐莹.改进的基于MipMap算法的真实感纹理绘贴图渲染技术[J].绵阳师范学院学报,2013,32(5):67-70.
XU Ying.An improved texture rendering technique based on MipMap algorithm[J].Journal of Mianyang Normal University,2013,32(5):67-70.
[12] 王文凯,黄昆学,李梦,等.倾斜摄影测量数据轻量化处理技术研究[J].测绘通报,2020(9):123-126.
WANG Wenkai,HUANG Kunxue,LI Meng,et al.Research on lightweight processing technology for tilt photogrammetry data[J].Bulletin of Surveying and Mapping,2020(9):123-126.
[13] 熊英.基于Cesium 3D Tiles技术的模型分级加载研究[J].人民珠江,2019,40(8):117-122.
XIONG Ying.Research on models loading with LOD based on Cesium 3D Tiles[J].Pearl River,2019,40(8):117-122.
[14] 王宝.三维网格的鲁棒编码与传输[D].北京:北京工业大学,2004.
WANG Bao.Robust coding and transmission of 3D meshes[D].Beijing:Beijing University of Technology,2004.
[15] 周韶泽,李岩,张永辉,等.八叉树PagedLOD大规模三维模型可视化研究[J].大连交通大学学报,2020,41(2):33-37.
ZHOU Shaoze,LI Yan,ZHANG Yonghui,et al.Research of a large-scale 3D model visualization method based on Octree and PagedLOD[J].Journal of Dalian Jiaotong University,2020,41(2):33-37.
[16] 汪玲玲.一种插件式3DWebGIS的八叉树空间索引的研究与实现[D].淮南:安徽理工大学,2019.
WANG Lingling.Research and implementation of Octree spatial index based on plug-in 3D WebGis[D].Huainan:AnHui University of Science and Technology,2019.