3DTiles生产流程与规范

一篇19年整理的比较老的笔记了。更多精彩内容尽在数字孪生平台

瓦片切分

标准的四叉树切分对于均匀分布的地理数据切片非常有效,但是这样均等的切分不适用于随机分布、不均匀分布的地理数据,当地理数据稀疏分布的时候,均等的四叉树就不再高效,此时可以考虑用紧凑的包围盒代替均等的包围盒。

此外,对于上述稀疏不均匀分布的地理数据,还可以用KD树的切分方法。KD树的方法需要设置最大深度d。具体切分步骤如下:

(1)选择一个坐标轴,作为本次切分的基础坐标轴,计算所有几何体在该坐标轴上的中心值。

(2)以该中心值为界限将整个区域分为两块子瓦片,同时几何体也分为两组,分别划入子瓦片中。

(3)针对子瓦片重复上述操作,每次切分时旋转一次坐标轴作为新的基础坐标轴,每次切分相当于树结构的深度增加一层,当树的深度大于d时停止切分。

KD树会将区域中的几何体分为两部分,所以这种方法生成的树结构具有较好的均衡性,也就是子瓦片中的几何复杂度都相对均匀。但是因为切分的的子瓦片只有两份,所以会产生相对较深的树结构,不适合大型数据集的切分。

倾斜摄影或点云建模

一切工作的开始是确定采集范围,根据采集范围创建索引并分割采集区域,创建索引得到索引树,分割区域得到瓦片包围盒的经纬度范围,同时根据既定的文件组织结构对保存各区域数据的瓦片文件命名。

接下来按照采集区域进行采集,在采集过程中,可以一次性采集区域中多个建筑,或者使用设备逐个采集,这样得到的可能是包含多要素或单要素的格网模型。因为三维格网是有环境噪声的,所以需要用去噪方法将其中表示为建筑物的部分提取为要素化的三维模型。如果前面的采集对象为单体建筑物,则需要通过模型合并集中单体模型到一起,即合并成包含多个建筑物要素的模型文件。

多要素模型向下要得出多个参数:一是根据多要素模型文件中的高度范围补充之前瓦片包围盒缺少的高度信息,二是将多要素模型通过地理坐标转换得到瓦片内数据的包围盒(进一步得到整个瓦片数据的地理坐标),并根据空间一致性检查修正瓦片包围盒,对模型超出的边界进行扩张,进而扩张父节点包围盒边界。三是根据对几何体误差的规定计算当前模型文件的几何体误差。四是将多要素模型转换为gltf格式,根据既定的局部框架,可以将局部矩阵集成到gltf中或者放到瓦片元数据中。

最后进行数据装配:一是要把多要素gltf结合属性数据组装为瓦片数据文件b3dm,二是把瓦片文件url、包围盒、数据包围盒、几何体误差以及可能作为参数的瓦片地理位置转换的局部框架矩阵组装成瓦片元数据。三是把瓦片元数据与索引树构造为对应的JSON树,用来构建tileset.json文件。最后完成构造3DTiles的所有工作。

地理要素数据集建模

首先数据源为地理要素数据集,坐标为WGS84坐标系,然后通过投影转换工具得到投影坐标系下的要素数据集。地理坐标系统下的要素数据集用来构建瓦片索引和分割区域,可以得到索引树、瓦片url、瓦片包围盒、数据包围盒。投影坐标系下的要素数据集用于接下来的要素化建模,在区域分割的同时对投影坐标系下的要素按照区域分组,获得与区域对应的要素组,对每一组要素集计算几何体误差。

将要素组导入到建模软件中,根据建筑物的高度以及纹理图片进行建模。可以构建多要素的模型或者单要素的模型,若进行单要素建模则需要再进行模型的合并。

然后将多要素模型通过格式转换成多要素gltf,再将其和要素组中的属性数据一起组装成瓦片文件b3dm。同时,瓦片url、瓦片包围盒、数据包围盒、几何体误差构成瓦片元数据,与索引树一起构成JSON树,并写入tileset.json文件中,最后形成完成的3DTiles。

地理要素数据的3DTiles生产

3.1 下载shp数据,对属性数据进行补齐,增加建筑物高度字段。

3.2 利用ArcGIS对shp数据进行投影变换。

3.3 将整个区域根据LOD准则进行划分(一般选取四叉树分割),选取一些大型或标志性建筑作为根节点,然后根据四叉树分割的四块区域作为根节点的子节点进行存储。这样就相当于生成了5个shp文件,然后进一步得到tileset.json文件。

3.4 将包含部分地理要素的shp文件导入到建模软件中建模。首先将划分后的shp文件导出为CAD文件,然后将CAD文件在3ds MAX中加载。因为加载到3ds MAX中的CAD是以线的形式存储的,所以需要将线转换为可编辑多边形。之后通过编组、平移、解组的方式将所有数据移动到坐标原点附近,这样操作的目的是使瓦片模型数据采用局部空间直角坐标框架。对模型的构建主要使用面的挤出功能,同时使用高清照片进行贴图。建模完成后还要将要素的id编辑到场景下对应的根节点名称中,用于后面的_BATCHID的添加与属性数据的

3.5 接下来是进行b3dm瓦片的转换。首先将3ds Max建模后的模型数据导出成obj文件,然后将obj文件转换成glb文件,再将glb与属性数据根据场景根节点预先记录的id号进行映射,构造b3dm。最后,将b3dm按照tileset.json中的url放置到指定文件位置,至此3DTiles构建完成。

相关推荐
大佛拈花13 小时前
Godot学习-3D基本环境设置以及3D角色移动
学习·3d·godot
好脾气先生13 小时前
[论文解析]Mip-Splatting: Alias-free 3D Gaussian Splatting
人工智能·计算机视觉·3d·三维重建
sunbyte16 小时前
Three.js + React 实战系列-3D 个人主页:构建 Hero 场景组件(项目核心)✨
3d
广州华锐视点18 小时前
广州 3D 展厅开启企业展示新时代
3d·3d展厅
在下胡三汉1 天前
来自 3D 世界的 JPEG。什么是 glTF?什么是 glb?
3d
Mapmost2 天前
【数据可视化艺术·应用篇】三维管线分析如何重构城市“生命线“管理?
3d·信息可视化·性能优化·demo
陈小峰_iefreer2 天前
stone 3d v3.3.0版本发布,含时间线和连接器等新功能
3d·webgl·metaverse·cadcg
子燕若水2 天前
“Daz to Unreal”将 G8 角色(包括表情)从 daz3d 导入到 UE5。在 UE5 中,我发现使用某个表情并与闭眼混合后,上眼睑出现了问题
3d·ue5
zhu_zhu_xia3 天前
JS通过GetCapabilities获取wms服务元数据信息并在SuperMap iClient3D for WebGL进行叠加显示
javascript·3d·webgl
在下胡三汉3 天前
3dmax模型怎么处理3dtiles,制作制作B3DM格式文件
3dtiles