深色模式
数据、版本与资料
这本教材面向公开读者,正文与示例不要求登录或提供访问令牌。文章和示例由同一个仓库构建,代码面板展示对应实验的源文件。数学符号从含义和单位开始解释,可配合数学基础与中英文术语表阅读。
什么在服务器运行,什么在浏览器运行
Cloudflare Pages 提供 HTML、JavaScript、样式、图片、Cesium 引擎资源和随仓库保存的小型静态数据。本阶段全部数据随 Pages 站点发布,不接入 R2、S3 或其他对象存储。 运行时合成的网格与粒子初态直接在浏览器内存创建,不上传到服务器。Cesium 的 WebGL 绘制、纹理采样、GPU 粒子状态更新与交互控件在读者设备上运行。浏览器的 Web Worker 与 Cloudflare Workers 是不同的东西:前者处理客户端任务,后者是服务器运行时;本教程的示例不依赖后者,也不需要业务 API、数据库或实时气象下载服务。正文中的外部资料链接用于延伸阅读,不是实验运行的数据依赖。
首次打开实验需要下载引擎和本站静态资源。当前实验以支持 WebGL2 的浏览器为目标,风粒子还需要可渲染的浮点纹理;浏览器、驱动或设备能力不足时,正文、图解与源码仍可阅读。静态构建成功不等于已经证明每台设备的 GPU 路径可用。GPU 帧率取决于设备、浏览器、分辨率及当前负载,不代表 Cloudflare 服务器速度。
正文代码与实验源码的阅读约定
正文代码是围绕一个概念的短片段。除第二课外,使用 viewer 的片段沿用该课已经创建的 Viewer;Cesium 表示 import * as Cesium from 'cesium' 得到的命名空间。实验实现有时将同一个命名空间简写为 C,只是局部变量名不同。片段会省略已说明的容器、CSS、静态资源配置和初始化;异步 await 代码应在 async 函数或支持顶层 await 的 ES 模块中执行。只构造 Geometry 或 Material 的片段不等于已经完成场景绘制。
完整的实验运行模块可从实验室进入,在“查看运行源码”中选择 TypeScript 或 GLSL 文件;它们需要配套宿主、依赖和资源,不能直接当成独立 HTML 粘贴。原理性的伪代码会明确标注,例如第 22 课的内部命令装配和第 30 课的异步保护。prepare()、apply() 等概念函数不是 Cesium API,也不是被遗漏的可下载库。
正文中以 /data/ 开头的地址指本站根目录的真实公开资产。在自己的工程复现时,应复制相应文件并核对部署路径。当前 GeoJSON 教学点与 3D Tiles 教学入口随 Pages 发布;前者的经纬度、椭球高与属性均为教学构造,按 CC0 提供。
数据清单
| 数据 | 来源与用途 | 性质与限制 |
|---|---|---|
| 全球底图 | Cesium 随包提供的 Natural Earth II 小型栅格 | Natural Earth 公共领域数据;仅作定位背景,不用于精确行政边界判断 |
| GeoJSON 教学点 | 一个内联 Feature 及内容相同的静态文件 | CC0;114°E、22°N、椭球高 1000 m 均为构造值,不是真实观测站 |
| 坐标轴、网格与几何 | 运行时使用公式创建 | 教学几何,比例与高度可能为观察而夸张 |
| 地形 | 平滑包络与周期函数合成 | 不对应任何真实山脉,明确显示“合成地形” |
| 标量场 | 区域网格上的规则函数或锋面、局部异常和多尺度波叠加 | 归一化值 s 映射为 T = 10 + 20s °C,仅为教学范围 |
| 风场 | 匀速规则场,或急流、涡旋与扰动叠加 | U/V 以 m/s 表示;不满足完整大气动力方程,也不是预报 |
| 曲线网格 | 对逻辑网格施加确定性平滑经纬变换 | 展示网格拓扑与空间位置分离,不代表特定模式网格 |
| glTF 与 3D Tiles | 12 栋程序生成的方块建筑,位于香港附近的教学锚点 | CC0 合成资产,不对应真实建筑;单叶瓦片用于理解加载关系 |
| 剖面 | 三维解析标量函数的切片 | 位置与高度可调整;显示夸张不会改变原始采样值 |
Natural Earth 数据许可允许公开使用。引擎及其附带资源仍保留原始第三方许可与署名,Cesium 的 credit 显示不会被隐藏。地理背景仅用于教学。
本站随资源分发原始许可文件:Cesium 与第三方完整许可(下载原文)、第三方组件清单、补充组件清单。
为什么同时提供规则场与拟真合成场
规则场具有容易预测的结构,适合验证方向、插值、单位和边界。拟真合成场则包含锋面、局部峰值、多尺度变化、弯曲流线与缺测区域,让算法面对更接近实际数据形态的输入。它们承担不同的验证任务。
“拟真”只指形态接近,不能证明物理正确。视觉上像涡旋,并不意味着满足质量守恒、动量守恒或完整边界条件。本教程不会将合成场包装为真实观测。
标量实验在 48 × 36 网格上保存两个时刻,RGBA8 的 R/G 通道分别表示两个时刻的归一化值,B 表示有效性。离散编码的分辨率约为 20 / 255 ≈ 0.078 °C;它适合小型教学实验,生产科学数据应根据误差要求选择浮点或其他编码。场函数采用固定参数;粒子初始分布使用固定种子(random seed)。这些定义均可在实验源码及 examples/fields.ts 中查看。确定性输入便于复现,但不同设备的浮点运算与驱动不保证长时间轨迹逐位相同。
时间滑块对两份数值做线性插值,然后映射颜色。这不等于求解天气系统的运动,也不保证移动锋面的形状守恒。标量 shader 对双线性采样采用保守有效性规则:参与计算且权重非零的邻居中,只要存在缺测就丢弃当前片元;权重为零的缺测邻居不会抹掉精确有效格点。规则会影响缺测边缘的显示范围,不等于补齐了缺失观测。
当前实验做到了哪一步
教学原理、可运行实验和进一步扩展分别标记。下面的边界以仓库中的当前实现为准,不代表跨设备性能认证。
| 实验 | 当前计算路径 | 阅读时需要保留的边界 |
|---|---|---|
| 标量 | 48×36 RGBA8 数据纹理;GLSL 手动最近邻/双线性;两帧数值混合后配色 | 色彩经过量化;没有三次采样开关,也没有真实预报数据 |
| 等值线 | 片元 shader 判断指定温度或等间隔阈值,使用屏幕导数估算线宽 | 没有输出矢量折线、Marching Squares Worker 或静态标签;平坦/量化区域线宽并非处处精确 |
| 风粒子 | 静态 U/V 浮点纹理;GPU 乒乓状态更新;球面局部 Euler 积分;点绘制 | 区域范围为 111–117°E、20–25°N;没有轨迹历史、RK2、多时刻预报或全球极区验证 |
| 曲线网格 | 弯曲节点经纬位置,保持逻辑 UV 对应;三角网格上采样合成标量 | 说明逻辑网格和空间位置的区别,没有实现通用模式网格重采样器 |
| 剖面 | 从解析三维函数 f(x,y,z) 取得定纬高度切片,构成三维幕墙 | 是 section,不是 volume ray marching;压力坐标与测地线剖面在正文中推导 |
| 建筑与 3D Tiles | 自托管程序生成 glTF 与单叶 tileset | 用于定位与加载关系,不展示多级 LOD 的性能收益 |
剖面数据的物理高度参数是 0–12 km。当前显示公式为 h_display = 1 km + E × h_data:E 是无量纲夸张倍数,1 km 是避免与地球表面重叠的显示偏移。几何的椭球高、原始高度标签和大气压力层的位势高度是不同含义,不应互相代替。
浏览器能显示彩色画面,不能单独证明地理位置、科学值和性能都正确。公式例子用于建立预期值;CPU 对照、GPU 数值检查、交互观察和性能记录各自回答不同问题。正文中的“应检查”“可比较”是读者可执行的验收方法,不表示本站已经认证全部浏览器和设备。
版本边界
| 层 | 固定版本 | 教学约定 |
|---|---|---|
| CesiumJS | 1.145.0 | 对应固定版本源码链接 |
| @cesium/engine | 26.3.0 | 通过 overrides 与 lockfile 精确固定 |
| @cesium/widgets | 16.2.0 | 与该版本引擎配套 |
| VitePress | 1.6.4 | 生成静态文档站 |
Viewer、Scene、Camera 等公开接口优先按官方参考理解。Texture、Framebuffer、DrawCommand、ComputeCommand、RenderState 及命令列表属于引擎内部集成边界,即使可以从命名空间取得,也不能据此认为它们是稳定 public API。内部代码升级需要重新验证。
阅读一手资料
- CesiumJS 官方学习入口:教程与示例。
- CesiumJS API Reference:参考站可能随最新版本更新,需要和本书固定版本区分。
- Cesium 1.145 源码:理解本书内部实现的固定基线。
- Khronos WebGL 2 规范:状态、纹理与渲染行为的规范来源。
- RFC 7946 GeoJSON:经纬度顺序、WGS84 高度及地理要素约定。
- CF 数据约定:坐标、网格、单位与缺测等元信息。
- OGC 3D Tiles:三维空间数据分层传输标准。
- Cloudflare Pages 的 VitePress 部署指南:静态站部署方式。
本书图解为教学示意,概念流程经过简化;真实执行路径会随场景、pass、缓存与设备能力变化。实验读数会区分对象数量、绘制次数与帧率,不将它们当作同一个性能指标。