张伟ZHANG Wei
(中铁第四勘察设计院集团有限公司,武汉 430063)
随着“铁路数字化”概念的提出和发展,三维BIM 模型在铁路工程中也得到了广泛的应用。其不仅可以向用户进行直观的模型展示还可以协助完成铁路线路的规划和设计,极大地推动了铁路行业的数字化进程。为了更好将三维BIM 模型融合到GIS 行业中,ESRI 公司提出了I3S规范,并基于该规范定义了新的三维数据格式SLPK(scene layer package)。SLPK 格式优化了BIM 模型的数据存储和树形结构,相较于其它三维数据格式,其在Arcgis客户端进行加载时更加高效。目前铁路行业应用较广的Blender、3DMax、Revit 等三维设计软件无法直接导出SLPK格式的模型供Arcgis 使用,但可以支持glTF 格式的导出[1]。本文通过研究glTF 格式数据组织结构,并基于SharpGLTF和i3s 等开源库进行二次开发,实现了三维模型从glTF 格式到SLPK 格式的转换。同时为了更方便地在Arcgis 中使用三维模型,在转换过程中可以支持将模型导出为Web 墨卡托坐标或经纬度坐标。其转换流程如图1 所示。
图1 模型转换流程
glTF(GL Transmission Format)是一种基于JSON 的三维模型文件格式,具有通用性强和数据解析简单的特点,目前绝大多数主流三维设计软件都支持对该格式的加载和导出。glTF 文件有两种后缀格式可以选择,.gltf 和.glb,其中.glb 是glTF 格式的二进制表示形式。
glTF 的数据组织结构主要包括JSON 文件和关联外部数据文件,具体来说外部数据文件包括图像文件、GLSL文件和bin 文件[2]。如图2 所示。
图2 glTF 数据组织结构
JSON 文件是glTF 数据的核心部分,文件中记述了模型相关的场景信息及数据的索引信息。JSON 文件由一系列的元素节点构成,其中scenes 和nodes 元素描述了模型场景的基本结构和层次信息,meshes、textures、materials 和images 等元素描述了场景中三维模型的几何和材质纹理信息,buffers、bufferviews 和accessors 等元素描述了模型的数据类信息。各元素之间的引用关系如图3 所示[3]。
图3 元素引用关系
要实现三维模型从glTF 格式到SLPK 格式的转换,首先需要将三维模型的相关属性信息从glTF 模型中提取出来[4]。这些属性包括三角面片信息、顶点位置信息、顶点纹理坐标、纹理贴图信息、模型材质信息、法向量信息等。为了方便存储以上属性信息,在程序中定义了一个数据存储类ModelData,其中MeshData 类用来存储模型的三角面片信息,VertexData 类用来存储模型的顶点信息,Point3D 和Point2D 类分别用来存储三维点和二维点信息,其类图如图4 所示。
图4 ModelData 类图
程序中对glTF 文件的加载和属性提取可以借助于现有的一些比较成熟的开源库进行。SharpGLTF 是一款轻量级的glTF 模型处理开源库,支持对glTF 模型的读写,可以满足提取模型属性的需求。在使用SharpGLTF 对glTF 模型进行属性提取时需要注意以下几点:①在加载glTF 模型后应调用SharpGLTF 部分原生接口直接获取模型的三角网列表信息,这样可以方便模型属性的提取;②从glTF模型中获取的颜色值需要乘255 以获取其真实的RGBA信息;③获取到模型的顶点Position 信息后,可以根据需要将其处理为Web 墨卡托坐标或经纬度坐标,这样在导出为SLPK 模型后,模型就可以适配相应坐标系。
SLPK 模型文件属于一种数据压缩包文件,解压后可以看到其有一系列的JSON 文件和二进制文件组成,JSON文件和二进制文件均使用gzip 压缩。其中3DSceneLayer.json 描述的是整个模型场景的信息,如模型的图层类型、参考坐标系和材质及纹理定义信息等。nodes 目录存放“节点”信息,每个文件夹代表一个模型节点。nodePages 目录存放“节点页”信息[5]。
完成glTF 模型属性提取,基于获取的ModelData 对象和i3s 开源库就可以导出生成SLPK 三维模型了。
创建Layer_write 部分代码如下所示:
上述代码中配置的Layer_meta 信息最终会写入的SLPK 数据文件中的3DSceneLayer.json 文件中。代码中wkid 表示要生成的模型的坐标系类型,我们可以通过配置wkid 的值来使模型使用不同的坐标系。其中wkid=3857 表示当前模型使用的坐标是Web 墨卡托坐标,wkid=4326 表示当前模型使用的坐标是经纬度坐标。
遍历ModelData 中的MeshList,实例化i3slib::i3s::Simple_raw_mesh raw_mesh 对象,并将前面获取的MeshData 中的顶点坐标、法向量、纹理坐标,纹理贴图和颜色依次赋值给raw_mesh.abs_xyz、raw_mesh.normals、raw_mesh.uv、raw_mesh.img 和raw_mesh.colors。之后再依次调用i3sLayerWriter 对象的create_mesh_from_raw ()和create_node()函数创建mesh 节点。对于SLPK 格式,每个模型节点下都有一个node_depth 属性,其值表示节点的层级。mesh 节点的node_depth 设置为1。
调用i3sLayerWriter 对象的create_node () 函数创建root 节点。root 节点的node_depth 设置为0,并将上一步创建的mesh 节点挂载在root 节点下。
调用i3sLayerWriter 对象的save()函数输出SLPK 文件。由于SLPK 是一种数据压缩包文件,一般情况下同一个三维模型,其SLPK 文件的存储大小要小于其glTF 文件,这从而也提高了SLPK 模型在程序中的加载效率。如图5 所示。图6、图7 分别是转换前glTF 格式的三维模型和转换后SLPK 格式的三维模型。
图5 glTF 文件与SLPK 文件对比
图6 原始glTF 格式三维模型
图7 转换后SLPK 格式三维模型
在基于Arcgis 平台三维可视化选线系统中,为了更直观的显示线路设计效果,需要沿铁路线加载路基、隧道、站场和桥梁等三维BIM 模型。但目前已有BIM 模型都为glTF 格式,当加载模型过多时会出现场景卡顿等现象,而Argis 对SLPK 模型的的加载调动机制较好,故可以将glTF 模型统一转换为SLPK 格式进行加载以解决大场景加载问题。同时由于在glTF 格式向SLPK 格式转换过程中,我们已经将模型的相对坐标转换为了Web 墨卡托坐标或经纬度坐标,在加载模型时不需要再对模型进行定位摆放,可以进一步可以优化模型加载效率,并且加载后的模型位置定位准确且与地形的贴合度也较好。图8 为转换后的SLPK 模型在基于Arcgis 的铁路选线系统中的展示效果。
图8 站场模型展示效果
通过探索和研究,本文创新性通过对SharpGLTF 和i3s 等开源库进行二次开发,解决了三维BIM 模型由glTF格式到SLPK 格式的转换问题。在铁路行业广泛的存在着大量辅助设计的glTF 格式的三维模型,利用本文方法既可以单独提取模型信息进行辅助设计,也可以进行模型格式的转换,拓展模型的应用范围,提升大场景模型加载效率。故该项技术在铁路行业也有着广泛的应用前景[6]。