AI 协作日志

学生 Web 实验作品平台

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

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

## 协作1:矩阵与变换次序(Task B)

### 我的目标和预先预测
- 正方形初始中心 C=(0.50, 0.25, 0)。
- 预测 R·T(世界原点旋转):先平移到 C,再绕画布原点旋转,正方形会绕原点做圆周运动(公转)。
- 预测 T·R(对象中心旋转):先在局部原点旋转,再整体平移到 C,图形在 C 点原地转动(自转)。
- 预测原因:列向量体系下矩阵从右向左执行,右边先作用于点。

### 关键提示词(原文)
> WebGL gl-matrix 列向量 R*T 与 T*R 矩阵乘法顺序,变换效果区别

### AI建议摘要
- 列向量约定:M = A·B 表示先执行 B,再执行 A。
- R·T:先平移到 C,再绕世界原点旋转 → 公转。
- T·R:先局部旋转,再平移到 C → 自转。
- 缩放同理:要绕自身中心缩放,顺序应为 T(C)·S,先缩放再平移。

### 我的计算或测试方法
1. 在 task-b.html 中选择旋转模式,初始中心设为 (0.50, 0.25)。
2. 分别切换"世界原点 · R×T"和"对象中心 · T×R",调整角度观察轨迹。
3. 手动代入点 P=(1,0,0,1) 验证:Rz(90°) 后应为 (0,1,0,1)。

### 实际结果与证据
- 世界原点模式:正方形绕画布原点画大圆,符合公转预期。
- 对象中心模式:正方形在 (0.5, 0.25) 位置原地转动,符合自转预期。
- 数值检验面板中 rotateZ 测试通过(✓)。

### 采纳、拒绝或修正的结论
- 采纳 AI 建议的矩阵顺序规则。
- 修正点:最初误把矩阵顺序写成 R·T 是先 R 后 T,实际列向量下是先右后左,重新核对后修正代码。

---

## 协作2:故障诊断与修复(Task C 暂停后时间跳变)

### 错误现象、触发步骤
- 动画运行中点击暂停,等待 2~3 秒后再点继续,画面突然跳一大段,而不是从暂停处平滑继续。

### 我先检查了什么
1. rAF 是否被重复创建,导致多个循环叠加。
2. running 标志是否正确切换。
3. elapsed 时间累加逻辑——是否在暂停期间仍然累加。

### 关键提示词(原文)
> webgl requestAnimationFrame 暂停恢复动画时间突然跳跃怎么修复

### AI列出的候选原因
1. 暂停时没有停止累加 elapsed,时间一直在走。
2. dt 计算没有考虑暂停间隔,恢复后第一帧 dt 特别大。
3. 切换后台标签页后 rAF 暂停,回来时 dt 累积过大。

### 我逐项测试的结果
- 候选1:检查代码,发现暂停时 dt=0 占位,根本不累加,但恢复后第一帧 dt 会很大。
- 候选2:确认!暂停期间 lastMs 一直被更新(因为 tick 还在跑,只是不累加 elapsed),恢复时 dt 应该正常。
- 候选3:切换后台标签后再回来,dt 会非常大,导致突然跳变。

### 真正原因、修改位置和复测结论
- 真正原因:没有对 dt 做上限限制,切换后台标签或暂停恢复后第一帧 dt 可能很大。
- 修改位置:app.js 的 tick() 函数,加入 `if(dt > 0.1) dt = 0.1;` 限制最大帧间隔 0.1 秒。
- 复测:暂停任意时长后恢复,动画从暂停位置继续,无跳变;切换后台标签页再回来也不会突然跳一大段。

---

## 协作3:方案比较与实现核验(Task E PNG截图黑图问题)

### 待解决的具体设计问题
- WebGL Canvas 调用 toBlob 时,有时候得到的是黑色空白图,两种实现方案对比。

### 关键提示词(原文)
> webgl canvas.toBlob 得到黑色截图 两种实现方案对比 重绘缓冲

### 两种方案及取舍依据
| 方案 | 做法 | 优点 | 缺点 |
|------|------|------|------|
| 方案1 | 直接调用 toBlob | 代码简单 | 可能拿到已被清空的绘制缓冲,得到黑图 |
| 方案2 | 先手动调用 draw() 重绘一帧,再立即 toBlob | 保证缓冲中有最新画面,截图稳定 | 多一次绘制调用,开销极小 |

### 我最终采用的实现
- 采用方案2:在 savePNG() 中先调用 this.draw(),再执行 toBlob。
- 同时 Graphics 构造时已设置 `preserveDrawingBuffer: true`,进一步保证缓冲不被提前清除。

### 测试与反思
- 多次测试暂停/运行状态下截图,PNG 都包含正确的背景色和图形。
- 反思:preserveDrawingBuffer 虽然能解决大部分情况,但主动重绘一次再截图是更稳妥的做法,不依赖浏览器内部缓冲策略。

---

## 其他使用AI的记录
- 协助生成圆的48段三角形扇面顶点代码,自行核对圆周角计算是否正确。
- 核对鼠标坐标转世界坐标的公式,验证 800×600 画布点击中心确实得到 (0,0),点击左上 (200,150) 约为 (-0.667, 0.5)。
- 确认 triangle01 三角波公式:`1 - |1 - 2*phase|`,验证 t=0/0.25/0.5/0.75/1 输出为 0/0.5/1/0.5/0。