山海鲸可视化

高斯溅射和GIS融合之路- 将splat文件切片成3dtiles

在具体介绍山海鲸团队如何实现对高斯泼溅模型进行切片并在 Cesium 中渲染之前,我们先来回顾一下之前系列文章中的一些内容。

之前写了很多关于山海鲸整合 GIS 的文章,简单来说就是通过深度 Buffer来实现Web 游戏引擎和 Cesium 引擎的深度结合,再叠加种种的天空特效,最终在 Web 上实现了令人满意的效果:

大家可以直接下载山海鲸软件并创建GIS 模板项目就可以感受最终的使用效果,对技术实现感兴趣的同学可以在 GIS 专栏中找到更多的技术细节和研发历程:

**GIS****融合之路**系列文章传送门:

GIS 融合之路(一)技术选型CesiumJS/loaders.gl/iTowns?

GIS 融合之路(二)CesiumJS 和 ThreeJS 深度缓冲区整合

GIS 融合之路(三)CesiumJS 和 ThreeJS 相机同步

GIS 融合之路(四)如何用 CesiumJS 做出 Cesium For Unreal 的效果

GIS 融合之路(五)给 CesiumJS 加上体积云(Volumetric Cloud)和高度雾(Height Fog)

GIS 融合之路(五)番外-山海鲸的体积云又又又升级了

GIS 融合之路(六)-Cesium 的雨雪风雷电效果

GIS 融合之路(七)-Cesium 实现夜空月亮星星渲染

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

同时为了能够加载更全的格式,我们也开启了对于加载高斯溅射格式的研发,具体可以参考高斯的专栏文章:高斯溅射(3dgs)整合之路

言归正传,Gaussian Splatting 技术被提出之后,在某些方面确实优于传统的实景建模。深究技术细节的话,3DGS 和传统实景建模的第一步相机位姿识别和稀疏点云的建立都是类似的,而在后续的建模过程中 3DGS 巧妙的使用3D 高斯分布这个工具,实现了通过神经网络来优化最终的建模效果。这样建模的结果的清晰度和还原度大部分时候都会好于传统实景建模出来的效果,我们来看一个 3d 高斯生成的模型效果:

可以看到 3D 高斯对于铁塔这种有很细的模型的还原效果是大幅好于传统实景建模的。

但因为 3D 高斯是一个非常新的技术,目前对于大范围的高斯模型而言,还无法像 3dtiles 一样能够分片分层在 Cesium 加载,因此一定程度限制了 3d 高斯在 gis 场景中的应用。山海鲸团队希望能够在工具链和 Cesium 渲染两个层面来解决 3D 高斯的这个短板,让 3D 高斯能够真正能够进入 Cesium 生态。

那么下面我们也分为两个部分来详细介绍一下技术实现路径:

1.Cesium 中加载支持高斯泼溅的 3dtiles

首先,Cesium 目前能够加载的 3dtiles 有两个格式,分别是3dtiles1.13dtiles1.0,其中 3dtiles1.0 支持的格式以下几种:

**(**1**)****b3dm**:批量化的三维模型,适用于异构模型,如纹理地形或 3D 建筑

**(**2**)****i3dm**:实例化的三维模型,适用于同一个三维模型的多个实例,如树木或灯柱

**(**3**)****pnts**:点云,适用于激光扫描或摄影测量产生的点数据

**(**4**)****cmpt**:复合瓦片,适用于将多种瓦片格式组合在一起的情况

**(**5**)****glb**:gltf 的二进制格式

因此在我们最初提出要将 3d 高斯转成 3dtiles 时,我们的方案是扩展 3dtiles1.0 的格式,扩展出一个 splat 格式。再对 Cesium 源码进行修改,让 splat 文件像是其他格式一样解析和渲染即可。然而在仔细查看 Cesium 源码后发现,Cesium 对这里的扩展支持相当弱,真的要改会涉及大量对 Cesium 架构的调整,这样做是得不偿失的,因此团队就放弃了这个方案。

那么我们再来看看 3dtiles1.1, 3dtiles1.1 完全采用 gltf 和其扩展来实现所有格式的渲染,因此我们只需要对 gltf 进行扩展即可实现高斯的加载,在技术选型过程中,发现 Cesium 团队不仅提出了一个 gltf 的高斯扩展 KHR_gaussian_splatting

更加令人惊喜的是 Cesium 团队甚至已经实现了这套扩展在 Cesium 中的加载,只是因为这个 KHR_gaussian_splatting 还没有正式成为标准的扩展,一直在一个独立的分支当中。

可以看到这个分支一直在和 main 分支的更新保持同步,因此我们可以直接 clone 这个分支然后来加载支持 KHR_gaussian_splatting 的 3dtiles。

2.PLY/Splat 文件切片成 3dtiles

既然支持 KHR_gaussian_splatting 扩展的 3dtiles 的渲染问题 Cesium 已经解决了,那我们只需要实现高斯泼溅模型的切片输出即可。熟悉我们的朋友应该知道,山海鲸团队推出了一款一站式 3D GIS 软件–GISBox,可以实现各种模型转成 3dtiles,也可以进行顶层重建。而 3D 高斯本质就是一个点云升级版,因此我们只需要参考 las 转 3dtiles 的模式将 ply/splat 文件切片成 3dtiles,并同时生成不同的 lod 级别即可。在这个点云 3dtiles 的基础上,我们还需要根据 KHR_gaussian_splatting 扩展的要求,将 3d 高斯模型中的几个独特的属性写入到 attribute 中既可,具体可以参考 KHR_gaussian_splatting 官方文档中的格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
{
"accessors": [
{
"type": "VEC3",
"componentType": 5126
},
{
"type": "VEC4",
"componentType": 5121,
"normalized": true
},
{
"type": "VEC4",
"componentType": 5126
},
{
"type": "VEC3",
"componentType": 5126
}
],
"meshes": [
{
"primitives": [
{
"mode": 0,
"attributes": {
"POSITION": 0,
"COLOR_0": 1,
"_ROTATION": 2,
"_SCALE": 3
}
}
]
}
]
}

如此我们就可以将 splat 文件切片成支持 KHR_gaussian_splatting 的 3dtiles 了。我们最后对上一节中提到的 splat-shader 分支进行编译,在其本地 Sandcastle 上运行后可以看到 3d 高斯的 3dtiles 已经被正确的渲染出来了:

目前 ply 格式和 splat 格式的切片功能已经整合到了 GISBox 当中,大家可以前往官网下载测试切片效果:

再次提醒只有 splat-shader 分支的 Cesium 可以加载 GISBox 中 3d 高斯的切片结果,大家一定要去 Github 上拉取正确的分支编译后进行加载。山海鲸也将在后续版本中支持高斯 3dtiles 的加载。