# 公开版说明

以下记录为 2026-09-12 本机测试的历史报告。此次发布的数据已移除本机绝对来源路径，数值结果保持不变。测试范围、归属和局限不变。

# shot_exporter 本机验收

日期：2026-09-12。结果：PASS。环境：Windows，Blender 5.2.0 LTS。

README已阅读。本次范围限于导出器修正与本机测试；求职文档中的经历、个人信息、署名、公开授权均未补写或推断。其余四份Markdown文档从原包原样复制。未进行视频处理、渲染、上传或公开发布。

## 修改

- 保留原脚本通过逐帧frame_set和依赖图求值获取有效摄影机与世界矩阵的方式；实测确认时间线相机切换原本即可正常工作。
- 根目录支持Path对象；提前拒绝文件路径、空路径、相对路径及UNC共享路径。映射网络盘不在此检查的识别范围内，本次所有输出均为本机C盘。
- 在嵌套finally中恢复原摄影机，并刷新当前视图层；恢复原整数帧及小数帧。原脚本已有基本恢复逻辑，本次是防御性加固。
- 固定选中对象的名称排序；保留过滤摄影机的原有规则。
- 增加命令行--export-root入口，保留文字编辑器EXPORT_ROOT配置方式。
- JSON版本更新为0.1.1，增加来源blend路径与被跟踪对象列表，移除“尚未在Blender测试”的旧描述，明确整数帧、坐标单位与投影局限。

## 实测

测试场景共24帧，有效帧率为24/1.001。第1–12帧使用Camera_A，第13–24帧使用Camera_B。摄影机A有旋转父级，摄影机B通过Copy Location约束跟随动画目标。角色为两个模拟控制器Empty，不是已验证的真实角色骨架。

下表为JSON核对值，位置单位为Blender单位，场景scale_length=0.01：

|帧|摄影机|焦段 mm|摄影机世界位置|父级角色世界位置|约束角色世界位置|
|---|---|---|---|---|---|
|1|Camera_A|36|(8, -2, 6)|(0, 2.5, 0)|(2, -1, 3)|
|12|Camera_A|47|(8, 9, 6)|(0, 8, 0)|(24, -12, 3)|
|13|Camera_B|96|(26, -13, 3)|(0, 8.5, 0)|(26, -13, 3)|
|24|Camera_B|118|(48, -24, 3)|(0, 14, 0)|(48, -24, 3)|

验证器对全部24帧执行断言，不仅检查表格中的四帧。摄影机和角色完整4×4矩阵既与独立解析预期比较，也与Blender逐帧求值读回比较。焦段、传感器尺寸、sensor_fit、shift、投影类型、时间与单位字段均完成核对。最大数值绝对误差4.76837158203125e-7，阈值1e-5。

其他通过项：严格JSON解析、连续24帧、重复导出内容相同且目录独立、正交摄影机、空选择、无摄影机报错、无效路径、超长帧范围，以及第5帧模拟失败后的状态恢复与无输出。成功与采样失败均核对原帧8+0.25、原摄影机、选择和活动对象。

命令行主入口另在独立本机后台进程中成功导出24帧，输出在cli_exports内。首次验证进程读取本机插件设置时提示MCP不能在后台启动；直接Python验证正常完成，不依赖MCP。后续命令行使用factory-startup启动。

## 文件保护与边界

原包没有blend，测试原件在工作目录中新建，再复制为本包exporter_test.blend。测试副本导出前后SHA-256均为：

`c41de944afc28006ea0257cfc2e2d2417d9898af8bb7ca2a8fd4d53d6bd67663`

原测试文件与测试副本的最终哈希也一致。未向任何原始blend执行保存；当前GUI场景未被打开、替换或操作。原ZIP只读解压，其内容保留在工作目录。

这里只验证合成测试工程和该本机版本。未验证用户真实作品、复杂角色骨骼、模拟缓存、全景投影转换或其他Blender版本。来源路径可能包含本机目录信息，JSON尚未对外发布。

文件：shot_exporter.py为修正版；exporter_test.blend为测试副本；verify_exporter.py可本机复验；validation_results.json为机器可读结果；exports中有两次主测试输出；edge_exports中是正交相机与空选择测试。
