上一节介绍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)数据结构的更多相关文章

  1. Cesium原理篇:3最长的一帧之地形(2:高度图)

           这一篇,接着上一篇,内容集中在高度图方式构建地球网格的细节方面.        此时,Globe对每一个切片(GlobeSurfaceTile)创建对应的TileTerrain类,用来维 ...

  2. Cesium原理篇:5最长的一帧之影像

    如果把地球比做一个人,地形就相当于这个人的骨骼,而影像就相当于这个人的外表了.之前的几个系列,我们全面的介绍了Cesium的地形内容,详见: Cesium原理篇:1最长的一帧之渲染调度 Cesium原 ...

  3. Cesium原理篇:7最长的一帧之Entity(下)

    上一篇,我们介绍了当我们添加一个Entity时,通过Graphics封装其对应参数,通过EntityCollection.Add方法,将EntityCollection的Entity传递到DataSo ...

  4. Cesium入门10 - 3D Tiles

    Cesium入门10 - 3D Tiles Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ 我们团队有时把Ces ...

  5. Cesium原理篇:3D Tiles(1)渲染调度

    Cesium在2016年3月份左右推出3D Tiles数据规范,在glTF基础上提供了LOD能力,定位就是Web环境下海量三维模型数据.虽然目前3D Tiles还是Beta阶段,有不少硬伤,但3D T ...

  6. Cesium原理篇:3D Tiles(3)个人总结

    个人结论:目前,在演示层面,3D Tiles问题不大,但项目应用上就不够成熟了,所以问问自己,你是想吃瓜呢还是想吃螃蟹? 好的方面 数据规范 我非常喜欢glTF的整体设计,概括有四点:第一,数据块(B ...

  7. Cesium原理篇:3D Tiles(1)渲染调度【转】

    Cesium在2016年3月份左右推出3D Tiles数据规范,在glTF基础上提供了LOD能力,定位就是Web环境下海量三维模型数据.虽然目前3D Tiles还是Beta阶段,有不少硬伤,但3D T ...

  8. Cesium原理篇:6 Renderer模块(1: Buffer)

    刚刚结束完地球切片的渲染调度后,打算介绍一下目前大家都很关注的3D Tiles方面的内容,但发现要讲3D Tiles,或者充分理解它,需要对DataSource,Primitive要有基础,而这要求对 ...

  9. Cesium原理篇:6 Render模块(6: Instance实例化)

    最近研究Cesium的实例化,尽管该技术需要在WebGL2.0,也就是OpenGL ES3.0才支持.调试源码的时候眼前一亮,发现VAO和glDrawBuffers都不是WebGL1.0的标准函数,都 ...

随机推荐

  1. CaltrainTimes从设计到发布(基于Flex的手机应用)

    资源下载地址 Caltrain Times 的 iTunes下载地址 Caltrain Times的Android Market 下载地址 Caltrain Times的BlackBerry App ...

  2. doubango(2)--底层协议栈结构分析

    tsip_stack_handle_t 实例 1.        tsip_stack_handle_t的创建 在底层,真正运转的协议栈结构式tsip_stack_handle_t的一个实例,它的创建 ...

  3. SSM(Maven集成)

    ssm全称:Spring+SpringMVC+Mybatis ssm简介: 1.Spring Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod J ...

  4. 美丽的Java图表类库

    摘要 在使用java做后台站点的开发张,图表和报表功能都是不可或缺 的.本文推荐了8款最精彩实用的Java图表应用,大部分图表应用的功能都类似,主要在于界面的美观性和使用的灵活性上有一点高低. 正文 ...

  5. Java: 分解List<HashMap<String, String>>

    分解List<HashMap<String, String>> 的方法: List<HashMap<String, String>> mapList; ...

  6. CSS 文件的4种引入方式

    (1)链接式  : 在网页的<head></head>标签对中使用<link>标记来引入外部样式表文件,使用html规则引入外部css  (用得比较多) : < ...

  7. 作为测试人员,我是这么报BUG的

    在测试人员提需求的时候,大家经常会看到,测试员和开发一言不合就上BUG.然后开发一下就炸了,屡试不爽,招招致命. 曾经看到有个段子这么写道: 不要对程序员说,你的代码有BUG. 他的第一反应是:1.你 ...

  8. bzoj1061--线性规划

    线性规划裸题... 根据题目很容易可以得到线性规划方程(以样例为例): Min(2*x1+5*x2+2*x3) x1+ 0+ 0>=2 x1+x2+ 0>=3 0+x2+x3>=4 ...

  9. C++编程练习(10)----“图的最小生成树“(Prim算法、Kruskal算法)

    1.Prim 算法 以某顶点为起点,逐步找各顶点上最小权值的边来构建最小生成树. 2.Kruskal 算法 直接寻找最小权值的边来构建最小生成树. 比较: Kruskal 算法主要是针对边来展开,边数 ...

  10. [原创.数据可视化系列之十二]使用 nodejs通过async await建立同步数据抓取

    做数据分析和可视化工作,最重要的一点就是数据抓取工作,之前使用Java和python都做过简单的数据抓取,感觉用的很不顺手. 后来用nodejs发现非常不错,通过js就可以进行数据抓取工作,类似jqu ...