Cesium原理篇:3D Tiles(2)数据结构
上一节介绍3D Tiles渲染调度的时候,我们提到目前Cesium支持的Cesium3DTileContent目前支持如下类型:
Batched3DModel3DTileContent
Instanced3DModel3DTileContent
PointCloud3DTileContent
Composite3DTileContent
其中Composite3DTileContent是复合数据,PointCloud3DTileContent是只包含FeatureTable和BatchTable的点云数据(从官方给的数据结构来看,我没有亲自测试)。本节主要以Batched3DModel3DTileContent和Instanced3DModel3DTileContent两种类型,介绍一下3DTiles的数据结构和核心技术点。
渲染
结合上一节,先给出一个流程图,建议大图边看边思考。其中红线是表明状态变化。TileContent是一个抽象概念,具体是它的继承类Batched3DModel或Instanced3DModel来完成具体的功能,而每一个具体的Content会根据自己的数据结构的差异而有所差别。

3D Tiles也是基于状态,从UNLOADING开始,通过一系列的request,完成最初的数据加载过程,结束LOADING状态,进入Pocessing过程,也就是数据解析。数据解析完后进入READY状态,通过selectTile,最终调用Content对应的update方法,构造最终的drawcommand,加入渲染队列。当然,如果有需要释放的Tile,则在unloadTiles中处理。细心的人会发现Pocessing和Ready状态。最终调用的都是update方法。这里解释一下:3D Tiles中主要的数据部分就是glTF,而glTF也是基于状态管理的,无论是glTF的解析还是构造DrawCommand,只是state不同,都是在update方法中完成的。如上图,这里也用橙色箭头做了说明。
如上给出了一个相对完整的过程,Content的内容主要是glTF,这块我们之前也介绍过,所以下面主要集中在b3dm中BatchTable和FeatureTable。
Batched3DModel3DTileContent
先看看数据结构的大概布局:

如上,一个header头,用来说明该数据的类型,布局和具体数据内容。看一下body部分,glTF,以前介绍过。所以,只剩下batchTable了。如果你看看Cesium之Batch篇,你会发现,其实Cesium很早就已经在用batchTable概念了。
在这里,Cesium3DTileBatchTable和之前的BatchTable在思路上都是一样的,都是将属性值保存到纹理中来来使用。但Cesium3DTileBatchTable提供了一个规范的流程,让用户通过表达式的方式,很容易的创建出这张tile_batchTexture这里。

如上是batchtable的内容,以及3d tiles给出的文档信息,其实batchtable就是一个json对象。同时,batchTable会根据该json的长度(id个数)创建一张对应的tile_batchTexture,用于存储对应的属性。同时,有多少个id就有有多少个对应的Cesium3DTileFeature对象,这可以认为是batchtable的访问器,以id为唯一标识负责batchtable的读写操作。
有了数据以及数据的读写方法,就需要提供如何读写的规范,这就是Cesium3DTileStyle类的责任。目前默认指定根据json指定颜色,比如根据json对象中的高度值,实现一个根据高度值指定对应颜色的范围分段效果。当然,如果你知道如何修改shader,那你可以修改代码创建自己需要的映射关系,实现对应的效果。

如图,从字面意义来看,指定了范围分段的规范,用到了Height属性,根据conditions中对应的Height区间映射到对应的颜色。我们用肉眼看懂了,那代码是如何完成这个语义解析呢?

如上是这个语义解析树的类结构,也是解析过程的一个示意图,最终每一个条件都封装为一个statement,实现自己的判断标准。

每次遍历树上所有statements,找到满足条件的Node。对比时先看左边Node节点的left,所用的属性为Height,这样,通过feature对应id找到batchTable的Height值,满足条件则获取对应的color:purple,不满足就继续。

前面提到feature相当于一个访问器,获取该值后,直接传到batchtable对应的batchValues,其中这就是该纹理对应的imageData。Feature对这个读写操作进行了属性封装,方便用户的调用。

Instanced3DModel3DtileContent
还是先看看Cesium给出的布局结构:

batchTable,glTF这些都是已有的内容,让我们眼前一亮的是featureTable,Cesium提供了Cesium3DTileFeatureTable来封装。

占是一个具体的featureTable内容。不难理解这个数据的实例化内容就是Position,Cesium通过ModelInstanceCollection来实现Model的实例化,我们之前在Cesium之Instance中介绍过。这里我们重点看看Position实例化矩阵的推导原理,强化一下理解的深度。

如上是对应的Shader和相关的uniform片段。灰选部分是相机的视图矩阵,而rtcTransform则是中心点(_center)对应的矩阵,czm_instanced_model是传入的实例化矩阵,czm_instanced_nodeTransform不讨论,是父子节点之间相对位置对应的矩阵。根据Shader的公式,我们不难得出,a_position是相对模型中心点的相对位置,而czm_instanced_model则是当前单个模型的中心点对应模型集合中心点的矩阵。
查看了一下Instanced3DModel3DTileContent实例化对应矩阵的计算过程,数据存储时还是每一个模型中心点的经纬度信息,在内部转成相对集合中心点的相对矩阵。
关于Content就介绍到这,结合上一篇,应该能对3DTile有一个全面的了解。下次以个人的经验来谈一下3D Tile好和不好的部分,当作完结篇。

Cesium原理篇:3D Tiles(2)数据结构的更多相关文章
- Cesium原理篇:3最长的一帧之地形(2:高度图)
这一篇,接着上一篇,内容集中在高度图方式构建地球网格的细节方面. 此时,Globe对每一个切片(GlobeSurfaceTile)创建对应的TileTerrain类,用来维 ...
- Cesium原理篇:5最长的一帧之影像
如果把地球比做一个人,地形就相当于这个人的骨骼,而影像就相当于这个人的外表了.之前的几个系列,我们全面的介绍了Cesium的地形内容,详见: Cesium原理篇:1最长的一帧之渲染调度 Cesium原 ...
- Cesium原理篇:7最长的一帧之Entity(下)
上一篇,我们介绍了当我们添加一个Entity时,通过Graphics封装其对应参数,通过EntityCollection.Add方法,将EntityCollection的Entity传递到DataSo ...
- Cesium入门10 - 3D Tiles
Cesium入门10 - 3D Tiles Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ 我们团队有时把Ces ...
- Cesium原理篇:3D Tiles(1)渲染调度
Cesium在2016年3月份左右推出3D Tiles数据规范,在glTF基础上提供了LOD能力,定位就是Web环境下海量三维模型数据.虽然目前3D Tiles还是Beta阶段,有不少硬伤,但3D T ...
- Cesium原理篇:3D Tiles(3)个人总结
个人结论:目前,在演示层面,3D Tiles问题不大,但项目应用上就不够成熟了,所以问问自己,你是想吃瓜呢还是想吃螃蟹? 好的方面 数据规范 我非常喜欢glTF的整体设计,概括有四点:第一,数据块(B ...
- Cesium原理篇:3D Tiles(1)渲染调度【转】
Cesium在2016年3月份左右推出3D Tiles数据规范,在glTF基础上提供了LOD能力,定位就是Web环境下海量三维模型数据.虽然目前3D Tiles还是Beta阶段,有不少硬伤,但3D T ...
- Cesium原理篇:6 Renderer模块(1: Buffer)
刚刚结束完地球切片的渲染调度后,打算介绍一下目前大家都很关注的3D Tiles方面的内容,但发现要讲3D Tiles,或者充分理解它,需要对DataSource,Primitive要有基础,而这要求对 ...
- Cesium原理篇:6 Render模块(6: Instance实例化)
最近研究Cesium的实例化,尽管该技术需要在WebGL2.0,也就是OpenGL ES3.0才支持.调试源码的时候眼前一亮,发现VAO和glDrawBuffers都不是WebGL1.0的标准函数,都 ...
随机推荐
- HTML5获取当前的经纬度坐标
使用IE10可以查看出结果:chrome和ff都没有正确显示: <!DOCTYPE html> <html lang="en"> <head> ...
- 触摸滑动插件 Swiper
Swiper Swiper 是纯javascript打造的滑动特效插件,面向手机.平板电脑等移动终端. Swiper中文网里已有详细的使用介绍,我就不多做介绍了. http://www.swiper ...
- HDU5057(分块)
Argestes and Sequence Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- POJ3728 LCA RMQ DP
题意简述:给定一个N个节点的树,1<=N<=50000 每个节点都有一个权值,代表商品在这个节点的价格.商人从某个节点a移动到节点b,且只能购买并出售一次商品,问最多可以产生多大的利润. ...
- WinForm DataGridView控件、duck布局
1.DataGridView控件 显示数据表 (1)后台数据绑定: List<xxx> list = new List<xxx>(); dataGridView1.DataSo ...
- java中File类的常用所有方法及其应用
创建:createNewFile()在指定位置创建一个空文件,成功就返回true,如果已存在就不创建,然后返回false.mkdir() 在指定位置创建一个单级文件夹.mkdirs() 在指定位置 ...
- Spring Boot 基础教程系列学习文档
Spring Boot基础教程1-Spring Tool Suite工具的安装 Spring Boot基础教程2-RESTfull API简单项目的快速搭建 Spring Boot基础教程3-配置文件 ...
- lazy ideas in programming
lazy形容词,懒惰的,毫无疑问是一个贬义词.但是,对于计算机领域,lazy却是非常重要的优化思想:把任务推迟到必须的时刻,好处是避免重复计算,甚至不计算.本文的目的是抛砖引玉,总结一些编程中的laz ...
- 表单界面的兼容PC手机端解决方案
就当写一篇随笔吧~上星期还在做加盟模块(兼容微信端),这星期已经加班做快递扫码模块(react+node),所以我感觉只有弹药备足了才能稍微轻松些应对各种需求.实话说在同个部门的大佬面前差距确实大,如 ...
- 丘吉尔,最后一次演讲-Never Give Up
丘吉尔一生最精彩的演讲,也是他最后一次演讲.在剑桥大学的一次毕业典礼上,整个会堂有上万个学生,他们正在等待丘吉尔的出现.正在这时,丘吉尔在他的随从陪同下走进了会场并慢慢走向讲台,他脱下他的大衣交给随从 ...