CesiumJS 2022^ 原理[3] 渲染原理之从 Entity 看 DataSource 架构 - 生成 Primitive 的过程

Python微信订餐小程序课程视频

https://blog.csdn.net/m0_56069948/article/details/122285951

Python实战量化交易理财系统

https://blog.csdn.net/m0_56069948/article/details/122285941
目录* API 用法回顾


API 用法回顾

只需传入参数对象,就可以简单地创建三维几何体或者三维模型。

const modelEntity = viewer.entites.add({
  id: 'some-entitiy',
  name: 'some-name',
  position: Cartesian3.fromDegrees(112.5, 22.3, 0),
  model: {
    uri: 'path/to/model.glb'
  }
})

Entity API 通常会被拿来与 Primitive API 比较,无外乎:

  • 前者使用 Property API 使得动态效果简单化,后者需要自己编写着色器;
  • 个体数量较多时,前者的性能不如后者;
  • 后者支持较底层的用法,可以自己控制材质着色器、几何数据并批优化;

本篇感兴趣的是 Entity API 是如何从参数化对象到 WebGL 渲染的。

首先,上结论:Entity 最终也会变成 Primitive

从上面简单的示例代码可以看出,使用 Entity API 的入口是 Viewer,它不像 Primitive API 是从 Scene 访问的。

这正是关于 Entity API 源代码和设计架构的第一个知识,Entity API 必须依赖 Viewer 容器。

前提是只用公开出来的 API

1. 为什么要从 Viewer 访问 Entity API

Viewer 其实是 CesiumJS 长期维护的一个成果,它在大多数时候扮演的是 Web3D GIS 地球的总入口对象。今天的主角是它暴露出来的 Entity API,不过在介绍它之前,还要再提一提 Scene 暴露出来的 Primitive API

Scene 暴露出来的 Primitive API 是一种比较接近 WebGL 数据接口的 API,面对接近业务层的数据格式,譬如 GeoJSON、KML、GPX 等,Primitive API 就略显吃力了。

虽然可以做一些转换接口,不过 Cesium 团队结合自己研发的数据标记语言 – CZML,配上内置的时钟,封装出了更高级别的架构。

CesiumJS 使用 DataSource APIEntity API 这套组合实现了复杂、动态空间地理数据格式的接入。

1.1. 高层数据模型的封装 - DataSource API

这个 API 其实是 Entity API 的基础设施,在源码文件夹下就有一个 DataSources/ 文件夹专门收纳 Entity APIDataSource API 的源代码,可见重要程度之高。

首先,分别看定义在 Viewer 原型链上的两个属性 entitiesdataSourceDisplay

Object.defineProperties(Viewer.prototype, {
  // ...
  dataSourceDisplay: {
    get: function () {
      return this.\_dataSourceDisplay;
    },
  },
  entities: {
    get: function () {
      return this.\_dataSourceDisplay.defaultDataSource.entities;
    },
  },
  // ...
}

从上面两个 getter 看,EntityCollection 似乎是被 DataSourceDisplay 对象的 defaultDataSource 管辖的;defaultDataSourceCustomDataSource 类型的。

Viewer 拥有一个 DataSourceDisplay 成员,它负责所有 DataSource 的更新。接下来先介绍这个“显示管理器”类。

1.2. 显示管理器 DataSourceDisplay 与默认数据源 CustomDataSource

它随 Viewer 创建而创建,而且优先级相当高,仅次于 CesiumWidget;它自己则创建默认的 DataSource,也就是 CustomDataSource

// DataSourceDisplay.js
function DataSourceDisplay(options) {
  // ...
  const defaultDataSource = new CustomDataSource();
  this.\_onDataSourceAdded(undefined, defaultDataSource);
  this.\_defaultDataSource = defaultDataSource;
  // ...
}

在这个 CustomDataSource 的构造函数里,就能找到 Viewer 暴露出去的 EntityCollection

// CustomDataSource.js
function CustomDataSource(name) {
  // ...
  this.\_entityCollection = new EntityCollection(this);
  // ...
}

Object.defineProperties(CustomDataSource.prototype, {
  // ...
  entities: {
    get: function () {
      return this.\_entityCollection;
    },
  },
  // ...
}

所以,包含关系就说清楚了:

<
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值