之前笔记简单记录过Cesium如何调用GeoJSON、KML和glTF等格式的空间数据。但是其实Cesium的绘制API很灵活以及丰富。而对于空间数据的管理也是三维中的核心内容,例如对空间数据的增删改查等等。
所以这篇深入记录一下三维数据中空间数据的绘制。主要我们会用到两个方法:Entity
和Primitive
。
Cesium有丰富的空间API,但是大致可以分为两类:面向图形开发人员的低级Primitive API
和面向数据驱动可视化的高级APIEntity API
。
在实际项目中,我们绝对会遇到的一种情况便是,通过创建不同类型的几何对象,比如点、线、面、圆、体等,为其赋与不同的材质效果,从而呈现出千变万化的可视化。所以Cesium为其提供了Primitive(图元)类和Entity(实体)类去创建一个几何对象,也提供了与材质有关的Material类和MaterialProperty类,可以分别对Primitive和Entity两种方式生成的几何对象的material对象进行赋值。
Primitive :创建方式更接近渲染引擎底层,需要初始化很多对象,比如外观(Appearance)、几何形状(Geometry)等,使用相对繁琐。但相对为Primitive添加材质会方便很多
- Material :专为Appearance类而生,用于修改Primitive的几何对象材质。同时,Appearance也有自己的继承类,通过修改部分继承类的material属性,也可以实现Primitive几何对象材质的修改
Entity :对Primitive封装后的高级对象,调用便捷
- MaterialProperty :专为Entity而生的一个抽象类,通过实例化其子类,对Entity几何对象进行材质设置
Entity
Entity API
它使我们能够专注于数据的呈现,而不是担心可视化的底层机制。它还提供了易于构建复杂的时间动态可视化的结构,以自然地与静态数据相结合。虽然Entity API
实际上在后台使用了Primitive API
,但这是我们(几乎)永远不必关心的实现细节。通过将各种启发式方法应用于我们提供的数据,Entity API
能够提供灵活、高性能的可视化,同时提供一致、易于学习且易于使用的界面。
Entity是Cesium中最重要的概念之⼀,它通常用于描述具有坐标位置的实际对象,例如⻜机、汽⻋、楼 房、⼈物等。每个Entity实例都有不同的属性,例如位置、姿态、缩放、颜⾊、贴图等,并且可以通过编 程⽅式创建、修改、删除。Entity的优点是⾮常灵活和易于使用。
由于Entity是更⾼层次的概念,因此它可以⾃动处理许多与底层图 形和几何形状相关的复杂性,例如纹理贴图、光照、碰撞检测等。它还可以与其他Cesium组件集成,例 如事件处理、拾取和相机控制等。
**Entities 是 Cesium 的高级抽象,**提供了一种更直观、易于使用的方法来创建和管理 3D 对象。它们通常用于需要动态更改对象属性或与对象进行交互的应用程序。
更易于使用:Entities API 是一个友好的、面向对象的 API,允许你使用更少的代码轻松创建和管理 3D 对象。
动态属性支持:Entities 支持动态属性,这意味着可以轻松地在运行时更改对象的属性,如位置、颜色和形状等。
内置交互:Entities 集成了 Cesium 的其他组件,如 InfoBox、SelectionIndicator 和时间轴。这使得与 3D 对象进行交互变得容易,同时保持一致的外观和体验。
高级功能:Entities 支持 Cesium 中的一些高级功能,如地形遮挡、距离缩放等。
Primitive
Primitive API
公开了执行手头任务所需的最少抽象量。它的结构旨在为图形开发人员提供灵活的实现,而不是为了 API 一致性。加载模型不同于创建广告牌,两者与创建多边形完全不同。每种类型的可视化都有其独特的特点。此外,每种方法都有不同的性能特征,需要不同的最佳实践。虽然这种方法功能强大且灵活,但大多数应用程序最好使用更高级别的抽象。
与Entity相⽐,Primitive是Cesium的⼀种更低层次的图形概念,它通常用于描述⼀组简单的图形几何体。例如,我们可以使用Primitive来绘制点、线、多边形、体积、⽂本等基本图形。每个Primitive实例 都可以设置不同的属性,例如颜⾊、边框、宽度、⾼度等。
Primitive的主要优点是它们⾮常⾼效,因为它们使用了GPU硬件加速,可以轻松地绘制⼤量的⼏何体。 它们也⽐Entity更灵活,因为我们可以直接控制几何体的属性和细节,例如绘制线宽,选择不同的纹理贴 图等等。但Primitive的使用需要较少的⾃动性和灵活性,因为需要⼿动处理许多问题,例如碰撞检测、 ⾼级光照和渲染技术等。
**Primitive 是 Cesium 的底层渲染对象。**它们提供了更多的控制和优化选项,但可能更难以使用。Primitive 更适合需要对性能进行微调的应用程序或需要更多自定义选项的场景。
更高的性能:在某些情况下,使用 Primitive 可以提高渲染性能。当需要渲染大量静态对象时,Primitive 可能是一个更好的选择。
更多控制和自定义:Primitive 提供了对底层渲染细节的更多控制。你可以使用 Primitives 创建自定义的渲染对象,以满足特定的性能或视觉需求。
批处理和内存优化:Primitive 支持批处理和内存优化,有助于提高性能。通过合并多个 Primitive 到一个 Primitive,可以减少绘制调用,从而提高渲染性能。
总结
- 如果你需要一个易于使用、动态更改的 3D 对象,支持内置交互和高级功能,那么 Entity 可能是更好的选择。
- 如果性能是关键因素,或者需要更多的控制和自定义,那么 Primitive 可能是更合适的选择。
请注意: 实际上 Entity 最终会转换为 Primitive 来进行渲染。Entity 是一个封装了 Primitive 的高级抽象。在某些情况下,你甚至可以在同一个应用程序中混合使用 Entity 和 Primitive,以实现最佳性能和易用性。
总的来说,Entity和Primitive都是Cesium中强⼤的图形概念,但它们用于不同的场景。如果我们需要描述具有复杂属性和⾏为的实际对象,那么我们应该使用Entity;如果我们只需要绘制简单的几何体,那么 我们可以使⽤Primitive来获得更好的性能和控制。