Files
osmWorkflow/.trellis/tasks/archive/2026-08/08-05-cesium-traffic-signals/design.md

2.9 KiB
Raw Blame History

设计Cesium 路口信号灯可视化

分层边界

信号锚点不是 QGIS 业务图层:它不进入 GeoPackage、场景九图层或 QGIS 工程。intermediatesosm2streets_web_out/traffic_signals.json 写出它Blender 和 preview 都消费同一份文件。

Blender 的 05_Props 负责所有静态设施:灯杆、横杆、灯头、熄灭灯珠和倒计时牌外壳。它们 随 .blend 和主 GLB 导出成为正式场景的一部分。Cesium 预览只负责动态覆盖层:当前相位的 发光灯珠、七段倒计时数字、Signals 显示开关,以及车辆在红黄灯前的等待。这样静态造型只有 一份,浏览器不再用临时 Entity 重复搭建设施。

锚点与几何

中间阶段已有 vehicle_stop_linesintersection_surface。信号锚点生成器将停止线的 中点作为进口横向基准,依据相交路口面和停止线两端的方向判定来车朝向;灯杆置于停止线的 侧后方、道路外缘一侧,且朝向来车。没有可唯一关联的路口面、停止线过短或无法确定外侧时, 不输出锚点。

输出保存灯杆坐标、对应停止线坐标、朝向、稳定 ID 和 layout 几何契约,避免 Blender 或 浏览器重新解析 GeoJSON 或 OSM。layout 包含灯头、灯珠、横杆和倒计时牌的尺寸与偏移; 其中横向偏移以车辆行驶方向为基准,正值表示驾驶员右侧;mastHeightMetersheadCenterHeightMeters 是横杆和灯壳的共同中心高度。三颗灯珠相对灯壳中心排列,而倒计时牌 的垂直偏移为零、固定在横杆上。 Blender 使用 Projector.xy((longitude, latitude)) 转成本地米制坐标,并以 headingDegrees 旋转Cesium 以同一字段派生地理位置与灯面朝向。 每个路口按相对进口方向分为两组对向相位;统一循环绿、黄、全红切换。

预览将每条路线按累计米数投影到信号停止线。只有距离阈值内且行驶方向与信号进口一致的 匹配才形成停车点。车辆的累计里程由 clock.onTick 推进;下一停车点为红或黄时将里程夹在 停止线前,绿灯后从同一位置继续。没有停车点的路线保留原速度循环。

预览交互

预览加载锚点 JSON 失败时记录 warning场景、路线与车辆仍可用。加载成功时信号灯默认显示 并在现有 View 控件中提供独立 Signals 复选框。动态灯珠和数字以 emissive 材质区分点亮和 熄灭状态,不依赖环境光;静态部分由 GLB 的低多边形 MeshBatch 几何承载。

风险与回退

信号灯是示意设施,不能视为 OSM 语义。复杂交叉口或人工修补后的不完整标线宁可跳过,也不 摆放到行车道中央。回退时删除附属锚点输出、05_Props 信号构件和 Cesium 动态覆盖层即可; QGIS、道路/标线和既有路线 JSON 不受影响。