# Cesium 源码学习

cesium是一个开源的地理可视化库,用于创建基于地球的应用程序。

版本1.106.1

# 项目结构

  • 根目录结构
cesium
├── Apps //这个文件夹包含了一些 Cesium 的示例应用程序,可以用于学习和参考
├── Documentation //Cesium 的文档目录,包含了详细的 API 文档、教程和示例代码
├── Specs // 存放了 Cesium 的单元测试规格文件
├── ThirdParty //引用的第三方库
├── Tools // 封装了一些工具
├── launches // 配置ROS节点
├── packages //Cesium 源码的目录,包含核心功能和模块
└── travis // 一些自动化脚本
  • packages 目录结构
packages
├── engine
│   ├── Source
│   │   ├── Assets // 包含了一些默认的资源文件,如纹理、模型等
│   │   ├── Core // 核心模块,提供了基本的几何、矩阵运算、时间管理等功能
│   │   ├── DataSources // 数据源相关
│   │   ├── Renderer // 渲染引擎,负责将地球表面、模型、图像渲染到屏幕
│   │   ├── Scene // 场景管理的模块,如相机控制、地形渲染、图像处理等
│   │   ├── Shaders // 存放了用于渲染的 GLSL 着色器代码
│   │   ├── ThirdParty // 使用的第三方库
│   │   ├── Widget
│   │   ├── Workers
│   │   └── WorkersES6
│   └── Specs
│       ├── Core
│       ├── DataSources
│       ├── Renderer
│       ├── Scene
│       └── Widget
└── widgets
    └── Source // 控件源码

# Core

Core模块功能

# 数学计算工具

  • 向量操作
  • 矩阵操作
  • 四元数操作
  • 边界框计算
  • 几何转换和变换
  • 射线和平面计算
  • 几何插值和插值操作
  • 样条曲线
  • 多项式逼近

# 地图场景相关

  • Geometry基类和各种Geometry的定义
  • 地形的创建、填充、编码、状态等等
  • 视椎体几何体
  • 地形瓦片

# 地理编码与计算

  • 地球定向参数
  • 椭圆和椭球体,椭球大地线、椭球等角线、椭球切平面等等
  • 方位角
  • 采样器
  • 地图投影

# 数据结构与算法

  • 深浅拷贝
  • 对象的合并
  • 数组和列表操作
  • 堆和优先队列
  • 双端优先队列
  • 双向链表
  • 哈希表和字典操作
  • 二分搜索

# 时间管理

  • 时间戳的处理和转换
  • 时间间隔的计算
  • 动画和插值操作
  • 时间格式化和解析

# 事件系统

  • 事件的订阅和发布
  • 自定义事件的创建和处理
  • 事件监听和触发
  • 屏幕空间事件

# 坐标系

  • 笛卡尔2、3、4维坐标系
  • 经纬度和地理坐标系之间的转换
  • 笛卡尔坐标系和地理坐标系之间的转换
  • 屏幕坐标系和地理坐标系之间的转换

# 图形渲染

  • 颜色处理和转换
  • 图像纹理操作

# 文件加载

  • 图片加载和处理
  • 文本文件加载和解析
  • 模型文件加载和渲染

# 格式化和解析

  • 数值和字符串的格式化
  • 坐标和时间的解析
  • 数据格式的解析和转换

主要包括四大块:数学工具和函数、地球椭球模型、地图场景元素、数据结构和算法。

# Render(进阶补充)

Render 模块涉及地理可视化场景的渲染和渲染管道的管理。该模块包含了与图形渲染相关的功能和类。以下是 Render 模块的一些主要部分和功能:

  • 渲染管道(Render Pipeline): Render 模块定义了一个渲染管道,用于管理场景中各个渲染阶段的执行顺序和设置。渲染管道包括几何处理、光照计算、阴影投射、纹理渲染等多个阶段,以生成最终的可视化效果。
  • 渲染状态(Render State): Render 模块提供了管理渲染状态的功能,包括深度测试、融合模式、剔除模式等。通过控制渲染状态,可以实现场景中的透明效果、深度排序等功能。
  • 着色器程序(Shader Program): Render 模块定义了用于渲染的着色器程序。着色器程序包含了顶点着色器和片元着色器,用于处理场景中的几何形状和材质的渲染。
  • 帧缓冲(Frame Buffer): Render 模块提供了帧缓冲对象的创建和管理,用于将渲染结果输出到特定的纹理或缓冲区中。
  • 纹理渲染(Texture Rendering): Render 模块包含了将纹理应用于几何体并进行渲染的功能。这涉及将纹理映射到三维物体表面,并根据材质属性和光照计算生成最终的渲染结果。
  • 光照和阴影(Lighting and Shadows): Render 模块定义了光照模型和阴影计算的功能。它包括了各种光源类型的支持(如平行光、点光源等),以及实现阴影投射的算法。
  • 后期处理(Post-processing): Render 模块还提供了一些后期处理效果的功能,如景深效果、辉光效果、色彩校正等。这些效果可以在最终渲染之后应用于场景,以增强可视化效果。
  • 缓冲区、帧缓冲区
  • 清除命令、计算命令、绘制命令
  • 上下文
  • 立方体贴图
  • 采样器
  • 着色器的构建器,着色器缓存。便于编写着色器程序
  • 纹理缓存
  • 顶点数组

# Scene(主要API)

Scene 模块涉及地理可视化场景的管理、渲染和交互。该模块包含了与场景相关的功能和类。以下是 Scene 模块的一些主要部分和功能:

# GLTF相关(补充)

  • gltf管线
  • 各种gltf加载器
  • 添加缓冲区、默认值、额外信息
  • 添加、移除扩展

# Model相关(补充)

  • 模型动画
  • 模型实例
  • 模型外观
  • 模型网格
  • 模型节点

# Camera相机

Camera源码4000行,定义了大量使用相机的函数

Camera相机、相机事件、飞行路径

// Camera构造函数
function Camera(scene) {
  if (!defined(scene)) {
    throw new DeveloperError("scene is required.");
  }
  this._scene = scene;

  // 变换矩阵
  this._transform = Matrix4.clone(Matrix4.IDENTITY);
  this._invTransform = Matrix4.clone(Matrix4.IDENTITY);
  this._actualTransform = Matrix4.clone(Matrix4.IDENTITY);
  this._actualInvTransform = Matrix4.clone(Matrix4.IDENTITY);
  this._transformChanged = false;

  // 相机的属性
  this.position = new Cartesian3(); // 相机位置
  this.direction = new Cartesian3(); // 视图方向
  this.up = new Cartesian3(); 
  this.right = new Cartesian3();
  this.frustum = new PerspectiveFrustum(); // 视图区域

  // 一些默认姿态参数
  this.defaultMoveAmount = 100000.0;
  this.defaultLookAmount = Math.PI / 60.0;
  this.defaultRotateAmount = Math.PI / 3600.0;
  this.defaultZoomAmount = 100000.0;
  this.maximumZoomFactor = 1.5;

  // 运动相关的事件
  this._moveStart = new Event();
  this._moveEnd = new Event();
  this._changed = new Event();

  // 视图矩阵
  this._viewMatrix = new Matrix4();
  this._invViewMatrix = new Matrix4();
  updateViewMatrix(this);

  // 场景模式
  this._mode = SceneMode.SCENE3D;
  this._modeChanged = true;
  // 投影
  const projection = scene.mapProjection;
  this._projection = projection;
  this._maxCoord = projection.project(
    new Cartographic(Math.PI, CesiumMath.PI_OVER_TWO)
  );
  this._max2Dfrustum = undefined;

  // 设置默认视图
  rectangleCameraPosition3D(
    this,
    Camera.DEFAULT_VIEW_RECTANGLE,
    this.position,
    true
  );

  let mag = Cartesian3.magnitude(this.position);
  mag += mag * Camera.DEFAULT_VIEW_FACTOR;
  Cartesian3.normalize(this.position, this.position);
  Cartesian3.multiplyByScalar(this.position, mag, this.position);
}

// 相机航线预加载
Camera.prototype.canPreloadFlight = function () {}
// 更新相机的变化
Camera.prototype._updateCameraChanged = function () {}

// 定义相机原型对象
Object.defineProperties(Camera.prototype, {
  // 变换矩阵
  transform: {
    get: function () {
      return this._transform;
    },
  },
  // 逆变换矩阵
  inverseTransform: {
    get: function () {
      updateMembers(this);
      return this._invTransform;
    },
  },
  // 视图矩阵
  viewMatrix: {
    get: function () {
      updateMembers(this);
      return this._viewMatrix;
    },
  },
  // 相机制图位置
  positionCartographic: {
    get: function () {
      updateMembers(this);
      return this._positionCartographic;
    },
  },
  // 相机的世界坐标
  positionWC: {
    get: function () {
      updateMembers(this);
      return this._positionWC;
    },
  },
  // 相机的方向参数
  directionWC: {
    get: function () {
      updateMembers(this);
      return this._directionWC;
    },
  },
  // 相机的姿态
  heading: {
    get: function () {
      return undefined;
    },
  },
  pitch: {
    get: function () {
      return undefined;
    },
  },
  roll: {
    get: function () {
      return undefined;
    },
  },

  // 相机移动相关的事件
  moveStart: {
    get: function () {
      return this._moveStart;
    },
  },
  moveEnd: {
    get: function () {
      return this._moveEnd;
    },
  },
  changed: {
    get: function () {
      return this._changed;
    },
  },
});

// 设置相机的位置、朝向和变换矩阵
Camera.prototype.setView = function (options) {}
// 相机飞回Home视图
Camera.prototype.flyHome = function (duration) {}
// 世界坐标转相机坐标
Camera.prototype.worldToCameraCoordinates = function (cartesian, result) {}

// 沿着某个方向运移动
Camera.prototype.move = function (direction, amount) {} 
// 相机看向目标位置
Camera.prototype.look = function (axis, angle) {} 
// 从目标位置观察
Camera.prototype.lookAt = function (target, offset) {}
// 相机沿着坐标轴旋转
Camera.prototype.rotate = function (axis, angle) {} 

// 拉近视角
Camera.prototype.zoomIn = function (amount) {}
// 拉远视角
Camera.prototype.zoomOut = function (amount) {}

// 还有很多其他函数补充

# Primitive基本元素

primitive描述场景中的几何图形,可以是单一的也可以是多个。primitive将geometry和appearance结合,appearance包含材质和渲染状态。

将多个实例组合为一个primitive可以提升性能

2500行

# Scene对象

4000多行

// Scene是包含了所有3D图形对象和状态的Cesium虚拟场景
function Scene(options) {
  // 创建上下文
  const canvas = options.canvas;
  const contextOptions = clone(options.contextOptions);
  const context = new Context(canvas, contextOptions);

  // 定义实例变量,但是通过原型对象的属性访问
  this._id = createGuid();
  this._jobScheduler = new JobScheduler();
  // ...

  // 定义实例属性members
  // 用户输入后是否立即完成过渡动画
  this.completeMorphOnUserInput = true;
  // 过度开始事件
  this.morphStart = new Event();
  // 过度完成事件
  this.morphComplete = new Event();
  // 天空盒
  this.skyBox = undefined;
  // 大气层
  this.skyAtmosphere = undefined;
  // 太阳
  this.sun = undefined;
  // 月亮
  this.moon = undefined;
  // 雾
  this.fog = new Fog();
  // 没有天空盒时的背景色
  this.backgroundColor = Color.clone(Color.BLACK);

  // 过渡相关的参数
  // 过渡动画的时间
  this.morphTime = 1.0;
  this.farToNearRatio = 1000.0;
  this.logarithmicDepthFarToNearRatio = 1e9;
  // ...

  // 允许选用深度缓冲区
  this.useDepthPicking = true;
  // 选用半透明深度
  this.pickTranslucentDepth = false;
  // 相机等待时间
  this.cameraEventWaitTime = 500.0;
  // 阴影地图
  this.shadowMap = new ShadowMap({
    context: context,
    lightCamera: this._shadowMapCamera,
    enabled: defaultValue(options.shadows, false),
  });
  // 跟踪每一帧的环境状态
  this._environmentState = {}

  // ...

  // 光照
  this.light = new SunLight();
}

// 定义原型对象的属性
Object.defineProperties(Scene.prototype, {

  // 绑定的canvas元素
  canvas: {
    get: function () {
      return this._canvas;
    },
  },

  // 绘制缓冲区高度
  drawingBufferHeight: {
    get: function () {
      return this._context.drawingBufferHeight;
    },
  },

  // 绘制缓冲区宽度
  drawingBufferWidth: {
    get: function () {
      return this._context.drawingBufferWidth;
    },
  },

  // cube map一个边的最大像素长度
  maximumCubeMapSize: {
    get: function () {
      return ContextLimits.maximumCubeMapSize;
    },
  },

  // 支持位置选择
  pickPositionSupported: {
    get: function () {
      return this._context.depthTexture;
    },
  },

  // 深度测试椭球
  globe: {
    get: function () {
      return this._globe;
    },

    set: function (globe) {
      this._globe = this._globe && this._globe.destroy();
      this._globe = globe;

      updateGlobeListeners(this, globe);
    },
  },

  // 基本图元的集合
  primitives: {
    get: function () {
      return this._primitives;
    },
  },

  // 场景的相机
  camera: {
    get: function () {
      return this._view.camera;
    },
    set: function (camera) {
      // For internal use only. Documentation is still @readonly.
      this._view.camera = camera;
    },
  },

  // 场景的视图
  view: {
    get: function () {
      return this._view;
    },
    set: function (view) {
      // For internal use only. Documentation is still @readonly.
      this._view = view;
    },
  },

  // 地图投影
  mapProjection: {
    get: function () {
      return this._mapProjection;
    },
  },

  // 任务调度器
  jobScheduler: {
    get: function () {
      return this._jobScheduler;
    },
  },

  // 帧状态
  frameState: {
    get: function () {
      return this._frameState;
    },
  },

  // 影像图层
  imageryLayers: {
    get: function () {
      if (!defined(this.globe)) {
        return undefined;
      }

      return this.globe.imageryLayers;
    },
  },

  // 环境状态
  environmentState: {
    get: function () {
      return this._environmentState;
    },
  },

  // 上下文对象
  context: {
    get: function () {
      return this._context;
    },
  },
  // ...
  }
)

// 接下来定义原型方法
// 是否支持纹理格式压缩
Scene.prototype.getCompressedTextureFormatSupported = function (format) {}
// 更新和渲染场景,一般会自动调用
Scene.prototype.render = function (time) {}
// 强制渲染
Scene.prototype.forceRender = function (time) {}
// 捕获窗口中的单个元素
Scene.prototype.pick = function (windowPosition, width, height) {}
// 捕获窗口中的若干个元素
Scene.prototype.drillPick = function (windowPosition, limit, width, height) {}
// 捕获大地坐标
Scene.prototype.pickPositionWorldCoordinates = function (){}
// 捕获笛卡尔坐标
Scene.prototype.pickPosition = function (windowPosition, result) {}
// 通过射线捕获
Scene.prototype.pickFromRay = function (ray, objectsToExclude, width) {}

// 还有若干函数...

# Globe对象

# Material对象

# 各种地图Provider

# Scene场景内容

  • Light光源
  • 粒子系统
  • 阴影
  • 地形、地形数据、地形编码、地形填充网格
  • 纹理、纹理缓存
  • 地球、月球、太阳
  • 场景模式、场景变换

# 几何图形定义

  • 平面、裁剪平面
  • 点、点云
  • 多边形、多边形几何体
  • 折线、折线几何体
  • 球体、球面

# Cesium 3D tile

  • 3D tile 上下文

  • 3D tile 集合的操作

  • 3D tile 样式

  • Tileset3DTile 瓦片集合

    • 上下文
    • 要素
    • 层次结构
    • 标签
    • 图元

# 其他

  • 图层
    • 各种地图Provider
  • 隐式内容
    • 隐式3D tile
    • 隐式子树
  • 各种数据加载器loader
  • 后期处理

投影、坐标系等等

Scene模块主要包含了模型、gltf、3Dtiles、几何图形、场景等等。

# DataSources

Data Source 模块是用于加载和管理地理数据源的模块。它提供了一种统一的方式来加载、处理和显示不同类型的地理数据。以下是 Data Source 模块的一些主要部分和功能:

# 定义几何图形与更新器

几何图形包含:

  • 广告牌
  • 3Dtileset
  • 圆柱、椭圆、椭球
  • 平面、多边形、折线

以椭球为例:

  • 首先是定义几何图形
// 定义了椭球几何体的属性,并进行属性合并
function EllipsoidGraphics(options) {
  this._definitionChanged = new Event();
  this._show = undefined;
  this._showSubscription = undefined;
  this._radii = undefined;
  ...
  this.merge(defaultValue(options, defaultValue.EMPTY_OBJECT));
}

// 在原型对象上定义属性描述符
Object.defineProperties(EllipsoidGraphics.prototype, {
  definitionChanged: {
    get: function () {
      return this._definitionChanged;
    },
  },
  // 封装了属性描述符函数
  show: createPropertyDescriptor("show"),
  radii: createPropertyDescriptor("radii")
  ...
})

// 定义clone函数
EllipsoidGraphics.prototype.clone = function (result) {
  if (!defined(result)) {
    return new EllipsoidGraphics(this);
  }
  result.show = this.show;
  result.radii = this.radii;
  result.innerRadii = this.innerRadii;
  ...
  return result;
};

// 属性合并函数
EllipsoidGraphics.prototype.merge = function (source) {
  //>>includeStart('debug', pragmas.debug);
  if (!defined(source)) {
    throw new DeveloperError("source is required.");
  }
  //>>includeEnd('debug');

  this.show = defaultValue(this.show, source.show);
  this.radii = defaultValue(this.radii, source.radii);
  this.heightReference = defaultValue(
    this.heightReference,
    source.heightReference
  );
  this.distanceDisplayCondition = defaultValue(
    this.distanceDisplayCondition,
    source.distanceDisplayCondition
  );
  ...
};
// 导出几何体对象
export default EllipsoidGraphics;  
  • 然后是椭球的几何图形更新器
// 封账椭球体几何属性
function EllipsoidGeometryOptions(entity) {
  this.id = entity;
  this.vertexFormat = undefined;
  this.radii = undefined;
  ...
}

// 定义更新器
function EllipsoidGeometryUpdater(entity, scene) {
  // 绑定基类更新器的this,并传递参数
  GeometryUpdater.call(this, {
    entity: entity,
    scene: scene,
    geometryOptions: new EllipsoidGeometryOptions(entity),
    geometryPropertyName: "ellipsoid",
    observedPropertyNames: [
      "availability",
      "position",
      "orientation",
      "ellipsoid",
    ],
  });

  this._onEntityPropertyChanged(
    entity,
    "ellipsoid",
    entity.ellipsoid,
    undefined
  );
}
    
// 定义原型属性
Object.defineProperties(EllipsoidGeometryUpdater.prototype, {
  terrainOffsetProperty: {
    get: function () {
      return this._terrainOffsetProperty;
    },
  },
});
// 创建几何体填充实例
EllipsoidGeometryUpdater.prototype.createFillGeometryInstance = function(){}
// 创建几何体外边线实例
EllipsoidGeometryUpdater.prototype.createOutlineGeometryInstance = function(){}
// 计算中心
EllipsoidGeometryUpdater.prototype._computeCenter
// 是否隐藏
EllipsoidGeometryUpdater.prototype._isHidden
// 是否开启动态
EllipsoidGeometryUpdater.prototype._isDynamic
// 设置静态属性
EllipsoidGeometryUpdater.prototype._setStaticOptions
// 属性更新事件
EllipsoidGeometryUpdater.prototype._onEntityPropertyChanged = heightReferenceOnEntityPropertyChanged;
// 动态几何更新器
EllipsoidGeometryUpdater.DynamicGeometryUpdater = DynamicEllipsoidGeometryUpdater;
// 定义更新函数
DynamicEllipsoidGeometryUpdater.prototype.update = function(){}

# 可视化器

包含广告牌、标签、模型、路径、点、几何体等等

以几何体为例

// 引入各种updater
const geometryUpdaters = [
  BoxGeometryUpdater,
  CylinderGeometryUpdater,
  CorridorGeometryUpdater,
  EllipseGeometryUpdater,
  EllipsoidGeometryUpdater,
  PlaneGeometryUpdater,
  PolygonGeometryUpdater,
  PolylineVolumeGeometryUpdater,
  RectangleGeometryUpdater,
  WallGeometryUpdater,
];

// 构建几何体updater的几何对象
function GeometryUpdaterSet(entity, scene) {
  this.entity = entity;
  this.scene = scene;
  const updaters = new Array(geometryUpdaters.length);
  // 几何体发生变化的事件
  const geometryChanged = new Event();
  // 触发事件,并传递几何体参数
  function raiseEvent(geometry) {
    geometryChanged.raiseEvent(geometry);
  }
  const eventHelper = new EventHelper();
  // 循环场景更新器实例
  for (let i = 0; i < updaters.length; i++) {
    const updater = new geometryUpdaters[i](entity, scene);
    eventHelper.add(updater.geometryChanged, raiseEvent);
    updaters[i] = updater;
  }
  this.updaters = updaters;
  this.geometryChanged = geometryChanged;
  this.eventHelper = eventHelper;
  //  注册实体定义变化的订阅
  this._removeEntitySubscription = entity.definitionChanged.addEventListener(
    GeometryUpdaterSet.prototype._onEntityPropertyChanged,
    this
  );
}

// 属性改变触发
GeometryUpdaterSet.prototype._onEntityPropertyChanged = function(){}
// 封装foreach函数
GeometryUpdaterSet.prototype.forEach = function(){}
// 销毁函数
GeometryUpdaterSet.prototype.destory = function(){}

// 定义visualizer构造器
function GeometryVisualizer(
  scene,
  entityCollection,
  primitives,
  groundPrimitives
) {}

// 更新函数,更新所有的pimitives
GeometryVisualizer.prototype.update = function(){}
// 获取边界球
GeometryVisualizer.prototype.getBoundingSphere = function(){}
// 销毁所有的primitives
GeometryVisualizer.prototype.destory = function(){}

// 定义了若干事件
GeometryVisualizer._onGeometryChanged = function(){}
GeometryVisualizer._onCollectionChanged = function(){}

// 最后导出
export default GeometryVisualizer;

# Entity

Entity是cesium中的重要概念,它可以包含多个几何体,用于描述场景中的对象或者元素。

primitives用于绘制基本的几何形状,例如点、线、面

// Entity构造函数
function Entity(options) {
  options = defaultValue(options, defaultValue.EMPTY_OBJECT);

  let id = options.id;
  if (!defined(id)) {
    id = createGuid();
  }

  this._availability = undefined;
  this._id = id;
  this._definitionChanged = new Event();
  this._name = options.name;
  this._show = defaultValue(options.show, true);
  this._parent = undefined;
  this._propertyNames = [
    "billboard",
    "box",
    //...
  ];

  this._billboard = undefined;
  this._billboardSubscription = undefined;
  this._box = undefined;
  this._boxSubscription = undefined;
  //...
  this._children = [];

  this.entityCollection = undefined;

  this.parent = options.parent;
  this.merge(options);
}

// 递归更新元素的显示
function updateShow(entity, children, isShowing) {
  const length = children.length;
  for (let i = 0; i < length; i++) {
    const child = children[i];
    const childShow = child._show;
    const oldValue = !isShowing && childShow;
    const newValue = isShowing && childShow;
    if (oldValue !== newValue) {
      updateShow(child, child._children, isShowing);
    }
  }
  entity._definitionChanged.raiseEvent(
    entity,
    "isShowing",
    isShowing,
    !isShowing
  );
}

// 定义若干属性
Object.defineProperties(Entity.prototype, {
  availability: createRawPropertyDescriptor("availability"),
  id: {
    get: function () {
      return this._id;
    },
  },
  definitionChanged: {
    get: function () {
      return this._definitionChanged;
    },
  },
  name: createRawPropertyDescriptor("name"),
  show: {
    get: function () {
      return this._show;
    },
    set: function (value) {
      //>>includeStart('debug', pragmas.debug);
      if (!defined(value)) {
        throw new DeveloperError("value is required.");
      }
      //>>includeEnd('debug');

      if (value === this._show) {
        return;
      }

      const wasShowing = this.isShowing;
      this._show = value;
      const isShowing = this.isShowing;

      if (wasShowing !== isShowing) {
        updateShow(this, this._children, isShowing);
      }

      this._definitionChanged.raiseEvent(this, "show", value, !value);
    },
  },
  // 各种几何图形
  billboard: createPropertyTypeDescriptor("billboard", BillboardGraphics),
  box: createPropertyTypeDescriptor("box", BoxGraphics),
  corridor: createPropertyTypeDescriptor("corridor", CorridorGraphics),
  //...
})

// 给定时间,判断是否可访问
Entity.prototype.isAvailable = function (time) {}
// 添加属性
Entity.prototype.addProperty = function (propertyName) {}
// 移除属性
Entity.prototype.removeProperty = function (propertyName) {}
// 融合默认属性
Entity.prototype.merge = function (source) {}
// 计算模型矩阵
Entity.prototype.computeModelMatrix = function (time, result) {}


Entity.supportsMaterialsforEntitiesOnTerrain = function (scene) {}
Entity.supportsPolylinesOnTerrain = function (scene) {}

# 矢量数据源(补充)

  • KML数据加载与展示

  • GeoJson数据源

  • GPX数据源

  • 自定义数据源

# 其他

  • 属性:位置、材质、速度等等

# Shader

  • 着色器程序管理(Shader Program Management)Shader 模块提供了着色器程序的创建、编译和链接功能。它允许开发者定义和管理顶点着色器和片元着色器,并将它们组合成可用的着色器程序。
  • 着色器程序输入(Shader Program Inputs)Shader 模块定义了着色器程序的输入变量,如顶点坐标、法线、纹理坐标等。开发者可以通过定义这些输入变量来与渲染管道中的数据进行交互。
  • 着色器程序输出(Shader Program Outputs)Shader 模块定义了着色器程序的输出,如片元颜色、深度值等。开发者可以通过定义这些输出来指定着色器程序的渲染结果。
  • 着色器程序内置变量(Shader Program Built-in Variables)Shader 模块提供了一些内置变量,用于访问渲染管道中的一些常用信息。例如,内置变量可以访问相机信息、光照信息、材质属性等。
  • 着色器程序宏定义(Shader Program Macros)Shader 模块支持宏定义,允许开发者在着色器程序中定义和使用宏。宏定义可以用于条件编译、预处理指令等,以实现更灵活的着色器编程。
  • 着色器程序内置函数(Shader Program Built-in Functions)Shader 模块提供了一些内置函数,用于在着色器程序中执行常见的计算和操作。这些内置函数可以用于矩阵操作、向量运算、纹理采样等。
  • 着色器程序扩展(Shader Program Extensions)Shader 模块支持着色器程序的扩展功能。开发者可以使用扩展来添加额外的着色器特性和效果,以满足特定的渲染需求。
  • 着色器程序预编译(Shader Program Precompilation)Shader 模块支持着色器程序的预编译功能。这可以提前编译着色器程序,以加快渲染过程中的加载和初始化速度。

# Documentation 文档

Documentation
├── Contributors 
│   ├── BuildGuide // 在本地构建和运行文档
│   ├── CodingGuide // JS和GLSL编码规范,设计、可维护性和性能的最佳实践
│   ├── DocumentationGuide // 如何写出好的参考文档
│   ├── PerformanceTestingGuide // 测量运行时性能的最佳实践
│   ├── TestingGuide // 如何编写和运行cesium测试
│   └── VSCodeGuide // vscode 相关设置
├── CustomShaderGuide // 自定义着色器指南
├── FabricGuide // 材质指南
├── OfflineGuide // 离线使用指南
└── Schemas
    └── Fabric

# 其他

# Specs 测试

  • Data 测试数据
  • TestWorkers

# ThirdParty 第三方库

# Apps 应用示例

  • Sandcastle

  • TimelineDemo

Last Updated: 11/18/2024, 4:01:47 PM