PRD:UE + Cesium + PCG 全球分块真实世界地形与建筑程序化生成#
版本 v0.1 | 2026-08-01 | 状态:草案
1. 背景与目标#
在 UE5 中通过 Cesium for Unreal 呈现可交互的三维地球,表面叠加 360×180 的 经纬网格(1°×1°)。用户点选任意一格,系统拉取该区域真实地理数据(地形高程、 建筑轮廓与高度,可选道路/水系/植被),通过 PCG 在该区域程序化生成/实例化出 与真实世界一致的地形与建筑体量,并可进入第一/第三人称漫游。
核心价值:把"看地图"变成"进入地图"。选中地球上任意一块区域,几十秒内得到一个 可行走、可用于后续玩法或仿真的真实世界场景。
目标(v1):
- 全球任意陆地区域可选、可生成,不依赖预先手工制作的关卡。
- 地理正确:位置、朝向、平面体量、高度与现实一致(体量级精度,非立面级)。
- 单个生成单元(细分后约 1–2 km)30 秒内完成,运行时 60 FPS(RTX 4070 级)。
- 地形与建筑数据源可替换,为后续自建地形和更高精度数据留出接口。
非目标(v1):
- 不做建筑内部空间。
- 不做立面级精确还原(门窗与真实照片一致)。
- 不做全球一次性离线烘焙数据集。
- 不做自建地形(v2,本文档仅说明方向)。
2. 术语#
| 术语 | 说明 |
|---|---|
| Region | 1°×1° 顶层格子,全球共 360×180 = 64,800 个 |
| Tile | Region 四叉树细分后的生成单元,实际执行 PCG 的最小粒度 |
| Level (L) | 细分层级,L0 = Region,每 +1 级边长减半 |
| mesh terrain | 以三角网格表达的地形,区别于 UE Landscape 的平面高度场 |
| PCG | UE 的 Procedural Content Generation 框架 |
| 体量建筑 | 平面轮廓沿法线挤出得到的建筑,有屋顶、无内部结构 |
| 保底高度 | 无任何高度数据来源时按建筑类型套用的默认高度 |
3. 数据规模评估(回答"1°×1° 会不会太大")#
结论:1°×1° 明显太大,必须细分。 赤道处 1°×1° ≈ 111 km × 111 km ≈ 12,300 km², 比整个东京都(2,194 km²)还大 5 倍。
按 OSM 建筑密度估算单格建筑数量:
| 区域类型 | 密度(栋/km²) | 1°×1° 建筑数 | 结论 |
|---|---|---|---|
| 荒漠/海洋 | ~0 | 0 | 无意义 |
| 农村 | 50–200 | 60 万–250 万 | 完全不可行 |
| 城市郊区 | 500–1,000 | 600 万–1,200 万 | 完全不可行 |
| 东京/上海核心区 | 2,000–3,000 | — | 单城市已远超预算 |
各细分层级的实际尺寸与建筑量(赤道;高纬度东西向按 cos(lat) 收窄):
| Level | 边长 | 面积 | 每 Region 子块数 | 东京密度下建筑数 | 评价 |
|---|---|---|---|---|---|
| L0 | 111 km | 12,300 km² | 1 | ~2,900 万 | 不可行 |
| L3 | 13.9 km | 193 km² | 64 | ~46 万 | 太大 |
| L5 | 3.5 km | 12 km² | 1,024 | ~29,000 | 偏大,可作大范围预览 |
| L6 | 1.7 km | 3.0 km² | 4,096 | ~7,200 | 默认生成单元 |
| L7 | 0.87 km | 0.76 km² | 16,384 | ~1,800 | 高密度城区回退档 |
设计取值:
- L6 为默认生成单元(1.7 km 见方,约 7,000 栋上限),符合 30 秒生成目标。
- 允许范围 L4–L7。生成前先做轻量 count 预检,建筑数 > 15,000 自动降一级。
- 360×180 保留为顶层选择索引,不作为生成单元。用户先点 Region, 再在放大后的四叉树网格中点具体 Tile;支持框选相邻多 Tile 批量生成。
4. 用户流程#
- 进入地球视图:相机在轨道高度,Cesium World Terrain + 影像底图, 可旋转/缩放/平移。
- 显示网格:叠加 1°×1° 经纬网格,随相机高度自动稀疏化(远处只画 10° 主网格)。
- 悬停反馈:格子高亮,Tooltip 显示经纬范围、所在国家地区、预估建筑数、 数据可用性。
- 选中 Region:点击后相机飞向该格,网格切换为四叉树细分显示。
- 选中 Tile:打开生成面板,可配置细分层级、生成内容开关(地形/建筑/道路/
水系/植被)、建筑高度来源与保底策略、屋顶样式;支持
预览轮廓/开始生成/清除。 - 生成中:分阶段进度显示,可取消。
- 完成:相机降落到 Tile 上方,显示统计(建筑数、面数、耗时、高度数据覆盖率)。
可
进入漫游或返回地球。 - 多块管理:列表显示已生成 Tile,可单独隐藏/卸载/重新生成。
5. 数据源#
| 类型 | 主选 | 备选 / 回退 |
|---|---|---|
| 影像底图 | Cesium ion Bing/Sentinel-2 | 自建 XYZ 瓦片服务 |
| 地形高程 | Cesium World Terrain | Copernicus DEM 30m / SRTM(v2 自建用) |
| 建筑轮廓 | OSM | Microsoft/Google Open Buildings(无高度) |
| 建筑高度 | OSM height / building:levels |
3D-GloBFP、LiDAR nDSM、类型保底值 |
| 道路/水系 | OSM | — |
| 地表分类 | ESA WorldCover 10m | OSM landuse |
数据获取方式(工具层面):
- OSM 数据服务:不直连公共 Overpass API(速率限制严格,生产不可靠)。 用 Geofabrik 区域 PBF + osmium 抽取 + PMTiles 打包,由本地/内网服务按范围提供。 开发期可临时用公共 Overpass 打通链路。
- 本地缓存:拉取结果按 Tile 落盘缓存,带版本号与有效期,命中则跳过网络。
- 离线预烘焙工具:Python + GDAL/osmium 批量把指定 Region 预处理为自定义 数据包,用于演示与无网环境。
6. 技术选型#
6.1 地球与地形:Cesium for Unreal + Cesium World Terrain(mesh terrain)#
采用 Cesium for Unreal 插件(UE 官方商城免费提供)承载地球与地形, 在 UE 内直接复用 Cesium World Terrain,不做二次转换。
能力覆盖:
- Cesium World Terrain 以 3D Tiles / quantized-mesh 形式流式下发,插件在 UE 内 转为 mesh terrain(三角网格几何体),而非 UE Landscape 的高度场。
- 全球无缝、LOD 分级、按相机距离流式加载/卸载,均由插件自动管理。
- 提供可视表面、物理碰撞,以及地形高度查询能力,供建筑坐落使用。
- 影像底图作为栅格图层叠加到同一地形网格上。
为什么用 mesh terrain 而不是 Landscape:
- Landscape 是平面高度场,无法贴合地球椭球曲率,全球尺度下必然出现地平线错误。
- mesh terrain 天然支持不规则三角化与非轴对齐地形,也能表达陡崖、悬垂等结构。
- 与 Cesium 的瓦片调度天然匹配,无需在 Landscape 与瓦片之间做接缝处理。
代价(可接受):地形不可编辑、不可挖填、分辨率受数据源限制(全球约 30 m, 部分地区更高)。需要可编辑地形的场景见 6.6。
6.2 程序化生成:UE 5.8 PCG Framework#
采用 UE 5.8 的 PCG(Procedural Content Generation)框架作为生成核心。
用到的 PCG 能力:
- 自定义数据节点:把地理数据(建筑轮廓、属性)接入 PCG 图,作为生成起点。
- 属性集(Attribute Set):每栋建筑携带轮廓、高度、类型、屋顶形式、 地面高程等属性,驱动后续分支逻辑。
- Dynamic Mesh / Geometry Script 节点:把二维轮廓转为三维体量(三角化 + 挤出
- 屋顶 + UV),是建筑生成的主力。5.8 的 PCG 已把动态网格作为一等数据类型。
- GPU / Compute 加速节点:适用于大批量点集的过滤、变换、散布计算, 用于提升高密度城区的生成吞吐。
- Instanced Static Mesh Spawner:把可归类的规整建筑与屋顶附件、植被、 路侧设施等以实例化方式生成,控制 draw call 与内存。
- 运行时生成(Runtime Generation)+ 分层生成(Hierarchical Generation): 支持按需、分批、随相机距离分级生成,配合取消与卸载。
- 确定性与缓存:同一 Tile 多次生成结果一致,便于多端/多次复现。
PCG 之外配套:
- Geometry Script:轮廓三角化、挤出、简化、UV 生成的底层能力提供者。
- C++ 数据层:负责网络拉取、格式解析、轮廓几何清理(自相交/带洞/退化), 以纯数据形式交给 PCG,不在 PCG 图内做重解析工作。
6.3 建筑高度:多级回退 + 保底默认值#
现实约束:全球 OSM 建筑中带高度信息的不足 15%,大量地区完全没有。 因此高度必须走回退链,且最末端必须有保底值,保证任何区域都能生成。
回退优先级(自上而下,取第一个可用):
| 优先级 | 来源 | 说明 | 标记 |
|---|---|---|---|
| 1 | OSM height |
实测/明确标注的米数,最可信 | 实测 |
| 2 | OSM building:levels |
层数 × 层高(默认 3 m/层,可配置) | 推算 |
| 3 | 第三方高度数据集 | 3D-GloBFP、本地 LiDAR nDSM 等 | 数据集 |
| 4 | 按建筑类型保底值 | 依 building 标签套用默认高度 |
估算 |
| 5 | 全局保底值 | 类型未知/无标签时统一默认(默认 9 m) | 估算 |
按类型的保底高度参考表(可在项目设置中调整):
| 建筑类型 | 默认高度 | 建筑类型 | 默认高度 |
|---|---|---|---|
| house / detached(独栋住宅) | 6 m | apartments(公寓) | 18 m |
| residential(住宅) | 9 m | office(写字楼) | 30 m |
| retail / commercial(商业) | 12 m | industrial / warehouse(工业) | 9 m |
| school / hospital(公共) | 15 m | garage / shed(附属) | 3 m |
| church(宗教) | 15 m | yes / 未知 | 9 m |
配套规则:
- 地区修正系数:按国家/城市与市中心距离对保底值做整体缩放,避免用一套欧美 默认值套到全球(如东京近郊与美国郊区的典型层高差异)。
- 可信度可视化:估算高度的建筑在 UI 中可切换标记(如轻微色调区分), 并在生成统计中给出高度数据覆盖率(实测/推算/估算各占比)。
- 用户可覆盖:层高、各类型保底值、全局保底值均暴露为可配置参数。
- 随机扰动:同类型保底建筑加入小幅高度随机(±15%),避免整片等高的假象。
6.4 坐标与精度:Cesium Georeference + GlobeAnchor + LWC#
- CesiumGeoreference:负责经纬高与 UE 世界坐标的双向转换,是全场景的地理基准。
- CesiumGlobeAnchorComponent:生成的建筑挂在带 GlobeAnchor 的容器上, 相机远距离移动导致原点 rebase 时自动保持地理位置正确,不会漂移。
- Large World Coordinates(LWC):UE5 的双精度世界坐标,配合按 Tile 分组的 局部坐标系,保证 km 级区域内的几何精度不受地球尺度影响。
- 高程基准统一:统一使用椭球高,与 Cesium 保持一致,避免大地水准面差异 导致建筑悬浮或沉入地面。
6.5 性能与规模:Nanite + World Partition + 实例化#
| 目标 | 采用技术 |
|---|---|
| 海量建筑几何 | Nanite 自动 LOD,免手工制作 LOD 链 |
| 降低 draw call | HISM / PCG 实例化生成器,规整建筑与附件走实例化 |
| 分块加载卸载 | World Partition + Data Layer,按 Tile 组织可独立卸载 |
| 生成不卡顿 | PCG 运行时生成 + 分帧预算,几何构建放异步线程 |
| 内存控制 | Tile 级 LRU 淘汰,保留磁盘缓存,可配置驻留数量 |
| 远处剔除 | HISM cull distance + 分层生成的距离分级 |
6.6 附加要素(v1 可选开关)#
| 要素 | 采用技术 |
|---|---|
| 道路 | OSM 线要素 → Spline → PCG Spline Sampler 沿线生成路面与路侧设施 |
| 水系 | OSM 面要素 → 平面水体网格 + Water 材质 |
| 植被 | ESA WorldCover 分类 + OSM landuse 掩膜 → PCG 散布 + Nanite 植被 |
| 漫游 | 标准 Character/Pawn,碰撞来自 Cesium 地形与建筑网格 |
6.7 后续方向:自建地形(v2,本期不实现)#
v1 复用 Cesium World Terrain,但地形不可编辑。后续确定需要自建,届时的技术方向:
- 数据源:Copernicus DEM 30 m / SRTM 全球栅格,局部替换为高精度 LiDAR DEM (可达 1 m 级);用 GDAL 类工具做重采样、裁切、坐标转换预处理。
- 生成方式:仍走 mesh terrain(Dynamic Mesh / Geometry Script 生成分块 三角网格),不用 Landscape,理由同 6.1,且便于按需加密与非均匀三角化。
- 新增能力:可挖填与破坏、地形与建筑/道路的融合(建筑基座压平、路堤路堑)、 自定义地表材质分层与卫星影像混合。
- 主要挑战:与 Cesium 地形的接缝与遮挡处理、自建 LOD 与流式调度、 法线与材质连续性、生成耗时控制。
- v1 需要预留的:地形高度查询与地形网格来源做接口抽象,使 Cesium 地形与 自建地形可替换,建筑生成逻辑不感知地形来源。
7. 关键风险与对策#
| 风险 | 影响 | 对策 |
|---|---|---|
| 建筑高度数据大面积缺失 | 高度失真 | 五级回退链 + 类型保底值 + 地区修正 + 覆盖率透明化(见 6.3) |
| 公共 Overpass 限流/封禁 | 生成失败 | 自建 OSM 数据服务,缓存优先,失败退避重试 |
| Cesium ion 配额与 token 管理 | 服务中断 | token 服务端托管,监控配额,保留自建瓦片开关 |
| 轮廓自相交/带洞/退化 | 生成异常 | 数据层统一几何清理,失败个体跳过并记录,不影响整块 |
| 高密度城区超预算 | 超时/掉帧 | count 预检 + 自动降级层级 + 分帧生成预算 |
| 相机远距移动原点 rebase | 几何漂移 | GlobeAnchor + Tile 局部坐标,纳入回归测试 |
| 高纬度格子东西向收窄 | 面积不一致 | 面积按纬度换算,极区用更低层级或禁用 |
| Cesium 地形分辨率不足(30 m) | 微地形缺失 | v1 接受;v2 自建地形替换为高精度 DEM |
| UE 5.8 PCG 新特性稳定性 | 返工风险 | M1 阶段先做技术验证,确认关键节点行为后再铺开 |
8. 里程碑#
| 阶段 | 内容 | 验收 |
|---|---|---|
| M0 技术验证 | Cesium 地形 + UE 5.8 PCG 关键节点打通,跑通单栋建筑挤出 | 关键技术无阻塞 |
| M1 地球与选择 | 地球 + 1°×1° 网格 + 四叉树细分 + 点选高亮 | 点击能得到正确 Tile 与经纬范围 |
| M2 数据接入 | OSM 数据服务 + 解析 + 缓存 + 轮廓线框预览 | 轮廓显示在正确地理位置 |
| M3 建筑生成 | PCG 挤出 + 地形坐落 + 高度回退链 + 基础材质 | 样例块与卫星图目视对齐 |
| M4 性能与规模 | 异步分帧、实例化、LRU 卸载、count 预检降级 | 单 L6 块 ≤ 30 s,8 块驻留 60 FPS |
| M5 体验完善 | 生成面板、进度取消、漫游、已生成列表 | 连续生成 20 块无崩溃 |
| M6 附加要素 | 道路/水系/植被开关,屋顶样式,地区风格 | 各要素独立可控且互不穿插 |
9. 验收指标#
- 位置精度:建筑轮廓与影像底图偏差 < 2 m(同数据源基准下)。
- 高度可信度:有 OSM height 的建筑误差 < 1 m;估算建筑明确标记并统计覆盖率。
- 保底有效性:任意陆地 Tile 只要有建筑轮廓就必须能生成,无高度数据不阻塞生成。
- 生成耗时:L6 城区块(约 7,000 栋)冷启动 ≤ 30 s,缓存命中 ≤ 8 s。
- 运行帧率:8 个 L6 块驻留、贴地漫游 ≥ 60 FPS(RTX 4070 / 1440p)。
- 稳定性:连续生成 50 个随机陆地 Tile 无崩溃,失败块有明确提示。
- 数据健壮性:轮廓解析失败率 < 0.5%,个体失败不影响整块。
10. 待确认问题#
- 目标平台:仅 Windows 编辑器/独立包,还是需考虑主机/移动端?
- 是否需要多人/联网一致性(同一 Tile 多客户端生成结果必须完全一致)?
- 数据合规:OSM 为 ODbL,衍生作品需署名与开放,商用发布是否可接受?
- 是否需要历史时间维度(某年的建筑状态)?会显著影响数据源选择。
- 建筑视觉标准:体量 + 程序化立面即可,还是后续要接倾斜摄影 / Google 3D Tiles?
- 是否需要编辑能力(生成后手动调整某栋建筑并持久化)?
- 自建地形的优先级与触发条件(哪些需求会把 6.7 提前到 v1)?