深色模式
Viewer、Scene 与 Globe
遇到 viewer.scene.globe 这样一长串访问时,先不要记路径。把三个名字翻译成职责:Viewer 是应用级组合组件;Scene 是三维场景与渲染协调者;Globe 是场景中的地球表面。Viewer 还组合了时间轴、选择框和信息框等界面功能,因此关闭时间轴并不会让场景停止存在。
哪个对象负责什么
| 入口 | 适合表达的需求 |
|---|---|
viewer.entities | 标注、轨迹、业务对象及随时间变化的属性 |
viewer.dataSources | GeoJSON、CZML 等成组数据 |
viewer.scene.primitives | 直接加入几何、模型与底层绘制对象 |
viewer.scene.globe | 椭球、地形表面及相关遮挡行为 |
viewer.imageryLayers | 覆盖在地球表面的影像层 |
viewer.camera | 观察位置、方向与视锥 |
其中一些入口是便捷访问。例如 viewer.camera 指向场景的相机;便捷路径并不意味着又创建了一台相机。Entity 也不是直接提交给 GPU 的图元,它需要经过数据可视化组件转换为底层对象。
以下是接在第二课初始化之后的功能片段,沿用已经导入的 Cesium 命名空间和已创建的 viewer,省略容器与初始化代码。
js
const marker = viewer.entities.add({
name: '观测站',
position: Cesium.Cartesian3.fromDegrees(116.4, 39.9, 1000), // 经度°、纬度°、椭球高m
point: { pixelSize: 12, color: Cesium.Color.ORANGE },
});
viewer.scene.globe.show = false;
// marker 仍属于 entities;隐藏地球不等于删除观测站。
viewer.scene.globe.show = true;这个划分在气象应用中很实用:地球、地形与建筑构成空间参照;温度填色和风粒子表达动态场;图例和播放按钮属于页面界面。若把每个开关都实现成“重新创建 Viewer”,数据加载、相机位置和 GPU 资源都会一起被重置。
场景图不等于 DOM 树
HTML 元素通常由浏览器布局系统排版;Cesium 对象需要经过视图变换(view transformation)、剔除(culling)与渲染。视图变换把世界位置改写为相机所见的坐标;剔除则提前跳过不可能出现在画面里的内容。两者可以通过屏幕坐标关联,但并非同一棵树。一个 DOM 提示框盖在 canvas 上,只说明它处于页面上层,并不证明其对应地理点没有被山体挡住。
一帧的节奏
观察持续渲染与按需渲染,理解更新和绘制的关系。
在浏览器本地运行 · 无需账号 · 鼠标拖动旋转,滚轮缩放
底图:Natural Earth II(公共领域);其余几何和地形为教学合成。 数据说明
查看运行源码
此代码直接读取实际运行的实验模块。按 kind 分支定位当前实验,也可查看数据公式和 GLSL。
读取源码…观察任务: 旋转地球,把一个对象带到地球背面。区分“对象还在集合中”和“对象当前可见”两件事,再观察页面控件是否也跟着旋转。
展开解释
对象的存在由场景与数据集合管理;可见性还取决于视锥、遮挡、距离及绘制状态。普通页面控件保持屏幕位置,因为它们属于 DOM。设计弹窗时必须主动处理地理位置到屏幕位置的映射与遮挡判断。
官方延伸:Viewer 对象入口、Scene API。