# VPP Camera FOV：Evidence ledger

查證基準：`webtech-monorepo/packages/app-one-portal` revision `821ea36a29ad3a74fcdaa20c686f2d43844cb005`（2026-08-14）。以下皆為 VPP Current；CameraSimulator 的交叉引用不取代此來源。

| ID | 類型 | Claim | Revision／Observed at | Path＋symbol／確認方式 |
|---|---|---|---|---|
| <a id="vpp-flow-e1"></a>VPP-FLOW-E1 | Source | focal 缺少時不畫；sensor／resolution fallback。 | `ShoushanZoo/webtech-monorepo@821ea36a29ad3a74fcdaa20c686f2d43844cb005` | `packages/app-one-portal/src/utils/layout/productSpecTransform.js::transformProductToCamera` |
| <a id="vpp-flow-e2"></a>VPP-FLOW-E2 | Source | `mpp` 無效時使用 `1 px/m`。 | `ShoushanZoo/webtech-monorepo@821ea36a29ad3a74fcdaa20c686f2d43844cb005` | `packages/app-one-portal/src/pages/projects/Editor/LayoutConfiguration/components/FloorPlanCanvas.vue::drawFovForShape` |
| <a id="vpp-flow-e3"></a>VPP-FLOW-E3 | Source | Channel → Placement → default；spec／pinhole Current H/V FOV。 | `ShoushanZoo/webtech-monorepo@821ea36a29ad3a74fcdaa20c686f2d43844cb005` | `packages/app-one-portal/src/utils/layout/productSpecTransform.js::transformProductToCamera`；`packages/app-one-portal/src/utils/layout/fovCalculations.js::computeFovAngle,computeFovV` |
| <a id="vpp-flow-e4"></a>VPP-FLOW-E4 | Source | varifocal correction interpolation：`(1−z)^9`，兩端命中 datasheet。 | `ShoushanZoo/webtech-monorepo@821ea36a29ad3a74fcdaa20c686f2d43844cb005` | `packages/app-one-portal/src/utils/layout/fovCalculations.js::_applyCorrection` |
| <a id="vpp-flow-e5"></a>VPP-FLOW-E5 | Derived | `tilt±V/2` 與 `d=h/tan(α)` 的 near／far projection。 | `ShoushanZoo/webtech-monorepo@821ea36a29ad3a74fcdaa20c686f2d43844cb005` | `packages/app-one-portal/src/utils/layout/fovCalculations.js::calculateGroundProjection` |
| <a id="vpp-flow-e6"></a>VPP-FLOW-E6 | Derived | scene width、PPM 與 280／150／80／30 PPM 距離。 | `ShoushanZoo/webtech-monorepo@821ea36a29ad3a74fcdaa20c686f2d43844cb005` | `packages/app-one-portal/src/utils/layout/fovCalculations.js::calculateGroundDistanceForPPM`；`packages/app-one-portal/src/utils/layout/constants/dori.js::DORI_THRESHOLDS` |
| <a id="vpp-flow-e7"></a>VPP-FLOW-E7 | Source | `effectiveFar`、near/far width、p1…p4、rotation 與 Konva footprint。 | `ShoushanZoo/webtech-monorepo@821ea36a29ad3a74fcdaa20c686f2d43844cb005` | `packages/app-one-portal/src/utils/layout/fovGeometryRenderer.js::_drawTrapezoidGeometry` |
| <a id="vpp-flow-e8"></a>VPP-FLOW-E8 | Source | Fixed-focal 80 PPM；varifocal／thermal 30 PPM。 | `ShoushanZoo/webtech-monorepo@821ea36a29ad3a74fcdaa20c686f2d43844cb005` | `packages/app-one-portal/src/utils/layout/fovCalculations.js::calculateDoriDistances`；`packages/app-one-portal/src/utils/layout/constants/dori.js::DORI_THRESHOLDS,FIXED_FOCAL_MIN_PPM` |
| <a id="vpp-flow-e9"></a>VPP-FLOW-E9 | Source | 89.9°、1000 m、170° 與 wedge／circle 例外。 | `ShoushanZoo/webtech-monorepo@821ea36a29ad3a74fcdaa20c686f2d43844cb005` | `packages/app-one-portal/src/utils/layout/constants/camera.js::VERTICAL_TILT_THRESHOLD,MAX_GROUND_DISTANCE,FISHEYE_FOV_THRESHOLD`；`packages/app-one-portal/src/utils/layout/fovCalculations.js::calculateGroundProjection,calculateGroundDistanceForPPM,shouldUseTrapezoidMode`；`packages/app-one-portal/src/utils/layout/fovGeometryRenderer.js::_drawWedgeGeometry` |
| <a id="vpp-fallback-e1"></a>VPP-FALLBACK-E1 | Source | Resolved input 是 Channel → Placement → default；sensor／resolution 可 fallback，缺 focal 不產生 footprint。 | `ShoushanZoo/webtech-monorepo@821ea36a29ad3a74fcdaa20c686f2d43844cb005` | `packages/app-one-portal/src/utils/layout/productSpecTransform.js::transformProductToCamera` |
| <a id="vpp-fallback-e3"></a>VPP-FALLBACK-E3 | Source | Fixed-focal 有 scalar catalog FOV 時採用，缺值改用 theoretical pinhole FOV。 | `ShoushanZoo/webtech-monorepo@821ea36a29ad3a74fcdaa20c686f2d43844cb005` | `packages/app-one-portal/src/utils/layout/fovCalculations.js::computeFovAngle,computeFovV` |
| <a id="vpp-fallback-e4"></a>VPP-FALLBACK-E4 | Source | 只有完整 wide／tele spec endpoints 才套 correction；缺漏則採 theoretical FOV。 | `ShoushanZoo/webtech-monorepo@821ea36a29ad3a74fcdaa20c686f2d43844cb005` | `packages/app-one-portal/src/utils/layout/fovCalculations.js::computeFovAngle,computeFovV,_applyCorrection` |
| <a id="vpp-fallback-e6"></a>VPP-FALLBACK-E6 | Source | 170° threshold 只在 PPM／DORI physical-width 計算使用。 | `ShoushanZoo/webtech-monorepo@821ea36a29ad3a74fcdaa20c686f2d43844cb005` | `packages/app-one-portal/src/utils/layout/fovCalculations.js::calculateGroundDistanceForPPM,calculatePPM` |
| <a id="vpp-fallback-e8"></a>VPP-FALLBACK-E8 | Source | thermal 不另選 FOV；fixed outer 80 PPM，varifocal／thermal outer 30 PPM。 | `ShoushanZoo/webtech-monorepo@821ea36a29ad3a74fcdaa20c686f2d43844cb005` | `packages/app-one-portal/src/utils/layout/fovCalculations.js::calculateDoriDistances`；`packages/app-one-portal/src/utils/layout/constants/dori.js::DORI_THRESHOLDS` |
| <a id="vpp-fallback-e9"></a>VPP-FALLBACK-E9 | Source | fisheye、panoramic、near-vertical 與 edge-ray fallback 是相異判定。 | `ShoushanZoo/webtech-monorepo@821ea36a29ad3a74fcdaa20c686f2d43844cb005` | `packages/app-one-portal/src/utils/layout/constants/camera.js::VERTICAL_TILT_THRESHOLD,MAX_GROUND_DISTANCE,FISHEYE_FOV_THRESHOLD`；`packages/app-one-portal/src/utils/layout/fovCalculations.js::calculateGroundProjection,shouldUseTrapezoidMode` |

## 判讀邊界

- `VPP-FLOW-E5` 與 `VPP-FLOW-E6` 是可由公開輸入與公式重算的 Derived；其餘條目保持 Source。
- `(1-z)^9` 僅為 wide-end residual 權重；完整 correction 同時混合 wide／tele 的 `spec−theoretical` residual。
- thermal 的已證實差異是 DORI outer threshold；不得因此推論另一套 FOV 公式。
