3dTiles--三维瓦片

文章来源:https://www.cnblogs.com/onsummer/p/12799366.html

一.Web中的三维

  html5和webgl技术使得浏览器三维变成了可能。三维数据(三维模型)是三维可视化重要的一环,三维数据众多,行业跨界广。然而,随着日益增长的效果需求,比如场景一大,模型文件体积变大,解析所耗费的时间越来越长。webgl和包括所有gpu有关的图形渲染编程,几乎只认这样的三维数据:顶点、顶点颜色、顶点法线、着色语言等。

  所以,三维图形界的通用格式:glTF应运而生,它面向终点,它按照图形编程所需的格式来存储数据,借以二进制编码提高传输速度。事实上,大多数三维软件提供了glTF格式的转换。

       它不再使用面向对象的思维存储三维模型、贴图纹理,而是按显卡的思维存储,存的是顶点、法线、顶点颜色等最基础的信息,只不过组织结构上进行了精心的设计。它面向终点,就意味着可编辑性差,因为渲染性能的提高牺牲了可编辑性,它不再像3ds、dae甚至是max、skp一样容易编辑和转换。

二.地理真三维

        早年,地理的三维还处于地形三维上,即数字高程模型(DEM)提供地表的高度拉伸。栅格高程数据、等高线、不规则三角网等均是数字高程模型的具体案例。

  随着学科的融合、计算机技术和硬件的更新换代,使得有模型、有细节的真三维融入到GIS中成为了可能,或者说,计算机技术和硬件的升级,给GIS以更广阔的视角观察世界。cesium.js 号称是 webgl 封装的三维地理库,是支持 gltf 模型的加载的。但面对大规模精细三维数据的加载,还要照顾到GIS的各种坐标系统、分析计算,gltf这种单个模型的方案显得力不从心。

  2016年,Cesium 团队借鉴传统2DGIS的地图规范——WMTS,借鉴图形学中的层次细节模型,打造出大规模的三维数据标准—— 3d-Tiles,中文译名:三维瓦片。它在模型上利用了 gltf 渲染快的特点,对大规模的三维数据进行组织,包括层次细节模型、模型的属性数据、模型的层级数据等。

三.3dTiles的特点

   3dTiles 继承了 gltf 的优点:贴合图形渲染 API 的逻辑,讨 GPU 喜爱,webgl 对其内部组织起来的三维模型数据,不需要转换,可以直接渲染(glTF 的功劳)。

  3dTiles 是一种规范,在规范的指导下,各种资源文件可以是独立存在于硬盘中的目录、文件,也可以以二进制形式写入数据库中。目前,3dTiles 的官方实现只有 “散列文件”,也就是文件、文件夹的形式存储在硬盘中。

  3dTiles还有一个特点:那就是不记录模型数据,只记录各级“Tile”的逻辑关系,以及“Tile”自己的属性信息。所谓的模型数据,是指三维模型的顶点、贴图材质、法线、颜色等信息。逻辑关系是指,各级Tile是如何在空间中保持连续的,LOD是如何组织的。属性信息就很简单啦,门有门的生产商,窗户有窗户的使用年限等,往大了说,建筑还有它自己的寿命、法人、施工单位等属性信息。

  3dTiles的特点总结如下:

    (1)三维模型使用了 glTF 规范,继承它的渲染高性能;

    (2)除了嵌入的 glTF,3dTiles 自己 只记录各级Tile的空间逻辑关系(如何构成整个3dtiles)和属性信息,以及模型与属性如何挂接在一起的信息;

四.3dTiles数据示例

  上图是一份 3dTiles数据集在文件夹内的样子,打开可得以下特点:

    (1)入口文件是 tileset.json

    (2)各级瓦片用文件夹(目录)来组织

  3dTiles 数据目前的具体文件实现,是一些零散的文件。数据集的名称与所在文件夹的名称并无关系,数据集的名称写在入口文件中。3dTiles至少有一个 tileset.json 文件,作为整个数据集的入口。它是一个 json 文件,描述了整个三维瓦片数据集。而“属性信息”、“嵌入的gltf模型” 则位于各个二进制瓦片文件中,这些二进制文件则由 tileset.json 中的瓦片中的 uri 来引用。

五.什么是瓦片

  瓦片切割了三维数据,允许三维数据进行细分。在加载超大规模的三维模型数据时,不可能把一个模型全部下载下来再渲染,那样等待的时间太慢了,但是一点一点出现,视野范围外的“瓦片”则干脆就不下载、渲染,性能、视觉都有提高。这就是瓦片的设计优点。

  传统的二维地图瓦片,叫做 WMTS 或 TMS,这个 "T" 就是 Tile 的意思。3dTiles就是把空间进行切块,每个块叫做 “tile”,也即瓦片。至于怎么切的——待会介绍 tileset.json 时,会隆重介绍树结构。

  瓦片只有两种情况:叶子瓦片,非叶子瓦片。根瓦片也是非叶子瓦片。非叶子瓦片和叶子瓦片有什么区别呢?主要就是叶子瓦片不会再有叶子。

 六.瓦片数据集tileset.json文件

  通常,一个三维瓦片数据集(之后简称:一个3dtiles数据)的入口就是那个”tileset.json“;root对象中有一个content,内有uri属性,其就记录了根瓦片的二进制数据文件的URL,这个URL是个相对路径,相对于 tileset.json 文件。

6.1 顶级属性概览

  3dTiles数据的入口文件是一个名叫 tileset.json 的文件,而通常来说,这个json必须存在以下几个顶级对象:

    (1)asset对象:记录了瓦片集元数据信息,整个数据集的声明和归属数据,类似于数据声明,能在此写入 versiontilesetVersion 等属性;

    (2)root对象:存储根瓦片的信息,即这个数据集的根瓦片,每个3dTiles数据集必须有一个 root 对象

    (3)geometricError对象:一个非负数值,定义瓦片集的渲染条件,这个数值的大小能控制 LOD 的显示隐藏,且这个数值父级瓦片一定比子级瓦片大;

6.2 树结构

  树结构对于三维空间数据的组织有很大的优势。3dTiles在空间上允许数据集使用如下几种树结构:

    (1)四叉树:允许使用传统的均匀四叉树,也允许使用松散四叉树等变种。四叉树对在高度上不太好切分的数据比较适合,而如果追求极致的空间分割和分级(例如点云数据),那么八叉树更合适。

    (2)八叉树:也允许使用各种变种

    (3)KD树:kd树比较难理解,在此不作展开,这也是一种有趣的空间结构分割的数据结构

    (4)格网结构:允许瓦片存在多个子瓦片,通常出现在倾斜摄影数据上,但是这会导致网络请求过多的问题

6.3 坐标系统

  在GIS中,WGS84就是一个用经纬度来标识空间坐标的“地理坐标系,Geographic Coordinate System”。目前,最具代表性的就是两个以地球质心为中心的椭球体:

    (1)WGS84椭球体

    (2)中国国家2000椭球体(即CGCS2000)

  基于椭球体,允许有多种不同的坐标系定义,WGS84坐标系其实并不太严谨。基于WGS84椭球(长短半轴等信息自行查询哈),可以使用球面坐标度量,即经纬度,还有一个从质心射向椭球面上的点的“椭球高度”射线,来记录第三维高度数据。

  3dTiles其实采用的是WGS84椭球,但是并未采用经纬度记录数据:因为相对于精细三维模型来说,经纬度不足以提供足够精确的空间分割(要照顾图形显示问题)。所以,同样是那个形状,3dTiles使用了同一个WGS84椭球,更方便计算的坐标:空间直角坐标

  用经纬度记录数据的WGS84坐标系,WKID是4326,用地心为坐标原点的空间直角坐标来记录数据的坐标系,WKID是4979。3dTiles 用的就是4979坐标系。

6.4 构成3dtiles的成员:Tile瓦片

  (1)瓦片对象会引用一个二进制的瓦片数据文件,有四种类型:

类型英文名称文件后缀名
批量三维模型 Batch 3D Model b3dm
实例三维模型 Instance 3D Model i3dm
点云 PointCloud pnts
复合模型 Component cmpt

 

瓦片类型对应实际数据
b3dm 传统三维建模数据、BIM数据、倾斜摄影数据
i3dm 一个模型多次渲染的数据,灯塔、树木、椅子等
pnts 点云数据
cmpt 前三种数据的复合(允许一个cmpt文件内嵌多个其他类型的瓦片)

  (2)一个children下的第一个瓦片,观察不难得知,与root瓦片其实在属性上长得一模一样。瓦片对象都有如下属性:

    boundingVolume:空间范围框,允许有box、sphere、region三种范围框,但是只能定义一种;

    geometricError:几何误差

    content:瓦片内容,uri属性引用二进制瓦片数据文件。

    其他属性:viewerRequestVolume、transform

  没错,瓦片对象记录的就是瓦片的元数据,真正瓦片的本体数据在content所引用的二进制文件中。

  (3)瓦片还可以再引用 3dTiles 数据集!Tile不仅仅可以在其uri属性中引用 诸如 .b3dm.i3dm.pnts等二进制瓦片数据文件,还可以再引用一个 3dTiles!下图一份从osgb倾斜摄影数据转换而来的3dtiles数据,清晰可见在root瓦片的第一个child瓦片中,引用了另外一个json文件。这证明了两件事:

  • 3dTiles的文件名可以不是tileset.json
  • 3dTiles允许套娃

  原则上,只要被引用的子一级3dtiles 不循环引用父级3dtiles,那么就OK

 6.5 boundingVolume详解

  boundingVolume边界体积类型包括定向边界框(box)、边界球(box)和由最小和最大纬度、经度和高度定义的地理区域(region

 

 

   boundingvolume.region属性是一个由六个数字组成的数组对象,格式是[west, south, east, north, minimum height, maximum height]。这些数字用纬度、经度和高度坐标定义边界地理区域,顺序为[西、南、东、北、最小高度、最大高度]。纬度和经度在EPSG 4979中定义的WGS 84基准中,以弧度表示。高度以WGS 84椭球体以上(或以下)为单位;

  角度和弧度关系是:2π 弧度 = 360°

    1) 角度转换为弧度公式:弧度=角度÷180×π

    2) 弧度转换为角度公式: 角度=弧度×180÷π

  boundingvolume.box属性是一个由12个数字组成的数组,该数组在z轴向上的右手三轴(x,y,z)笛卡尔坐标系中定义定向边界框。前三个元素定义了框中心的x、y和z值。接下来的三个元素(带有索引3、4和5)定义X轴方向和半长度。接下来的三个元素(索引6、7和8)定义Y轴方向和半长度。最后三个元素(索引9、10和11)定义Z轴方向和半长度;

  boundingvolume.sphere属性是一个由四个数字组成的数组,用于定义边界球。前三个元素定义了z轴向上的右手三轴(x,y,z)笛卡尔坐标系中球体中心的x,y和z值。最后一个元素(索引3)定义半径(单位:米)

 

posted @ 2020-12-01 11:16  小狗钱钱1  阅读(2624)  评论(0)    收藏  举报