Type: grilling Status: resolved Labels: wayfinder:grilling Blocked by: None
已收口(resolved,2026-09-18):Q1–Q8 全部确认;独立复审完成并并入修正(中心高程取实测地形、断言口径补 height 并去冗余、±200 m 复核口补推导、全球态点选不进区记为边界)+ ADR / 票 04 改后原文全文落票面。下游落盘已执行:ADR 0008 原位修订、决策地图票 04 同步、CONTEXT.md 补词条、本图收口。决策要点见 ## Answer。
需求①原句:「点击监测点位后,首先应该将镜头移动定位到该监测点位置,首先要能够在三维场景下观察该监测点的状况」——即点一下就该看得清这个点位及其周边,而不是只把旋转中心挪过去。
现状与冲突(本图 map.md 事实 3):
services/cameraControl.js 的 setFocus() 就是这个语义;只有 applyViewPreset()(票 30 引入)能连 hpr 一起换。pitch −55 / range 12000),因此「只换中心」到不了「能观察该监测点」。请裁决并定量:
sampleTerrainMostDetailed 的实测口径)、pitch、range(多少米算「看清一个监测点」?是否要分「点位级 / 设备级」两档,与需求⑤的「定位到设备」对齐)。.scratch/cockpit-primary-area-guardrails 的 02(已 resolved)定了 range ∈ [120, range_max],range_max = 1651 / (2·tan(fovY/2))(16:9 ≈ 2,542 m,1:1 ≈ 1,430 m)、相机离地高度 h ≥ 正下方地形 + 10 m,并写明「最低仍须能贴近看设备」。本票定的定位 range 与它们取交集后是多少?是否存在「在县城视角下能定位、在全球/区外视角下不能」的分叉,若有,谁优先?mapService.getCameraState() 的 pivot/hpr 期望值,或 DEV 把手),以便将来的走查脚本不靠肉眼。applyViewPreset,中心 + heading/pitch/range 一起换(不是 setFocus 的只换中心)。因此决策地图票 04 的「只换中心」收窄为「手动三键(右键轨道 / 滚轮 / 左键平移)的中心规则」;ADR 0008 第 20 行那两句按第 2 轮确认的改后原文修订。range ∈ [120, range_max]、h ≥ 正下方地形 + 10 m),被夹就如实呈现;不另设更保守的固定上限。CONTEXT.md 补「定位」「归位」两条,只锁「指哪个动作」,不进实现细节。)heading 0 / pitch −55 / range 500 m;由配置给(建议 map.locate 一节,缺省 0 / −55 / 500),组件不硬编码,后续可在配置中修改。复核口保留:若票 05/11 表明设备分布超出 ±200 m(Q1=A 的「设备全可见」不成立),回来重议此数值。heading 0 / pitch −55 / range 150 m),共用同一配置入口 map.locate(含 point / device 两组),后续可在配置中修改;票 06 引用本票数值,不另发明第二套。ADR 0008「旋转中心」节,改后:
- 选中监测点或设备时,中心是该对象的地表高程点(对象高程 + 0;票 30 起按实测地形)。
- 选中监测点时(从无选中到选中),镜头平滑飞向该点位的定位视角:中心 + heading/pitch/range 一起换(数值与配置入口见
.scratch/cockpit-point-locate-and-device-link票 03;缺省 heading 0 / pitch −55 / range 500 m;取消选中或关闭详情不回退,换点位直接从当前视角飞向下一个定位视角)。- 选中非监测点对象(未关联设备、事件等)或手动三键操作(右键轨道 / 滚轮 / 左键平移)时,中心规则不变:只换中心,保持当前 heading 与 range。
- 取消选中不立即回退中心或视角;左键平移才把中心更新为地面拾取点。
决策地图票 04(.scratch/web-cockpit-decision-map/issues/04)同步句,改后:
从无选中到选中监测点:镜头飞向该点位的定位视角(中心 + hpr 一起换,契约见
.scratch/cockpit-point-locate-and-device-link票 03;取消选中不回退);选中非监测点对象或手动操作时仍只换中心、保持 heading 与 range。
默认确认(无异议,一并落盘):① 定位飞行复用 applyViewPreset 既有阻尼 / 动画路径,不新增时长开关;② 断言口径(复审修正)= mapService.getCameraState() + 宿主 dataset.camera:定位完成 = settled(其经纬容差 1e-7° 已含 pivot 对齐,不再另比 1e-4°)且 hpr 匹配预设(对应档位),并断言相机离地高度 ≥ 点位地表高程 + 10 m(防入地由 guardrails 兜底,走查补一道)。
落盘状态(2026-09-18 维护者确认收口后执行):ADR 0008 已按上文改后原文原位修订;决策地图票 04 已同步;CONTEXT.md 已补「定位 / 归位」词条;本图已收口(Decisions so far + 进度 + 清雾区)。
.scratch/cockpit-primary-area-guardrails 的 03(限位与既有相机契约的合成 + 进出状态机)已落 Answer(该图待收口),并产出 docs/adr/0009:range_max 由 02 的 1651/(2·tan(fovY/2))(16:9 ≈ 2,542 m)改为 home.range = 12,000 m(归位即最远视野,再往外滚轮即夹);home 预设不改;pitch 不参与区域收紧;防入地 h ≥ 正下方地形 + 10 m 不变。
对本票的影响:Q3=A(定位不设例外、落在限位内)结论不变,取值锚点改为 12,000 m —— 点位级 500 m 与设备级 150 m 两档均远低于上限,任何画布比例下都不会被夹,走查断言可写死。实现时以 guardrails 03 与 ADR 0009 为准。
sampleTerrainHeight 口径),不取椭球 0。理由(复审算实):椭球 0 会把旋转中心埋进沅陵约 111.6 m 的地形里,贴地(CLAMP_TO_GROUND)标记偏离画面中心,直接违背 Q1=A 的「点位标记清晰落在画面中心」且断言测不出(旧断言不比高度);设备级 150 m 时相机离地 ≈ 123 m、距地形只剩 ≈ 11 m(贴着 ADR 0009 的防入地 10 m 边),到 120 m 档会入地 ≈ 13 m。中心高程进断言口径(见默认确认 ②)。2·500·tan(fovY/2)/sin55° ≈ 396 m,即点位两侧各 ≈ ±200 m。复核口即「该跨度须容纳该点位下全部设备点位;若设备散出跨度外(票 05/11 数据落地时验证),回来重议 500 m」。事实核实(只读,均已在本仓或 .scratch/cockpit-primary-area-guardrails 内复核):
domain/camera.js 的域层只有弹簧臂三元组 {heading, pitch, range},没有「相机离地高度 h」这个量;RANGE_LIMITS = { min: 120, max: 30000000 } 是全局常量,限位(02 的 range_max)尚未实现在代码里 —— 也就是说本票的 range 目前只会被 [120, 3×10⁷] 夹住。cameraControl.setFocus(point) = 只换中心(保持 heading/pitch/range,ADR 0008 第 20 行);cameraControl.applyViewPreset(中心, hpr, opts) = 中心 + hpr 一起换(票 30 为 home 预设引入)。mapService 只把「家/归位」接到了后者。pitch −55 / range 12000 是县域级(代码注释:4.6 km 街区级、12 km 县域级);isAtHome() 的容差是 pivot 1e-4°、range 相对 2%、角度 0.5°。.scratch/.../02,已 resolved):range ∈ [120, range_max],range_max = 1651/(2·tan(fovY/2))(16:9 ≈ 2,542 m、4:3 ≈ 1,906 m、1:1 ≈ 1,430 m,随画布 aspect 变);相机离地高度 h ≥ 正下方地形 + 10 m(不足时夹 range,不夹 pitch、不动 pivot);pitch 不参与收紧;侧视露出的范围外交给 07 的雾气。该图的 home 预设超标 5.8× 冲突归其票 03(尚未 resolved)。sampleTerrainMostDetailed 实测(沅陵实测 111.6 m);票 10 的走查实测「贴地标记与高度 0 的中心差约 30px 的地形高程差」—— 即中心取椭球 0 还是实测地形,肉眼可见。mapService.getCameraState()(pivot/hpr/focus/dragging/settled)与 formatCameraState() 写进宿主 dataset.camera,DEV 下另有 __cockpitMap.projectCameraPivot() —— 断言口径现成,不必新造。第 1 轮四问已发维护者:Q1「看清」的验收判据 / Q2 定位机制(只换中心还是连 hpr 一起换)/ Q3 与主场景区限位的关系与优先级 / Q4 与票 30 归位的职责边界。
维护者答复:Q1=A(点位级定位须能看到该点位下所有设备点位)、Q2=A(定位=中心 + hpr 一起换)、Q3=A(定位不设例外、落在限位内)、Q4=A(定位不改 home、归位永远回 home、无历史栈)。已写入 ## Answer 第 1 轮。
第 2 轮四问已发维护者:Q5 点位级定位的 hpr 数值(heading/pitch/range 与配置入口)/ Q6 是否在本票定义「设备级」第二档视角供票 06 引用(需求⑤「定位到设备」)/ Q7 取消选中与关闭面板后镜头是否回退 / Q8 ADR 0008 与决策地图票 04 的改后原文。
cockpit-primary-area-guardrails 的 03(限位与既有相机契约的合成 + 进出状态机)已收口 Answer(维护者 Q1–Q5 + R2-1…R2-6 确认),其中一项取代本票事实 #4 引用的数值:
range_max = 1651 / (2·tan(fovY/2)) ≈ 2,542 m(16:9),随画布 aspect 变。range_max = home.range = 12,000 m —— 最远视野 = 归位默认视角;home 预设不改;pitch 不参与区域收紧;防入地 h ≥ 正下方地形 + 10 m(不足夹 range)不变。本票 Q3「与主场景区限位合成(不设例外、落在限位内)」结论仍然成立,只是取值按 12,000 m 而非 2,542 m。后续实现以 .scratch/cockpit-primary-area-guardrails/issues/03 与其 docs/adr/0009 为准。雾的门控与 areaState 输入契约见该图 07(open)。
维护者答复:Q5=a(点位级 0/−55/500,配置可改)、Q6=a(两档,设备级 0/−55/150,配置可改)、Q7=a(取消选中/关闭不回退)、Q8=a(ADR 0008 原位修订 + 票 04 同步,按第 2 轮拟文)。已写入 ## Answer 第 2 轮;跨图修正(guardrails 03 的 range_max = 12,000 m)已核实并入 Answer。
按维护者要求做独立只读复审(全新上下文子代理,只读不改文件),发现并并入 ## Answer:① 中心高程口径补答(取实测地形、不取椭球 0 —— 否则破坏 Q1=A 的点位居中验收,150/120 m 档贴地/入地);② ADR 0008 与票 04 的改后原文全文落票面(此前只引用未落全文);③ 断言口径去冗余(settled 的 1e-7° 已含 pivot)并补 height 断言;④ 「±200 m」复核口补推导;⑤ 全球态点选定位不进区记为已知边界(guardrails 03 状态机,本票不裁决)。
维护者确认收口:Status: claimed → resolved、进度 100%。下游落盘已执行:ADR 0008 原位修订、决策地图票 04 同步、CONTEXT.md 补「定位 / 归位」、本图 Decisions so far + 进度 + 清雾区。按维护者要求,本票结论另以 /to-spec 固化为 .scratch/cockpit-point-locate-and-device-link/spec.md。