- blender/generate_nantaizi.py → blender/generate_scene.py(去硬编码路径, --geojson 改为可选,--office-overrides 替代硬编码 way ID) - blender/export_cesium.py CLI 参数改为必传,修复隐藏物体导出崩溃 - blender/README.md 重写为中文通用文档 - config/default.json 路径改为占位符,template.json 新增 blender 配置块 - scripts/build-osm2streets-qgis.js 新增 layerPrefix 配置驱动 QGIS 图层名 - package.json name → osm-gis-pipeline - README.md 重写并增加实际运行示例
Blender 3D 场景生成
该生成器将 OSM 建筑、水体、植被标签,以及可选的 osm2streets GeoJSON 道路图层,组合为 Blender 3D 场景。
生成场景
/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"
--geojson 为可选参数。不提供时,道路使用简单的 OSM highway 折线,而非详细 osm2streets 几何。
使用 --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
/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 服务后打开预览页:
cd /path/to/output
python3 -m http.server 8765