山海鲸可视化

GIS融合之路(八)-如何用Cesium直接加载OSGB文件(不用转换成3dtiles)

系列传送门:

山海鲸可视化:GIS 融合之路(一)技术选型 CesiumJS/loaders.gl/iTowns?

山海鲸可视化:GIS 融合之路(二)CesiumJS 和 ThreeJS 深度缓冲区整合

山海鲸可视化:GIS 融合之路(三)CesiumJS 和 ThreeJS 相机同步

山海鲸可视化:GIS 融合之路(四)如何用 CesiumJS 做出 Cesium For Unreal 的效果

山海鲸可视化:GIS 融合之路(五)给 CesiumJS 加上体积云(Volumetric Cloud)和高度雾(Height Fog)

山海鲸可视化:GIS 融合之路(六)-Cesium 的雨雪风雷电效果

山海鲸可视化:GIS 融合之路(七)-Cesium 实现夜空月亮星星渲染

本来觉得这个系列已经结束了,最近山海鲸研发了一个新产品-GISBox,研发过程中遇到了一个新的问题,那就是如何在 Web 中直接加载 OSGB 文件。

这里先说下 GISBox 项目的背景,我们在做倾斜摄影项目的过程有大量需要编辑 OSGB 模型的需求,但目前市面的产品要么就是产品功能单一,要么就是连试用都无法试用。我们希望打造一款真正业内愿意使用,也能一站式的搞定从 OSGB 编辑,转换,切片,分发完整链路的产品,这样 GISBox 就诞生了,目前产品正在快速完善中,大家可以下载体验:

GIS 工具箱(GISBox)-免费的倾斜摄影 OSGB/3Dtiles 编辑转换发布平台

当然我们这篇文章并不打算介绍 GISBox 的研发内容,而是因为在 GISBox 中,我们要做 OSGB 文件的编辑。但 OSGB 如何直接加载呢?我们先看下 OSGB 文件的基本结构:

OSGB 文件目录结构和文件内容结构

当然这张图对于 osg::Group 下面的 osg::Geometry,osg::Texture2D,osg::DrawElement 等等的元素没有进行描述,实际的文件结构要复杂的多,其中 osg::PagedLOD 上还存储了 LOD 不同计算方式和子文件地址的指向。

了解了文件的结构,那么问题来了。用什么库来加载呢?经过调研,我们发现了以下几种方案:

1. OSGViewer 开源项目

最常见的做 OSGB 编辑的软件都是直接用 OpenSceneGraph 这个库里的 OSGViewer 开源项目来改的,这种方案的优势是 OSGB 的读取和渲染都无需自己写,只要在开源项目的基础上添加功能即可。但是这个方案的缺点也很明显,首先这个库是一个几乎 10 年前就停止维护的老库,渲染甚至还采用了 OpenGL1.0 的标准,想要在视觉上做一些调整几乎不可能。同时了解山海鲸的朋友应该知道,我们山海鲸创立了 CS/BS 动态切换的软件架构,我们所有的软件都可以既当作纯软件使用,也可以转换为服务器,变成内网协同的 Web 系统来使用。而 OpenSceneGraph 这套代码很难跑在 Web 上。

关于山海鲸的 CS/BS 切换,大家可以移步看下这个视频:

【山海鲸可视化 CSaaS 功能演示】实现 BS/CS 架构一键热切换

2. osg-serializer-js 开源库

这个库应该是目前 Github 上唯一一个可以直接解析 OSGB 的 JS 库了,好心的作者根据 OpenSceneGraph 的 C++版本写了一套 js 的版本。我们试用了一下,基本的功能还是实现的不错的,基本可以将 OSGB 的文件很好的加载进来。这个库的优点是可以方便的在 Web 上使用。问题也很明显,兼容性略显不足,有些 OSGB 文件不支持。作者自己也说了不再维护这个库,推荐直接编译 OpenSceneGraph 的 wasm。而且渲染端也是需要自己写的。

3. OpenSceneGraph 编译 WASM

根据第 2 条中提到的作者说的方案,我们做了直接的 OpenSceneGraph 的 wasm 编译。这个方案优点是兼容性好,且可以直接在 Web 中使用,缺点呢主要是和前端代码的整合。我们最初使用这套方案时,是通过修改 Ceisum 中 3dtiles 渲染逻辑直接来渲染加载进来的 osgb 的,但因为 OpenSceneGraph 中使用 NodeVisitor 的逻辑,需要去继承 C++的库,同时需要同时处理 C++和 JS 之间的类通信问题。代码上需要进行较为复杂的处理。

4. 自己写 OSGB 解析库

上面这三种方案各有各的优缺点,虽然我们采用第 3 条方案,成功地在 Cesium 中显示了 OSGB,且可以正常的有 PagedLOD 的逻辑。但前文也说了,这个方案的问题是整个项目难以维护,需要同时维护 C++和 Cesium 两端的代码,另外通信部分也较为复杂。因此最终我们放弃了这套方案,而是选择了一条根据 OpenSceneGraph 开源库完全重写一套自己的 OSGB 的 TS 库的方案,这个方案的显然是最直观的方案,但也是成本最高的方案。

完成了这套库后,我们处理了 InputStream 和 Buffer 的兼容性,实现了在 Web 上和软件中可以同样逻辑打开 OSGB 并显示的方案。另外将来也可以进一步去升级渲染效果和直接对 OSGB 的顶点数据直接进行修改,大家可以简单看下加载的效果,可以发现虽然相比 C++的 OSGViewer 来说加载速度略有下降,但考虑到可以直接在 Web 上加载和编辑,也可以叠加我们系列文章中提到的大气云层效果,最终呈现已经很让人满意了:

大家也可以直接下载 GISBox 体验一下效果:

GIS 工具箱(GISBox)-免费的倾斜摄影 OSGB/3Dtiles 编辑转换发布平台