- 高德 GeoJSON 参考流程: `scripts/lib/gaode-junction-reference.js` 与 `scripts/inspect-junction-reference.js` 将 GCJ-02 参考转换为 WGS84, 按 node id/最近距离关联 OSM, 支持普通路口面和 `complex-cluster` 两种匹配。 - 复合路口模板 `complex-junction-v1`: `scripts/lib/complex-junction.js` 用参考 几何校准 core 半径, 生成路口面、进口路面、斑马线、停止线、角部圆角与安全岛; 拓扑/信号/连接全部沿用 OSM/native。 - 车道中心线控制要素避让: `compileLaneCenterlines` 现接收模板已产出的斑马线/停止线, 新增 `trimLaneOutsideControls` 按到路口中心的半径定向裁剪; 标线源几何同步裁剪, 不再 越过斑马线继续画到核心区。拓扑几何不变, connector 集合前后一致。 - 复合路口人行道转角: `buildComplexJunctionGeometry` 沿已定义的路缘生成 2m 宽转角带, 复用圆角曲线, 通过 `islands` 通道并入 `sidewalk_surface`; 自交或坐标非有限时报 `complex-junction-sidewalk-corner-fallback` 并跳过。 - 新增诊断: `complex-junction-configured-radius-ignored`、 `lane-centerline-fully-inside-control`、`complex-junction-sidewalk-corner-fallback`。 - 死码清理: 移除未被调用的 `clusterApproachRing`。 - spec 更新: `.trellis/spec/pipeline/cli-and-stages.md` 复合路口小节补充控制要素 避让顺序、人行道转角契约、Validation 矩阵三行; 索引新增导航。 - 任务产物 `08-19-gaode-junction-reference`: 8 条验收标准全部实测记录, Scope Drift / Verification Log / Known Gaps 三节沉淀本次工作。 Regression: test:native-road / test:road-workbench / test:preflight / test:native-preview-traffic / test:package-contract / test:traffic-signals / test:gaode-junction-reference 全绿; road:check ok=true, errors=[]。
100 lines
3.8 KiB
Markdown
100 lines
3.8 KiB
Markdown
# 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` 可选 `shapespark`、`natural`、`procedural`。
|
||
|
||
- `shapespark`——Shapespark low-poly plant kit,12 个确定性树变体,alpha 抠图卡片。
|
||
- `natural`——低面数树干 + 多层不规则树冠,不依赖外部模型。
|
||
- `procedural`——最轻,球形树冠。
|
||
|
||
`shapespark` 依赖 `assets/models/custom/shapespark_plants/` 下拆分后的第三方模型。
|
||
模型缺失时自动回落到 `natural`,干净 checkout 仍可构建;实际使用的样式记录在场景的
|
||
`tree_style_used` 属性里。
|
||
|
||
使用 `--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
|
||
|
||
导出脚本会优先使用 `tqdm` 显示固定在终端底部的进度条、速率和 ETA。它是可选依赖;未安装
|
||
时脚本自动回退为普通的 `CESIUM_EXPORT_PROGRESS` 日志,不会阻止导出。
|
||
|
||
macOS Blender 可用自带 Python 安装依赖:
|
||
|
||
```bash
|
||
/Applications/Blender.app/Contents/Resources/4.5/python/bin/python3.11 \
|
||
-m pip install -r blender/requirements.txt
|
||
```
|
||
|
||
若 Blender 安装路径或版本不同,使用对应的 `Resources/<version>/python/bin/python3.*`。
|
||
安装后必须使用同一 Blender 安装启动导出脚本,系统 Python 中安装的 `tqdm` 不会自动被
|
||
Blender 发现。
|
||
|
||
```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 中。
|
||
区域管线的 `cesium` 阶段还会在输出目录生成 `<area-id>-cesium-preview.html`。
|
||
|
||
导出脚本会:
|
||
- 应用网格修改器并创建 UV
|
||
- 将 Blender 特有材质转换为 glTF 兼容 PBR 材质
|
||
- 烘焙色调覆盖基础色以实现干净的 Web 渲染
|
||
- 将所有纹理图片嵌入 GLB
|
||
- 写入包含 WGS84 锚点和 Cesium JS 辅助代码的 JSON 元数据
|
||
|
||
### 预览
|
||
|
||
在输出目录上启动 HTTP 服务后打开预览页:
|
||
|
||
```bash
|
||
cd /path/to/output
|
||
python3 -m http.server 8765
|
||
```
|