02-camera-limit-numeric-contract.md 7.2 KB

相机限位的数值契约

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 的这条边界。

  1. 「垂直覆盖」的度量口径。是取屏幕竖直方向对应的地面跨度(上面按此算),还是取相机到目标的距离、或别的量?pitch 变化时这个量怎么定义?
  2. 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。

  1. 「防入地」口径(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 两项齐备,随之解锁。