# Blender 3D 场景生成 该生成器将 OSM 建筑、水体、植被标签,以及可选的 osm2streets GeoJSON 道路图层,组合为 Blender 3D 场景。 项目主入口是根目录的区域管线: ```bash npm run build:area -- --config config/areas/nantaizi-lake-innovation-valley.json --stages blender,cesium ``` 下面的命令适合单独调试 Blender 脚本。 ## 生成场景 ```bash /Applications/Blender.app/Contents/MacOS/Blender \ --background --factory-startup \ --python blender/generate_scene.py -- \ --osm "/path/to/input.osm" \ --geojson "/path/to/osm2streets_web_out" \ --output "/path/to/output.blend" \ --render "/path/to/preview.png" \ --tree-style natural ``` `--geojson` 为可选参数。不提供时,道路使用简单的 OSM highway 折线,而非详细 osm2streets 几何。实际资产生成建议先跑 `intermediates` 阶段,为 Blender 提供 osm2streets 道路面、标线、斑马线和箭头。 `--tree-style` 可选 `natural` 或 `procedural`。默认 `natural` 使用低面数树干和多层不规则树冠,形态比球形程序化树冠更自然,渲染也比外部 OBJ 树模型轻;`procedural` 最轻但更卡通。 使用 `--office-overrides` 指定一组 OSM way ID(逗号分隔),这些建筑将渲染为办公楼风格,即使其 OSM 标签为 `building=industrial`: ``` --office-overrides "117753521,117753535" ``` ### 说明 - OSM `bounds` 元素定义场景范围(排除远处的地铁等关系成员) - `natural=tree` 节点 → 独立树木(默认低面数自然树冠) - `natural=tree_row` 路径 → 沿路径均匀分布的树木 - `landuse=grass` → 绿色地面 - `natural=scrub` → 低矮灌木丛 - `amenity=fountain` → 低多边形喷泉 - 建筑:`building=industrial` → 厂房风格;其他 → 办公楼风格(带窗带) - 植被和建筑高度从 OSM `height` 标签读取 - 程序化细节(窗带、屋顶设备、树冠)不改变 OSM 体量 - 纹理使用 Poly Haven 的 1K CC0 纹理,打包在 `.blend` 内 ## 导出为 Cesium GLB ```bash /Applications/Blender.app/Contents/MacOS/Blender \ --background \ --python blender/export_cesium.py -- \ --blend "/path/to/output.blend" \ --glb "/path/to/output_cesium.glb" \ --metadata "/path/to/output_cesium.json" ``` GLB 使用以 OSM bounds 中心为原点的局部 ENU 坐标系(X 东,Y 北,Z 上)。 使用配套的 JSON 元数据文件将模型放置到 Cesium 中。 导出脚本会: - 应用网格修改器并创建 UV - 将 Blender 特有材质转换为 glTF 兼容 PBR 材质 - 烘焙色调覆盖基础色以实现干净的 Web 渲染 - 将所有纹理图片嵌入 GLB - 写入包含 WGS84 锚点和 Cesium JS 辅助代码的 JSON 元数据 ### 预览 在输出目录上启动 HTTP 服务后打开预览页: ```bash cd /path/to/output python3 -m http.server 8765 ```