3DTiles介绍 3DTiles是一种面向网格化、可展示的大规模三维空间数据格式,专门为流式传输和渲染海量3D地理空间数据而设计的,用于存储和管理基于网格的三维模型数据。 3DTiles具有以下特点: 支持大规模、高精度的三维模型数据展示。 采用标准的json格式描述数据结构和元数据。 使用DRACO和LZMA等压缩算法,提高数据传输和存储效率。 3DTiles数据结构 在3DTiles中,一个瓦片集(Tileset)是由一组瓦片(Tile)按照空间数据结构(树状结构)组织而成的,它至少包含一个用于描述瓦片集的JSON文件(包含瓦片集的元数据和瓦片对象 在3DTiles数据结构,Tileset(瓦片集)是3DTiles的主要管理单元,包括Tileset全局信息、Tileset资源路径、Tileset根Tile等。 Cesium中与3DTiles相关的类 1.Cesium3DTileset类 Cesium3DTileset类是3DTiles数据的主要管理类,负责加载和渲染Tileset。
在Cesium的自带示例3D Tiles Photogrammetry中,展示的摄影测量3DTiles数据是通过Cesium Ion上托管的,只需要相应的编号就可以了。 实际生产中的3DTiles数据可以通过像ContextCapture这样的三维建模软件得到,然后通过Cesium本地加载。 2. /dayanta/tileset.json" }); viewer.scene.primitives.add(tileset); viewer.zoomTo(tileset); 可以看到这里通过3DTiles 但与加载glTF模型不同,加载3DTiles需要将其加入到场景类(viewer.scene)的图元集合对象(primitives)中去。 图元类(Cesium.Primitive)也就是场景中的几何图形,Cesium应该是将3DTiles作为图元展示在场景中。 3. 结果 最终运行结果如下所示,展示了西安大雁塔景区的模型: ?
,在上篇博文中,我从网络上下载了一个osgb格式的三维模型,如果需要导入到Mars3D之中,需要转换成3DTiles形式。 倾斜摄影:一般是无人机拍摄,拍摄的数据通过建模工具ContextCapture Cente等建模软件可以直接导出3DTiles格式。也可以通过osgb通用格式转3DTiles格式后在平台中使用。 人工建模:数据来源于3dmax、Maya等建模软件建模,建好的三维模型导出为dae和obj数据后,再转换为3DTiles数据格式。 osgb->3DTiles 经过调研,osgb转3DTiles的免费方式主要有3dtile和osg2cesiumApp两款工具,这两款工具生成的结果略有区别,个人推荐使用3dtile 3dtile官方仓库 :https://github.com/fanvanzh/3dtiles 3dtile通过命令来使用,非常便捷。
作者:迷途的小书童 微信公众号:g0415shenweri 转载声明 3dtiles协议具备了超大规模的数据加载调度的能力。本人分析了cesium的源码,结合自己的理解总结了一下加载调度的实现。 3dtiles的数据结构 3dtiles是金字塔状的层次结构,最上层是不太精细的数据,越到下层模型数据越精细,渲染成本越高。一般根据视口离tile的远近来加载不同的层级。 ? 3dtiles的调度 整个3dtiles的调度,其实就是不停的去计算当前视口哪些tile可以被渲染的过程。我简化了部分不重要的逻辑,切换到重点,画了下面的流程图: ? 3dtiles的内存回收 我们不可能把所有的tile的数据都存储在内存里面,机器的内存是有限制的,我们也不能这么做。所以我们要把在没有在渲染状态的数据回收掉。 3dtiles的数据请求 前面将的状态都是在说渲染状态,我们的数据何时被请求呢?这里由于比较简单,我就放在最后说了。当我们的tile的状态变成Rendered的时候,会触发数据请求命令。
},});// 从 URL 加载 3D Tilesconst tileset = engine.add(new mapvthree.Default3DTiles({ url: 'data/3dtiles const tileset = engine.add(new mapvthree.Default3DTiles({ url: 'data/3dtiles/tileset.json', errorTarget const tileset = engine.add(new mapvthree.Default3DTiles({ url: 'data/3dtiles/tileset.json', loadSiblings 其他性能参数还有一些高级性能参数:const tileset = engine.add(new mapvthree.Default3DTiles({ url: 'data/3dtiles/tileset.json ;// 从 URL 加载 3D Tiles,配置性能参数const tileset = engine.add(new mapvthree.Default3DTiles({ url: 'data/3dtiles
对于大规模城市场景,在cesium端流行的方法是,使用工具将GIS数据shp建筑白模或geojson白模直接转换成3dtiles格式。然后使用着色器代码对白模贴图,常见的就是渐变色贴图效果。 因为shp直接转换3dtiles并没有屋顶结构。现在面临的问题,客户要求1、没有无人机倾斜摄影数据,直接基于白模贴图2、能部分独立贴图,部分批量贴图,贴图要能反应建筑纹理。 4、能导出3dtiles格式,和地理对齐5、能在3dtiles中拾取任意楼栋buffer被拉满了。我们来尝试解决。下图是上海市60w+建筑数据其中部分建筑使用了独立的材质贴图,和设置了屋顶结构。 第二步,在导出后生成倾斜摄影的索引文件tileset.json文件.3dtiles是cesium推出的数据标准,支持直接将gltf模型作为切片加载。 同时导出了基于cesium的3dtiles加载和单体化拾取建筑代码 。代码中详细注释了cesium点击事件,楼栋单体化高亮代码。
仅加载当前观测所需数据,大幅降低初始加载压力与内存占用动态适配:根据观测视角、交互操作实时调整加载/卸载策略,适配不同设备性能优先级可控:核心区域、高频交互区域优先加载,保障核心场景体验兼容性强:适配3DTiles 闲置数据卸载率≥80%渲染帧率加载过程中帧率≥25fps;稳定渲染≥30fps数据利用率加载数据利用率≥90%(避免无效加载)3.工程化处理流水线3.1输入要求场景数据:已轻量化、LOD分级处理的模型(3DTiles )空间分区与索引参数瓦片大小:50m×50m(高精度场景)、100m×100m(大规模场景);瓦片重叠率≤5%空间索引:四叉树(2D场景)、八叉树(3D场景);索引深度4-6级,确保检索效率分区格式:3DTiles 阈值降至15s;内存≥90%时,阈值降至5s卸载优先级:低优先级区域(非核心)>远距离区域>低LOD层级数据内存保护阈值:内存占用≥95%时,强制卸载低优先级数据,确保系统稳定3.4输出结果分区场景数据:3DTiles 优先预加载相邻瓦片;优化加载调度逻辑5.常见问题解决方案问题根因量化解决方案初始加载时间过长初始加载范围过大或数据未压缩初始加载仅保留核心1个瓦片+全局轮廓;启用Draco压缩,数据体积压缩70%;优化3DTiles
2.工程化核心特性与指标2.1核心特性精度可控:轻量化过程可设置误差阈值,确保核心细节不丢失兼容性强:适配各类模型格式(OBJ、PLY、glTF、3DTiles),支持批量处理效率优化:渲染速度提升50% )数据压缩:顶点/纹理/法向量量化编码(Draco),剔除冗余数据,压缩存储体积LOD分级:生成3-5级精度模型,设置距离阈值,关联各级模型切换逻辑格式优化:转换为数字孪生适配格式(glTF/GLB、3DTiles 距离阈值:LOD1(最高)≤5m;LOD2≤15m;LOD3≤30m;LOD4≤50m(按需调整)切换平滑:过渡阈值=5%(避免切换卡顿);渲染优先级=高级别优先3.4输出结果轻量化模型:glTF/GLB/3DTiles 核心区域纹理分辨率保留4096×40966.数字孪生集成规范输入:优化后原始模型(网格/点云)、精度要求、部署需求中间:简化模型、压缩参数、LOD分级文件、精度验证报告输出:轻量化模型(glTF/GLB优先、3DTiles
过渡方式:透明度渐变(过渡时间100-200ms),避免跳变渲染优先级:LOD0>LOD1>LOD2>LOD3>LOD4,近距离优先渲染高级别3.4输出结果LOD模型集:3-5级精度模型(glTF/GLB/3DTiles 优化模型渲染结构远距离模型轮廓失真0.5-1.5mm最简级LOD保留核心轮廓;调整简化参数,避免轮廓扭曲;手动修正轮廓顶点分级过多导致加载缓慢加载时间>5s减少分级数量至3-4级;优化模型格式(glTF/3DTiles 启用模型压缩(Draco)LOD切换误触发、频繁切换触发条件不合理视角夹角触发阈值70°;设置切换冷却时间500ms;优先距离触发,距离阈值微调±1m加载缓慢、内存占用过高模型格式未优化或分级过多转换为3DTiles 减少分级至4级;启用预加载与内存缓存6.数字孪生集成规范输入:优化后原始模型、精度要求、场景观测距离范围、渲染需求中间:各级LOD模型、分级参数、切换逻辑配置、验证报告输出:LOD模型集(glTF/GLB/3DTiles
UE在场景范围不大,通常采用投影后的平面坐标系,比如固定左下角点为原点,但GIS中的场景范围通常比较大,很多数据,比如3DTiles采用的是RTC(relative to centre)的方式,每一份数据都有自己指定的原点 是否支持全球范围的浏览(涉及到地形调度部分的代码是否已经在UE4中支持,多个城市之间的3D Tiles数据是需要手动添加再飞到具体位置,还是直接浏览对应位置自动添加该数据,后者需要有一个全球级别的根节点来负责3DTiles 前几年的工作是与Cesium相关,一路下来,也算是见证了3DTiles的发展。 3DTiles申请OGC标准也比ESRI的I3S早,个人认为,两者技术上都是解决一类问题,只是前者注重里(技术),后者注重表(规范),而i3S最早成为OGC的标准,2017还是2018年,我看了OGC邮件组对
这个库无法使用,而且缺少问题 网址二:https://github.com/CesiumGS/3d-tiles-validator 这里的工具可以验证自己导出的3dtiles的格式是否正确 网址三:https gltf的格式是否正确 网址四:https://github.com/CesiumGS/3d-tiles-validator/tree/master/samples-generator 这个工具可以自动生成3dtiles
指数衰减至1e-4),训练步数5000-20000采样参数:分层采样层数128,早期终止阈值1e-43.4输出结果中间结果:训练快照、深度图、法向图最终结果:PLY网格+PNG纹理、glTF/GLB(推荐)、3DTiles 0.3-0.8,增加表面提取采样密度6.数字孪生集成规范输入:JPEG影像、相机参数(JSON)、COLMAP稀疏重建结果中间:训练快照、深度图、法向图输出:glTF/GLB(优先)、PLY网格+纹理、3DTiles
2.工程化核心特性与指标2.1核心特性高效检索:快速定位空间数据,支撑流式加载、碰撞检测、空间查询动态适配:支持数据新增、删除、更新,索引动态重构,适配场景迭代兼容性强:适配点云、网格、3DTiles瓦片等各类数字孪生数据 动态更新单条数据更新时间≤0.1ms;批量更新(1000条)≤100ms空间利用率索引节点空间利用率≥70%,无大量冗余节点3.工程化处理流水线3.1输入要求空间数据:点云(PLY/PCD)、网格模型(OBJ/glTF)、3DTiles 空间索引文件(JSON/BIN)、配置文件、检索接口文档坐标:与场景数据一致,右手系,Y轴向上,单位米,统一EPSG:4490(CGCS2000)数据要求:索引检索时间≤1ms,内存占用≤2GB;索引结构适配3DTiles
同类标准3dtiles/gltf与s3m 既然说到标准,就不得不提一下同类竞争对手。 cesium是一个做3dWebGIS的api,主推的标准是3dtiles/gltf,主要资料如下: https://github.com/KhronosGroup/glTF https://www.khronos.org s3m是我国推动的三维地理数据标准,主要由超图等公司建设设计,主要资料如下: https://download.csdn.net/download/cRGBc/12082994 gltf/s3m/i3s/3dtiles 我了解的不多,甚至不了解gltf和3dtiles的关系,但是它们的共同特点是:都使用树结构描述一个三维数据(不一定是地理数据),都使用json文件描述数据,都使用二进制文件存储数据。 三维标准博客展望 未来,笔者还要更精细地研读i3s,尽快学习3dtiles和gltf标准,简单了解s3m标准。 不仅仅要在文档、类结构上熟悉,还要尽可能地利用这些开源标准来获取这些数据。
viewer.scene.primitives.add(tileset); tileset.readyPromise.then(function () { viewer.zoomTo(tileset); }); 可以看到添加3DTiles
我们参考cesiumgs的3dtiles的设计格式进行设计。
在Cesium中,3DTiles就相当于一个Primitive的位置。 3D Tile表述 当我们创建一个Cesium3DTileset后,每一个Tile对应一个Cesium3DTile。 这样,在初始化阶段,Cesium3DTileset中就保存了该3DTiles树上的所有节点及关联,当然此时只是属性信息,并没有加载数据内容,所以内存上还是可以接受。
TextureMeshscene_mesh.mvs-oscene_textured.mvs--resolution40963.43DTiles格式转换(系统集成关键步骤)将OpenMVS输出的OBJ模型转换为OSGB格式使用Cesiumion或FME将OSGB转换为3DTiles JPEG/PNG影像、RTK轨迹数据(POS格式)、地面控制点数据(CSV格式)中间数据格式:COLMAP稀疏点云(BIN/TXT)、OpenMVS密集点云(PLY)、三角网格(OBJ)输出数据格式:3DTiles
,块大小≤500m×500m重建速度慢分辨率过高分辨率级别设为2,最大分辨率10246.数字孪生集成规范输入:COLMAP稀疏重建结果(BIN/TXT)、JPEG影像中间:PLY点云、OBJ网格输出:3DTiles
Mars3D提供的Javascript API,可以实现以下功能:1)三维场景可视化:提供多种时空数据,包括影像、高程、矢量、实景、三维模型等各类数据的叠加融合、支持包括OGC、TMS、MapBox、3DTiles