feat(preview): add traffic signal visualization

This commit is contained in:
2026-08-05 18:09:37 +08:00
parent c8ca009d13
commit 8b3a1d79d9
12 changed files with 438 additions and 7 deletions

View File

@@ -0,0 +1 @@
{"_example": "Fill with {\"file\": \"<path>\", \"reason\": \"<why>\"}. Put spec/research files only — no code paths. Run `python3 .trellis/scripts/get_context.py --mode packages` to list available specs. Delete this line once real entries are added."}

View File

@@ -0,0 +1,28 @@
# 设计Cesium 路口信号灯可视化
## 边界
信号灯属于 Cesium 验证预览层,不进入 QGIS、GeoPackage、场景九图层、Blender 或主 GLB。
区域构建只额外写入一个轻量的信号锚点 JSON预览运行时读该 JSON 后以 Cesium 原生
Entity/Primitive 构成灯杆、灯头和发光灯珠。
## 锚点与几何
中间阶段已有 `vehicle_stop_lines``intersection_surface`。信号锚点生成器将停止线的
中点作为进口横向基准,依据相交路口面和停止线两端的方向判定来车朝向;灯杆置于停止线的
侧后方、道路外缘一侧,且朝向来车。没有可唯一关联的路口面、停止线过短或无法确定外侧时,
不输出锚点。
输出只保存区域局部 ENU 坐标、朝向和稳定 ID避免浏览器重新解析 GeoJSON 或 OSM。每个
路口按相对进口方向分为两组对向相位;首版统一循环绿、黄、全红切换。没有车辆等待逻辑。
## 预览交互
预览加载锚点 JSON 失败时记录 warning场景、路线与车辆仍可用。加载成功时信号灯默认显示
并在现有 View 控件中提供独立 Signals 复选框。灯珠以 emissive 材质区分点亮和熄灭状态,
不依赖环境光;灯杆用低多边形几何,避免增加外部模型资产。
## 风险与回退
信号灯是示意设施,不能视为 OSM 语义。复杂交叉口或人工修补后的不完整标线宁可跳过,也不
摆放到行车道中央。删除新锚点输出及预览加载逻辑即可完整回退,不影响既有主 GLB 或路线 JSON。

View File

@@ -0,0 +1 @@
{"_example": "Fill with {\"file\": \"<path>\", \"reason\": \"<why>\"}. Put spec/research files only — no code paths. Run `python3 .trellis/scripts/get_context.py --mode packages` to list available specs. Delete this line once real entries are added."}

View File

@@ -0,0 +1,20 @@
# 实施计划Cesium 路口信号灯可视化
1. 从现有停止线和路口面建立稳定的信号锚点生成器,输出区域局部坐标、朝向、路口与相位组。
2. 将锚点 JSON 作为 preview 的可选支持文件写入区域输出与 preview manifest不触及主 GLB。
3. 在 Cesium 运行时加载可选锚点,构造立杆、灯头、红黄绿灯珠,并以统一相位时钟更新状态。
4. 添加 Signals 显示开关和诊断摘要,保持加载降级语义与既有 Controls 的布局。
5. 为锚点推导和预览配置/运行时编写针对性测试;构建目标区域并人工核对位置、朝向与相位。
## 验证
```bash
npm run test:preview-assets
node --check scripts/lib/cesium-preview.js
npm run build:area -- --config config/areas/nantaizi-lake-innovation-valley.json --stages preview
git diff --check
```
## 回退
删除信号锚点的 preview 输出与浏览器加载代码QGIS、GLB、车辆路线和原有预览功能不受影响。

View File

@@ -0,0 +1,40 @@
# Cesium 路口信号灯可视化
## Goal
在 Cesium 预览中加入可直接观察的路口交通信号灯,使已完成的道路、停止线、斑马线、
转向箭头和车辆巡航有清晰的交通控制参照。首轮以可见的灯具和相位切换为目标,不提前
实现车辆等待或交通仿真。
## Confirmed Facts
- `scripts/lib/cesium-preview.js` 目前只加载场景资产、巡航路线与车辆;没有信号灯图层、
模型或相位状态。
- 路线 JSON 包含连续的左、右、直转向曲线,但没有路口 ID 或信号相位字段。
- 现有停止线、斑马线和转向箭头已由区域构建确认,且用户要求暂不触及 QGIS 的人工修补
边界、道路生成与既有连续路线逻辑。
- Cesium 预览是验证层;改动它不应改变主 GLB、Blender 导出或 OSM/QGIS 产物。
## Requirements
- 在道路进口侧、停止线附近呈现简洁而可辨识的交通信号灯,并在不遮挡车道标线的前提下
面向来车方向。
- 红、黄、绿灯应有明确的点亮状态和周期性相位切换,使静态截图与实时预览都能看出其作用。
- 信号灯应能独立显示/隐藏,遵循现有 Cesium 控件的克制设计语言。
- 首轮不改变车辆路线、车速或等待行为;车辆仍按现有路线巡航。
- 首版以主要路口的程序化示意灯覆盖为准:从已生成的停止线和路口面推导进口,缺少可靠
几何锚点时跳过。它不宣称复刻 OSM 中逐节点标注的真实信号设施。
## Acceptance Criteria
- [ ] 重建目标区域的 preview 后Cesium 中可见至少一组位于路口进口侧的信号灯,位置与停止线/
斑马线关系清楚,且不会漂浮在道路中央或遮挡车道箭头。
- [ ] 灯组以可见状态呈现红、黄、绿的相位切换;未点亮灯珠明显较暗。
- [ ] 页面提供独立的 Signals 显示开关,关闭后不影响场景、路线与车辆。
- [ ] 不修改 QGIS 工程、道路/标线生成、现有路线 JSON 契约或车辆巡航行为。
## Notes
- Keep `prd.md` focused on requirements, constraints, and acceptance criteria.
- Lightweight tasks can remain PRD-only.
- For complex tasks, add `design.md` for technical design and `implement.md` for execution planning before `task.py start`.

View File

@@ -0,0 +1,26 @@
{
"id": "cesium-traffic-signals",
"name": "cesium-traffic-signals",
"title": "Cesium 路口信号灯可视化",
"description": "",
"status": "in_progress",
"dev_type": null,
"scope": null,
"package": null,
"priority": "P2",
"creator": "dingkang",
"assignee": "dingkang",
"createdAt": "2026-08-05",
"completedAt": null,
"branch": null,
"base_branch": "main",
"worktree_path": null,
"commit": null,
"pr_url": null,
"subtasks": [],
"children": [],
"parent": null,
"relatedFiles": [],
"notes": "",
"meta": {}
}