# 相机限位的数值契约 Type: grilling Status: resolved Labels: wayfinder:grilling Blocked by: 01 ## 进度:100% 已收口(2026-09-18,维护者「确认」)。第 1–2 轮 Q1–Q4b 全部落 `## Answer`。下游 03(限位与既有相机契约的合成 + 进出状态机)随本票解除阻塞。 ## Question 限位三个量(中心点、相机离地高度、range)的**具体数值与换算口径**是什么? 已锁:Q2=C = 三量同夹;最低仍须能贴近看设备;`h_max` 由「最高视野下地面垂直覆盖 ≤ 主场景区的 15%」约束。 **基准数(已在澄清中算出,勿重复推导)**:主场景区 E-W 13,413 m、N-S 11,008 m;**N-S 的 15% = 1,651 m**。 还没定死的四件: 1. **按哪个宽高比定 range 上限?** Cesium 的 `fov = 60°` 是**水平**视场角,`fovy = 2·atan(tan(30°)/aspect)`。同一 1,651 m 预算下(正俯视口径):aspect 1:1 → 1,430 m;4:3 → 1,906 m;16:9 → 2,542 m —— **相差近 2×**。是运行时按真实画布 aspect 反算,还是定一个保守基准写死? 2. **pitch 要不要参与?** 侧视时地面覆盖被约 `1/sin|pitch|` 放大:同一 range 在 pitch −10° 时能看到的地面远多于 −55°。是把 range 上限做成**随 pitch 动态收紧**,还是取最保守 pitch 一次性定死? **跨票分工边界(与 07 对齐,勿各自定死)**:甲方 Q11 已裁「侧视露出的范围外交给雾气遮盖」。据此,本票应倾向**限位只按正俯视基准、不随 pitch 收紧**,把侧视露出的活留给 07 的雾气;否则 02 若又按最保守 pitch 收紧,range 上限会被过度压缩(用户连俯视 15% 的县城都到不了),与 Q2 冲突。反过来说,若本票最终决定「随 pitch 收紧」,则 07 的雾气兜侧视职责可相应减轻——两条路只能二选一,答案里必须显式写出与 07 的这条边界。 3. **「垂直覆盖」的度量口径**。是取屏幕竖直方向对应的**地面跨度**(上面按此算),还是取相机到目标的距离、或别的量?pitch 变化时这个量怎么定义? 4. **h_min 是多少?** 甲方要求保留"贴近看设备"的能力(仓库存量 `RANGE_LIMITS.min = 120 m`,票 30 已把拉近到 120 m 时的黑屏修掉)。h_min 是「不低于地形/不钻进地下」,还是一个正的绝对下限?若是前者,它与票 30 的地形感知拾取如何衔接? 另注:现有 home 预设 `pitch −55, range 12000` 在此预算下超标 **5.8×** —— 该冲突**不在本票裁决**,见 03。 ## Answer ### 已确认决策:第 1 轮(Q1–Q3 锁定,Q4 语义确认) 维护者答复:`Q1=A; Q2=选A(正俯视只提供一个参考基准值,其它倾斜角不改变该规则); Q3=(a)(度量只在正俯视定义); Q4=(ii)(h_min 是缩放下限,但确实还要「防入地」)`。编号为本票访谈编号。 1. **range 上限换算(Q1=A)**:`range_max = 1651 / (2·tan(fovY/2))`,fovY 取 `engine.fovY()`(运行时真实垂直视场角,随画布 aspect 变)。resize 不主动回拉,clamp 只在输入时生效(现状)。 2. **pitch 不参与(Q2=A)**:正俯视约束只提供一个**相机高度/弹簧臂长度的参考基准值**,其它镜头倾斜角不改变该规则;`range_max` 固定为正俯视导出值。与 07 的边界:**02 只保正俯视垂直覆盖 ≤ 15%,侧视露出的范围外由 07 雾遮盖**。 3. **垂直覆盖度量(Q3=(a))**:屏幕竖直方向对应的地面跨度(正俯视 = `2·range·tan(fovY/2)`);该度量只在正俯视定义,pitch 变化时不扩展。 4. **h_min 语义(Q4=(ii))**:h_min 即「贴近看设备的缩放下限」= `range_min = 120 m`(票 30 已锁,`RANGE_LIMITS.min`);此外维护者确要一条额外的**「防入地」**下限(相机不入地形),口径见第 2 轮。 ### 已确认决策:第 2 轮(Q4「防入地」落定) 维护者答复:`Q4b=a,margin 暂定 10 m`。 5. **「防入地」口径(Q4b=(a))**:地形感知下限 —— 相机离地高度 ≥ 其正下方地形 + margin(**暂定 10 m**,实现/走查可按观感微调)。在每次输入(滚轮/轨道)时算相机地面投影点、`globe.getHeight` 采样该处地形,不足则**夹 range**(不夹 pitch、不动 pivot);瓦片未加载时退回固定 10 m 绝对下限。「不足时夹 range」的合成规则随 03 实现。 ### 最终数值契约(汇总) - 中心点 ∈ `primaryArea.bounds`(01,矩形包含)。 - `range ∈ [120, range_max]`,`range_max = 1651 / (2·tan(fovY/2))`(fovY 运行时实时、随 aspect 变;正俯视基准,pitch 不改变该规则)。 - 相机离地高度 `h = range·sin|pitch|`:h_max 被 range_max 隐式罩住;h_min 由「range_min=120(缩放下限)+ 地形感知 ≥ 地形+10m(防入地)」双保险。 - 垂直覆盖度量 = 屏幕竖直方向地面跨度,只在正俯视定义;侧视超界由 07 雾遮盖。 ### 边界(本票不裁决) pipeline 视图 range 400–6000 与 range_max 的合成优先级、home 预设超标 5.8×、到边界硬停/阻尼渐停 —— 均归 03;雾曲线归 07;E-W 水平覆盖在宽屏下超过 E-W 的 15% 属甲方「仅垂直视野」口径的自然结果,接受。 ## Comments ### 2026-09-18 第 1 轮:fact-check 与 frontier 发出 事实核实: 1. `domain/camera.js`:`RANGE_LIMITS = { min: 120, max: 30000000 }` 是唯一全局常量;域层只有 spring-arm 的 `{heading, pitch, range}`,**没有「相机离地高度 h」这个量**。相机离地高度 ≈ `range · sin|pitch|`(pivot 已由票 30 地形感知,其 `height` 即 pivot 处地表高)。 2. `cesiumEngine.fovY()` 返回 `camera.frustum.fovy`(Cesium 按水平 60° + 画布 aspect 实时算出),resize 即变。 3. clamp 只在输入时生效(`zoomByWheel` / `setHpr` / `applyViewPreset`),**无逐帧主动回拉**。 4. 视图模式:管线 pitch −18、range 400–6000;地面 pitch −85~−5。 5. 甲方裁定 #2 原文「最低仍须能贴近看设备」—— 见第 1 轮 Q4 的语义澄清。 第 1 轮四问已发维护者:Q1 宽高比 / Q2 pitch / Q3 度量口径 / Q4 h_min 语义。 ### 2026-09-18 第 2 轮:Q1–Q3 落盘,Q4「防入地」口径待定 维护者答复:`Q1=A; Q2=正俯视约束只提供一个相机高度/弹簧臂长度的参考基准值,其它倾斜角不改变该规则(选A); Q3=(a),度量只在正俯视定义; Q4=(ii),h_min 是缩放下限,但确实还要「防入地」`。 已写入 `## Answer` 第 1 轮。剩余:Q4 的「防入地」取地形感知还是绝对小值、margin 取多少 —— 第 2 轮发出。 ### 2026-09-18 第 3 轮:Q4b 落定 维护者答复:`Q4b=a,并暂定 margin = 10 m`。已写入 `## Answer` 第 2 轮(地形感知下限:相机离地高度 ≥ 正下方地形 + 10 m 暂定;不足时夹 range,机制落 03)。剩余动作:等维护者确认最终 Answer 全文后,本票 resolved + 写 map Decisions-so-far 索引。 ### 2026-09-18 收口 维护者确认。已执行:`Status: claimed` → `resolved`、进度 100%、`map.md` 的 Decisions-so-far 与任务清单同步、map 进度更新。下游 03 的 `Blocked by: 01,02` 两项齐备,随之解锁。