# M9 Project Review · 2026-09-06

本轮范围：主展台、移动布局、输入及车辆交互、程序化模型、GLB 导出、贴图、对照页面、静态部署和现有 QA。基准为用户提供的 V9 ZIP、现有线上 V9 和本轮提供的线框与问题截图。

## 优先问题

1. **P1，整车造型未通过参考验收。** 前围原截面存在约 10 cm 的中段内凹；前部包角、机盖/翼子板的视觉转折、风挡与侧窗顶部轮廓，均不能用“模型已加载”或 nominal 尺寸正确来证明相似。R1 仅修复了可确认的前围垂向内凹，并重做雷达位置与外壳。机盖肩部、灯带走向、侧窗/车顶及整车比例仍需固定参考相机逐视角拟合。定位：`body-surfaces-v8.js` 的 `noseX`、`bonnet`，`greenhouse-guides.js`，`front-header.js`。不得将本轮标为整车还原完成。
2. **P1，移动渲染预算偏高。** 原 GLB 有 1,728,219 个三角面；浏览器不是加载低面数展示模型，而是在主线程调用 `createM9()` 生成并合批全部几何。移动视口实测单帧统计仍超过 1,100 次 draw calls、420 万个跨 pass 三角面。R1 关闭移动实时地面反射、阴影降至 1024，但没有 LOD、低端模式或预制轻量模型。这是负载证据，不是手机硬件 FPS 测试。定位：`main.js` 的 renderer/key/mirror/frame；`car.js` 的 `createM9`、`batch`。
3. **P2，故障恢复不足。** `material-maps.js` 的纹理请求没有错误回调，加载画面在纹理完成前已隐藏；贴图失败时可能显示无纹理屏幕而没有恢复入口。`main.js` 的 WebGL context loss 仅提示刷新。需要有可验证的加载状态、失败提示和重试；不应把未报 JS 异常当作资源全部加载成功。
4. **P2，智驾演示依赖渲染帧率。** `frame` 将 dt 截断到 0.05 后同时用于演示时钟；持续低于 20 FPS 时，预设场景会比真实时间明显变慢。其“秒数”不是稳定的墙钟时间。定位：`main.js` 的 `frame`、`animateDemo`。
5. **P2，旧 QA 不等于当前版本验收。** 原包三轮记录明确未执行真实浏览器；本轮源文件和模型哈希已改变，`qa/evidence-v9`、旧 `review` 图片只属于初始 V9。历史记录保留，不重复包装成 R1 成果。当前检查以本文件、当前 `VERSION.json`、本轮输出和 `review/profile-r1.html` 为准。

## 本轮修复

- 手机页面改为独立网格分区；标题、画布、状态、视角栏、控制区不再共享绝对定位。控制内容独立滚动，标签页保持可见；横屏使用右侧栏。
- 画布尺寸与实际容器同步；面板开合及横竖屏变动时按可用区域重新适配，并保留用户观察方向。修复了原内联 canvas 高度导致的渲染裁切。
- 移动工具按钮使用本地 Lucide 图标、可访问名称与 hover title，保留缩放、环绕、全屏、下载说明入口。
- 去掉从车顶背后伸出的展台装饰灯柱，避免干扰车身轮廓。
- 前围垂向截面恢复为连续饱满面；未移动轴距、车轮、门铰链与座舱锚点。
- 雷达由简单盒子替换为贴合前车顶的斜面外壳、底座和独立光学窗口。尺寸来自参考估计，不是 OEM 测量。
- 新增垂向截面回归检查；旧检查只有横向凸度，不能发现正侧视角的明显前围内凹。
- 重新导出 GLB，当前模型哈希和字节数写入 `VERSION.json`；验证器同时检查模型标识、大小和哈希。

## 验证与边界

- 已执行 320×568、390×844、430×932、844×390、768×1024、1440×1000 的 Chromium 布局检查和截图。移动主要区域无相互重叠、无横向溢出，canvas 像素非空。
- 已实测四门、车窗、灯光、座舱环视、控制区收起/展开、自动环绕和模型说明弹窗。
- 输入单元测试、十组机构与灯光检查、曲面接缝/前牌框/尾门撑杆检查、内饰装配检查及 GLB 数据检查执行结果保存在本轮记录中。
- 前围正前、前侧和近景使用同一相机及中性车漆做前后对照；是直接 WebGL 几何渲染，不是生成图片。
- 尚未完成 iOS Safari/Android 真机性能、全车连续碰撞、全部参考相机标定和整车外形一致性验收。保留这些缺口，不将离线测试替代外形审查。

## 下一优先级

先固定正前、正侧、前 3/4、后 3/4 参考相机，统一车轮、车身腰线、风挡四周与车顶控制曲线；轮廓通过后再细化灯口、轮毂与内饰。同时为手机建立独立轻量显示资产，保留高精度 GLB 下载。
