AI 协作日志

学生 Web 实验作品平台

学号:202412211401017 · 来源:ai-log.md

# 实验五AI协作与核验记录

学号:202412211401017 姓名:叶毅 日期:2026.11.09

> 数值证据:`node tools/verify.js` 61 项全通过(脚本调用页面里真实的 `js/*.js` 函数);画面证据见 `截图/`。

## 协作一:观察与投影概念核验(B/C,3分)

**1. 预测**:只改 M 的平移 → 世界中心数值变、eye 不变;只改 V → 世界中心恒 (0,0,0)、画面方向变;只改 P → M/V 一个数不动,正交下两个等尺寸立方体一样大,透视下近大远小。

**2. 提示词**

> 在WebGL2右手坐标系、列向量和P·V·M的顺序下,我想比较移动物体与移动相机、正交与透视投影。请给我三组能区分原因的控制变量实验,指出应改变M/V/P中的哪项,说明可以打印哪些坐标数值进行核验,不要直接生成整套代码。

**3. AI建议**:三组控制变量——①改 M 打印 `M·N·center`;②改 V 打印同一中心,`target` 应落在 `(0,0,-d)`;③改 P 打印两立方体的 NDC 高度。依据 `p_clip=P·V·M·N`:V 只换基不换位置;透视把 `-z_cam` 写进 w,表观尺寸 ∝ 1/深度;正交 w 恒为 1,深度只进 z_clip。

**4. 判断**:三组都采纳;拒绝"用 Model 的 S 模拟 FOV"——S 改的是世界尺度(中心、包围盒、Shift 比例全变),FOV 改的是视景体,二者不等价。

**5. 测试结果**

| 只改 | 参数 | 实测 |
|---|---|---|
| M | tx 0→0.25 | 世界中心 (0,0,0)→(0.25,0,0),eye 不变 |
| V | 正面→顶部 (0,8,0) | 世界中心仍 (0,0,0);target→(0,0,−8) |
| P | 正交/透视 | 正交 0.277 vs 0.277;透视 0.188 vs 0.142 |
| P | FOV 50→90 | 0.188→0.088 |

**6. 修正**:我原预期透视远近比约 1.5,实测 1.32,与理论 11.5/8.5 一致,是预期错;顶视图 up 必须换成 (0,0,−1),否则 lookAt 出 NaN(`B-top.png` 无黑屏)。

## 协作二:程序故障诊断(C/D,4分)

**1. 现象**:用合成 `PointerEvent` 测试时 Console 报 `NotFoundError: setPointerCapture … no active pointer`,真实鼠标拖动却正常;我起初怀疑 pointerId 复用或未释放。

**2. 提示词**

> 我的OBJ能显示,但切换透视投影后形状被拉伸/裁剪或者鼠标拖动方向异常。请从宽高比、裁剪面、矩阵顺序和观察基向量中提出至少三种假设,分别给一项最小测试,先帮助排查,不要直接重写完整程序。

**3. AI假设与最小测试**:宽高比混用(打印 aspect 与 CSS 尺寸);裁剪面非法(near=0、far<near);矩阵顺序(切视角看世界中心);观察基向量(侧面 Shift 右拖看 tx/tz);指针未激活(真实拖动 vs 合成事件,这条我补的)。

**4. 逐项测试**:aspect 1.60 与 canvas 一致 → 排除拉伸;near=0 给出可读提示、near=20 时 |z_ndc|=4.255 被裁 → 裁剪正确;切视角世界中心恒为 0 → 顺序正确;侧面 Shift 右拖只增 tz≈−0.574(画面右=世界 −Z)→ 基向量正确;真实拖动不报、合成必报 → 成立。

**5. 根因与修复**:`app.js` 的 `pointerdown` 无条件调用 `setPointerCapture`,无活动指针时抛异常。改为 try/catch 包裹:

```js
try{canvas.setPointerCapture(e.pointerId);}catch(_){}
try{if(canvas.hasPointerCapture(e.pointerId))canvas.releasePointerCapture(e.pointerId);}catch(_){}
```

修复后 Console 无 error,左拖旋转、Shift 平移、右键环绕均正常(`D-drag-rotate.png`、`D-shift-pan.png`、`E-camera-orbit.png`)。

## 协作三:综合工作台方案比较(E,3分)

**1. 任务**:观察辅助标记绕指定点 P 公转,区分"公转"与"自转"。

**2. 两方案**:甲 指定点旋转 `M_orbit=T(P)·Ry(θ)·T(-P)·T(q)·S`(改 M 侧);乙 相机环绕,eye 用球坐标 (r,az,el)(只改 V)。

**3. 对比**:甲可手算 `P+Ry(θ)(q−P)` 与状态栏逐位核对,易验证;乙只能验距离守恒、世界中心不变,轨迹不可直接读数。甲的风险是 T(P)/T(-P) 写反(肉眼即见),乙是俯仰 ±90° 时 up 退化。

**4. 决定(我)**:甲为主、乙作附加能力。AI 认为乙"40 分钟最稳",我判断乙撑不起 E 的"复合机制"分,没有采纳它的排序。

**5. 自拟差异**:P 三轴可输入 + 蓝色轨迹环 + 状态栏显示标记世界中心;右键拖动环绕相机(只改 eye),并画相机参考环。

**6. 结果**

| 预测 | 实测 |
|---|---|
| θ=0 标记 (1.05,1.75,0) | (1.050,1.750,0.000) |
| θ=90 → (0,1.75,−1.05) | (0.000,1.750,−1.050) |
| θ=180 → (−1.05,1.75,0) | (−1.050,1.750,0.000) |
| P 各 +1,标记整体平移 (1,1,1) | (1.000,1.000,1.000) |
| 公转半径恒 1.05 | 1.050 |
| 右键环绕距离不变 | 8.688→8.688,M 参数不变 |

局限:轨迹环固定为水平圆(只绕 Y 轴),未做绕任意轴;未做双画布同步对照。

## 诚信声明

- 代码均本人运行核验,无法解释的 AI 输出未作为完成结果。
- AI 辅助:概念解释、故障假设清单、方案对比;本人完成:18 处 TODO、测试用例与数值判据、E 的方案取舍与自拟功能。