它是Cesium于2016年3月定义的一种三维模式瓦片数据结构,它将海量的三维数据用分块、分层的形式组织起来,很大程度上减轻了浏览器的负担,除此外还提供了细节层次的LOD(Levels of Detail 多细节层次)功能,在远观时,降低模型的面数和精度,拉近后再将细节加载出来,大大增强了页面的加载速度,更可以用于跨桌面使用,使得web端和移动应用程序共享,主要适用于静态场景
二、3D Tiles数据特点-
开放性
它是一个开放式的数据规范,我们可以根据实际需求设定三维模型的大小和范围,此外还能适配多种空间分区方案,如:普通网格、四叉树、八叉树等四叉树:它是一种树形数据结构,它的每个节点下之多可以有四个子节点。通常把二维空间细分为四个区域,并把该区域里的相关信息存入到四叉树节点中,四叉树的每一个节点代表一个矩形区域,每一个矩形区域又可分为四个小矩形区域
八叉树:相比四叉树,八叉树是将二维空间延伸到了三维空间,树种的子节点只会有八个或者零个,每一个节点同样用于存储数据
-
异质性
支持将不同类型的三维模型数据,如普通模型数据加倾斜摄影数据加自绘几何数据放在一起,转化为统一标准的数据集,让它们可以在同一场景下显示出来 -
专为三维可视化设计
专为三维可视化设计,并在其中引入了图形领域的技术,在不满足特定条件的情况下,并不会对场景内的模型做整个渲染,而是只会渲染个轮廓,大大降低了计算量,使得浏览器请求到数据后,渲染的流程也更加的简单。同时,因为三维模型预先处理成了分块的三维瓦片格式,所以也减少了WebGL绘制请求的数量。 -
可交互性
其支持对加载模型的拾取,和样式的修改,大量加载以后,可以对其中的单独模型进行交互,如:高亮显示鼠标悬停处的模型、或进行删除等,也可根据建筑模型的高度和年代,设置不同的显示效果而不需要重新更新代码
3D Tiles的格式是由两个部分组成的:
其一是如下的json格式的数据,这里的asset是一个包含整体tileset元素属性的对象,其中的version属性是定义3D Tiles版本的字符串,此外这里还可以选填一个tilesetVersion属性,它可以用于定义特定应用中的版本号,geometricError属性定义了一个非误差单位,低于这个误差值,瓦片集不会被渲染(单位:米),root属性用于定于根瓦片。它的子项transform也是一个可选项,它的作用是在加载大量模型或者建筑物的情况下,单个模型的点云瓦片集能在它自己的坐标系中定义,其内的数据是一个4*4的仿射变换矩阵,以列主序存储,用来实现从瓦片局部坐标系到父瓦片或根瓦片坐标系的变换。root内部也有一个geometricError属性,前者是整个瓦片不被渲染的误差,后者只是当前瓦片集被渲染的误差。content属性通过url引入文件,其支持的二进制文件格式有.b3dm、.i3dm、.pnts等,甚至可以在其中再放入一个3D Tiles文件,前提是不可以自己引用自己。content上方的refine属性定义的是LOD细化的方法,简单来说就是瓦片是如何切换的。
构成3D Tiles的第二部分就是其引用的瓦片数据文件了,.b3dm就是我们用于渲染数据的文件
//json文件 { "asset": { "version": "1.0" }, "geometricError": 70, "root": { "boundingVolume": { "box": [ 0, 0, 10, 100, 0, 0, 0, 100, 0, 0, 0, 10 ] }, "transform": [ 0.9686356343768792, 0.24848542777253735, 0, 0, -0.15986460744966327, 0.623177611820219, 0.765567091384559, 0, 0.19023226619126932, -0.7415555652213445, 0.6433560667227647, 0, 1215011.9317263428, -4736309.3434217675, 4081602.0044800863, 1 ], "geometricError": 70, "refine": "ADD", "content": { "uri": "buildings.b3dm" }, "children": [ { "boundingVolume": { "box": [ 0, 0, 0, 100, 0, 0, 0, 100, 0, 0, 0, 15 ] }, "transform": [ 0.35355339059327373, 0.3535533905932738, 0, 0, -0.3535533905932738, 0.35355339059327373, 0, 0, 0, 0, 0.5, 0, 0, 0, 5, 1 ], "geometricError": 0, "content": { "uri": "instances.i3dm" } } ] } }四、3D Tiles数据使用方法
b3dm格式瓦片集主要用于加载批量的模型,pnts格式瓦片集用于加载点云数据模型,cmpt瓦片集,允许一个cmpt文件内嵌多个其他类型的瓦片。
// 3DTiles并不是Entity的一部分,而是属于更加底层的primitives var tileset = viewer.scene.primitives.add( // 用于实例化 new Cesium.Cesium3DTileset({ // 放入json文件的路径 url:"../../lib/TilesetWithViewerRequestVolume/tileset.json", maximumScreenSpaceError: 2, //最大的屏幕空间误差,数字越低,视觉效果越好 maximumNumberOfLoadedTiles: 1000, // 最大加载瓦片个数用于给定一定的限制,防止数据量过大,占用内存过高 }) )