在具体介绍山海鲸团队如何实现对高斯泼溅模型进行切片并在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.1和3dtiles1.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官方文档中的格式:
点击查看代码
{"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的加载。