# 真实场景与截图封面验证报告
场景保存截图封面及列表按创建时间倒序的功能已实施。本报告记录使用现有模型创建真实场景、保存当前三维视口封面及异常回退的实际验证结果。
2026-09-05 · http://127.0.0.1:6180 · Microsoft Edge · 教员
## 狐狸场景验证更正:撤回原完整通过结论
> **测试结论更正:** 用户指出狐狸没有出现在场景中,经复现确认属实。原报告的 7/7 仅证明引用、保存、封面上传和发布等链路,漏掉了模型真正可见的视觉检查,因此撤回原“完整 E2E 通过”结论。下列修复后证据增加了真实画面和像素差异验证。
### 原结论与漏验
- 原狐狸检查把对象树存在 fox、模型依赖有效以及接口返回成功当作模型已加载可见;旧截图实际没有显示狐狸。两项旧狐狸证据标记为已更正历史记录并移出当前通过率,原文件继续保留用于追溯。
### 根因
- 计算蒙皮模型包围盒前没有同步骨骼矩阵,得到失真的尺寸。
- 适配场景尺寸时使用 setScalar 覆盖模型已有的归一化缩放;两者叠加将狐狸放大到约 1000 个场景单位,使模型超出视锥。
### 修复内容
- 同步蒙皮矩阵后计算真实包围盒,并保留已有归一化缩放进行相对缩放;新导入模型与已保存模型均使用修正后的尺寸处理。
- 修复场景 160 的狐狸比例和默认镜头,保存并发布为版本 208;重新生成服务器 JPEG 封面资产 2084。狐狸包围盒约为 0.966 × 2.812 × 6 个场景单位。
- 同样复核并修正场景 159,保存并发布为版本 209,重新生成服务器 JPEG 封面资产 2087。未修改模型发布版本或数据库表结构。
### 修复后验证
- 真实 UI 从资源库新增狐狸后立即可见,最长边为 6;该新增操作仅在隔离浏览器会话中测试,未保存、无写请求。
- 两个场景修改、保存、发布后,通过独立新浏览器会话重新打开,使用保存的默认镜头验证;没有未完成模型加载,也没有产生写请求。
- 关闭模型投影后,对同一画面中模型显示与隐藏的像素进行比较:320 × 180 采样中狐狸改变 4472 像素、牛奶卡车改变 7515 像素,均超过 500 像素阈值。截图中可直接辨认狐狸与卡车。
- 牛奶卡车默认镜头下部分车身被场景立柱遮挡,但模型确实可见;报告保留这一限制。
- 最终列表显示狐狸在卡车之前,虽然卡车更新于 19:32、狐狸更新于 19:31,确认排序依据仍为创建时间。
[](screenshots/26-fox-visual-regression.png)
下方标为“历史记录(已更正)”的检查及截图保留用于追溯,不计入当前通过率,也不作为狐狸已经可见的证据。
当前证据项通过 7 / 7;失败 0;其他或未标注 0;已更正历史记录 2;已校验图片文件 22。
## 保留场景与封面证据
### 实测场景-牛奶卡车检验区-20260905
场景 159;状态 PUBLISHED;当前版本 209;引用模型 156 / 发布版本 204。
[](screenshots/24-truck-final-cover.jpg)
封面持久化与项目证据
{
"id": "159",
"name": "实测场景-牛奶卡车检验区-20260905",
"modelId": "156",
"modelVersionId": "204",
"finalStatus": "PUBLISHED",
"finalVersionId": "209",
"cover": {
"image": "screenshots/24-truck-final-cover.jpg",
"width": 640,
"height": 408,
"sizeBytes": 32937,
"assetId": "2087",
"versionId": "209",
"mimeType": "image/jpeg",
"sha256": "e103a473b74f3809365890296180c42f6c37a8005f2fd4c27fb64c437c245786",
"storageUri": "fsvc://unreal-tran/image/2026/09/05/d29810b273d75e43dff07622424f333f.jpg"
}
}
封面持久化与项目证据
{
"id": "160",
"name": "实测场景-狐狸野外训练区-20260905",
"modelId": "157",
"modelVersionId": "201",
"finalStatus": "PUBLISHED",
"finalVersionId": "208",
"cover": {
"image": "screenshots/22-fox-final-cover.jpg",
"width": 640,
"height": 408,
"sizeBytes": 45706,
"assetId": "2084",
"versionId": "208",
"mimeType": "image/jpeg",
"sha256": "1b6e4d1eb6e65ccc15ba820a8ae4bd40ab1bee900cf91d4ec3db9af82153618d",
"storageUri": "fsvc://unreal-tran/image/2026/09/05/c176d359087fc9bea4235e43dd43a691.jpg"
}
}
检查详情
{
"details": {
"total": 8,
"warnings": 0,
"text": "✓\n场景环境已配置\n真实装备车库\n✓\n模型资源加载完成\n全部受控模型已就绪\n✓\n场景用途配置有效\n1 个实训装备\n✓\n对象设备编号完整\n用于接收物理设备和消息事件\n✓\n物模型绑定完整\n用于训练步骤和动作映射\n✓\n设备编号不重复\n设备编号唯一\n✓\n物模型编号不重复\n物模型编号唯一\n✓\n受控资源引用正常\n2 个导入模型可跨刷新恢复"
}
}
检查详情
{
"superseded": true
}
检查详情
{
"details": {
"sceneId": "160",
"oldCoverUri": "fsvc://unreal-tran/image/2026/09/05/bb1e8717cd2e7ba6ca10f16b817b1ec5.jpg",
"putRequests": 1
}
}
检查详情
{
"superseded": true,
"details": {
"validation": {
"total": 8,
"warnings": 0,
"text": "✓\n场景环境已配置\n真实野外训练场\n✓\n模型资源加载完成\n全部受控模型已就绪\n✓\n场景用途配置有效\n3 个实训装备\n✓\n对象设备编号完整\n用于接收物理设备和消息事件\n✓\n物模型绑定完整\n用于训练步骤和动作映射\n✓\n设备编号不重复\n设备编号唯一\n✓\n物模型编号不重复\n物模型编号唯一\n✓\n受控资源引用正常\n2 个导入模型可跨刷新恢复"
},
"coverBeforePublish": "fsvc://unreal-tran/image/2026/09/05/bb1e8717cd2e7ba6ca10f16b817b1ec5.jpg",
"coverAfterPublish": "fsvc://unreal-tran/image/2026/09/05/62e5d4a05316badb631e252f44ecbec3.jpg"
}
}
检查详情
{
"details": {
"foxIndex": 0,
"truckIndex": 1,
"rows": [
{
"name": "狐狸野外场景",
"projectId": "160",
"addTime": 1788605625,
"updateTime": "2026-09-05T19:31:30",
"imageIsBlob": true
},
{
"name": "牛奶卡车场景",
"projectId": "159",
"addTime": 1788603808,
"updateTime": "2026-09-05T19:32:28",
"imageIsBlob": true
}
]
}
}
检查详情
{
"details": {
"sceneId": "160",
"currentVersionId": "208",
"publishedVersionId": "208",
"modelProjectId": "157",
"modelVersionId": "201",
"newImportWriteRequests": [],
"visibilityEvidence": "visibility-evidence.json",
"changedPixels": 4472,
"changedPercentage": 7.764,
"pendingLoads": 0,
"boundsSize": [
0.9658796100519353,
2.811899945787403,
6
]
}
}
检查详情
{
"details": {
"sceneId": "159",
"currentVersionId": "209",
"publishedVersionId": "209",
"modelProjectId": "156",
"modelVersionId": "204",
"visibilityEvidence": "visibility-evidence.json",
"changedPixels": 7515,
"changedPercentage": 13.047,
"pendingLoads": 0,
"boundsSize": [
3.4406057210321332,
3.390913184034896,
6.000000000000001
]
}
}
保留开发环境场景 159(牛奶卡车检验区,PUBLISHED,当前及已发布版本 209,模型 156 / 已发布版本 204)和场景 160(狐狸野外训练区,PUBLISHED,当前及已发布版本 208,模型 157 / 已发布版本 201)。模型原发布版本未修改;模型 157 的当前草稿版本 202 继续保留,未发布或修改。本次无需 DDL 变更。| 场景 | 模型 / 发布版本 | 最终状态 | 当前版本 | |---|---|---|---| | 159 · 实测场景-牛奶卡车检验区-20260905 | 156 / 204 | PUBLISHED | 209 | | 160 · 实测场景-狐狸野外训练区-20260905 | 157 / 201 | PUBLISHED | 208 |
保留两条真实场景及历史截图用于后续测试和追溯。新增导入狐狸仅在隔离浏览器会话中测试,未保存、无写请求;测试结束后丢弃临时对象。## 本次问题记录
{
"title": "狐狸存在于对象树但不在真实视口中显示",
"status": "FIXED_AND_VISUALLY_VERIFIED",
"details": "原完整 E2E 通过结论已撤回。同步蒙皮矩阵并保留归一化缩放,修复场景数据和镜头后,新增导入、保存发布、独立刷新与像素可见性均通过;详见更正区。"
}
## 后续独立事项
既存受控文件资产的 fsvc URI 分支未完整覆盖上传票据绑定校验,属于本次场景封面变更前已存在的问题。本次保留现有流程,后续应独立补齐校验并验证历史资产、版本复制与引用兼容性;不计入本次场景功能失败数。
{
"scope": "independent",
"title": "fsvc 新资产上传票据绑定校验",
"details": "既存流程的 fsvc URI 分支未完整覆盖上传票据绑定校验;本次未扩大修改范围,应单独补齐并验证历史资产、版本复制与引用兼容性。"
}
## 实际命令与结果
**pnpm run build**
{
"status": "PASS",
"details": "前端生产构建及遗留模型编辑器产物校验通过。"
}
**node --test tools/scene-cover-api.test.mjs tools/scene-cover-capture.test.mjs tools/scene-model-placement.test.mjs**
{
"status": "PASS",
"details": "33 / 33 通过:封面同次 PUT、异常回退、并发队列、项目切换、截图尺寸、渲染状态恢复,以及蒙皮模型包围盒与归一化缩放回归。"
}
**原 Microsoft Edge 场景链路 E2E(更正说明)**
{
"status": "SUPERSEDED",
"details": "原 7/7 只覆盖模型引用、保存、封面上传和发布等链路,未证明狐狸真实可见;完整通过结论已撤回,当前视觉验证见下列独立浏览器 E2E。"
}
**node tools/scene-model-visibility.e2e.mjs**
{
"status": "PASS",
"details": "独立 Edge / Playwright 会话重开 160/208 与 159/209,使用保存镜头,显示/隐藏模型并禁用投影进行像素比较;狐狸 4472 像素、卡车 7515 像素,均超过 500 阈值。证据保存在 visibility-evidence.json,截图 26 / 27;无写请求。"
}
## 当前行为与限制
- 手动保存从当前三维视口生成封面;新封面与场景内容、模型引用在同一次工程更新中关联保存。发布前的保存沿用该流程。
- 截图或封面上传失败时保留旧封面;工程是否保存成功以实际更新请求为准。版本冲突不覆盖其他已保存的内容。
- 自动恢复及重新打开工程不生成或上传新封面;恢复后的修改需由用户保存后更新封面。
- 列表按创建时间倒序展示。再次保存不会改变创建时间,也不应因此改变创建时间排序。
- 牛奶卡车场景保存的默认镜头中,车身部分被场景立柱遮挡;真实网格可见且像素差异验证通过。需要观察完整车身时可旋转镜头。
报告来自 evidence.json,未修改原始证据;所有引用图片已校验存在且非空,点击可查看原图。通过数随证据更新。