# 原场景投影分层：独立本地校准候选

**未发布，未获视觉批准。不是整个街区或全城的无影底图。**

已实现两个手工限定样本：
1. 三栋飞机高度代理楼附近，邻楼立面上一个建筑投影区域。
2. 附近停车场树冠左下的一小片落地投影。

两类原场景投影分别开关；全部开启直接还原原图。关闭时只在对应mask内使用imagegen生成的去影修复像素。其余原背景不变。飞机高度图、光线求交、低空遮挡保持原实现。原场景分离层是**固定光照**，不随太阳滑杆、楼高、飞机高度旋转或重算；UI已简短标明。

## 质量状态与明确限制

- 第一轮整块去影 `assets/clean_candidate_v1.png` 改变树冠细节及部分楼体边缘，已拒绝，代码不加载它。
- 第二轮分别用原始局部图 + 白编辑/黑保护mask通过内置imagegen修复。工具仍会改变mask外的内容，所以运行时绝不使用这些像素。
- `layers.js`只做原图+生成结果的严格mask合成，没有直接调亮、调色、涂抹或Python去影。Python仅作坐标裁切、mask绘制、合成QA与像素差分析。
- 楼体mask扩展到原深色投影在立面上的边界，避免初版小mask产生明显奶油色孤岛；生成时原始mask保存在 `building_generation_mask_v1.png`，当前用于合成的mask为 `building_edit_mask.png`。这一扩大不等于生成结果已达到真实测量精度。
- 最终建筑去影恢复的内部窗纹是AI推测，仍有纹理差异；边界内的色调连续性需要人工视觉接受。不能宣称有实测无影照片或全楼完美去影。
- 树木样本只移除一小片可辨认的地面投影，不删除树冠自身明暗；没有给树高赋真值。mask原像素中强绿色约0.87%，可疑边缘仍需视觉审查。
- 所有原始建筑/道路/树木主轮廓在mask外受逐像素保护。mask内的纹理不保证逐像素几何正确。
- 本地候选以原场景投影默认开启，失败时保留正常画面。未经根任务视觉批准，勿复制到发布目录。

## 资产与坐标

背景和飞行代码只读复制自 `../cloudflare_map_candidate/public/flight/`，未修改原目录。原图1600×1600，对应原1km半径的2×2km外接方形。

`layers.json` 保存每个生成裁片回贴的原图 x,y,w,h、输入分辨率、mask、来源与限制。建筑片 [635,610,70,38]，树片 [540,530,60,55]。

生成输出（内置工具，无API key）：
- 整块候选（拒绝）：`exec-e0a81a66-8185-4d96-b50c-8c703e49cf02.png`
- 建筑局部：`exec-f3c92764-d3ff-469c-a08e-c30f3631e92b.png`
- 树局部：`exec-c4fd5cbf-3f32-4ae7-946f-3457c583c3a1.png`

对应文件均已复制到本目录assets，不依赖生成工具临时目录。

共同prompt核心：只移除白mask内蓝黑投影；恢复同一浅色立面/米色铺地；黑mask内保持原始像素、相同构图/边缘/软像素风，不移动对象，不调亮整张图。运行时强制实施mask保护，不信任生成模型的外部像素保持承诺。

## 验证

- 所有JS `node --check` 通过。
- `python tests/verify_layers.py`：mask外改变 **0** 像素，751像素允许编辑，734像素实际改变（Pillow离线合成参考）。两层全部开启显示原始source，因此可逆、无累积编辑。
- `tests/building_comparison.png`、`tree_comparison.png`：原图/去影mask合成对照。
- 浏览器Canvas采样与Pillow重采样可能有小差别，但mask外原图复制不变由运行时代码保证。
- 本轮未启动服务器、Chromium，未部署。实际CPU/WebGL交互浏览器QA仍需根任务的正式preview路线。

## 可执行最小继续方案

先用正式preview审核这两处切换是否值得作为小样本发布，不能用其开关冒充全场景无影。通过后由唯一部署worker集成；不通过则保留原线上飞行。扩大到三栋完整周边需要逐个画出真正投影mask与接收面（树冠自阴影必须排除），逐个imagegen修补并检查；全城动态楼/树投影还需完整高度和几何，不在本候选里伪造。

## 根任务审查更新

根任务已看两张对比图，同意作为**明确的两处小样本机制验证**交隔离集成，不得称街区去影完成。按审查新增“定位建筑样本”“定位树影样本”及黄色范围框；默认原样开启，解释收进展开说明。真实浏览器集成QA和最终部署仍由根/唯一部署worker负责。

`node tests/layers_state.cjs` 已通过：默认原图、两个开关独立、两层恢复后与原始像素逐字节相同、反复开关无累积编辑、不修改飞机位置/高度/geometry开关。此测试执行实际layers.js，Canvas像素是合成测试输入，不能代替真实浏览器截图。
