AI 协作日志

学生 Web 实验作品平台

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

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

AI工具:Cursor Grok 4.6(本机对话,用于补全 TODO、对照矩阵次序与排错)

## 协作1:矩阵与变换次序
- 我的目标和预先预测:
  正方形初始中心 `C=(0.50, 0.25, 0)`,列向量右侧先执行。
  1. `R·T(C)`(世界原点):先把正方形放到 C,再绕世界原点转。中心轨迹是半径约 `sqrt(0.50²+0.25²)≈0.559` 的圆,图形会绕画布原点公转。
  2. `T(C)·R`(自身中心):先绕局部原点旋转,再平移到 C。中心应固定在 `(0.50, 0.25)`,只原地转。
  点 `P=(1,0,0,1)` 的五项数值预测:`T(0.3,-0.2)`→`(1.3,-0.2,0,1)`;`S(2)`→`(2,0,0,1)`;`Rz(90°)`→`(0,1,0,1)`;`Ry(90°)`→`(0,0,-1,1)`;`w=0` 的方向向量平移后仍为 `(1,0,0,0)`。
- 关键提示词(原文):
  `桌面上有两个文件,请按照实验三.md要求完成实验3_学号`
  以及后续对 `TODO B-01~B-05`、`R·T` 与 `T·R` 的核对。
- AI建议摘要:
  用 `glMatrix.mat4.fromScaling / fromXRotation / fromYRotation / fromZRotation` 组装矩阵;世界公转 `multiply(R, T)`,自转 `multiply(T, R)`。不要手写覆盖顶点 Buffer。
- 我的计算或测试方法:
  打开 `task-b.html`,看页面五项数值测试全部打勾;把旋转中心切到世界原点再切到对象自身中心,观察同一正方形轨迹是否不同。控制台执行 `CG3TEST.matrixTests()` 核对数组。
- 实际结果与证据:
  五项测试通过。`R·T` 时正方形绕画布中心跑圈;`T·R` 时中心停在 `(0.50, 0.25)` 原地转动。方向向量平移不变,说明 `w=0` 不吃平移列。
- 采纳、拒绝或修正的结论:
  采纳矩阵次序建议。没有改成 `T·R` 充当公转(那会把正方形变成原地转,与实验验收相反)。

## 协作2:故障诊断与修复
- 错误现象、触发步骤:
  实现动画循环时,若暂停期间仍用 `ms - lastMs` 作为 `dt` 且不刷新 `lastMs`,点“继续”后四面体/正方形会瞬间跳一大段角度。这是指导书点名的“暂停恢复突跳”。
- 我先检查了什么:
  `tick()` 是否重复 `requestAnimationFrame`(框架已在函数末尾调度一次,没有再开第二个循环);`elapsed` 是否在暂停时仍累加。
- 关键提示词(原文):
  对照实验说明中的 C-05/C-06:暂停期间不要累加动画时间,限制过大 dt,避免恢复突跳。
- AI列出的候选原因:
  1. 暂停时未把 `dt` 置 0,却仍累加 `elapsed`;
  2. 暂停时不更新 `lastMs`,恢复第一帧 `dt` 等于暂停时长;
  3. 后台切标签后单帧 `dt` 过大;
  4. 多次启动 rAF。
- 我逐项测试的结果:
  框架本身只有一条 rAF 链。若只把 `dt` 置 0 但不更新 `lastMs`,恢复第一帧仍会跳。正确做法是:**每帧都更新 `lastMs`,暂停时 `dt=0`,并把 `dt` 钳制到 0.1 秒**。
- 真正原因、修改位置和复测结论:
  原因是暂停间隔被当成动画时间。修改 `js/app.js` 的 `tick()`。复测:暂停约 2 秒画面冻结,继续后从原姿态接着转,无突跳;速度滑到 2 后明显变快,滑到 0 停止。

## 协作3:方案比较与实现核验
- 待解决的具体设计问题:
  Task E 截图与对象数据组织:截图时缓冲可能是空的;对象参数若每帧读菜单,改工具栏会带动旧对象。
- 关键提示词(原文):
  比较两种至少包含“对象数据组织 / 模型矩阵更新 / 截图实现”之一的实现方案,说明时间成本、正确性和可维护性。
- 两种方案及取舍依据:
  **截图:** A) 依赖 `preserveDrawingBuffer:true` 直接 `toBlob`;B) 点击保存前主动 `draw()` 再 `toBlob`。A 省一次绘制,但若浏览器清空缓冲仍可能得到黑图。B 多一次绘制、代码多几行,正确性更高。
  **对象参数:** A) 每帧从 DOM 读当前菜单计算所有对象的 Model;B) 点击时把方向/幅度/轴/中心/缩放上限快照进 `objects[]`,全局速度与暂停才作用于全体。A 写起来短,但会破坏“改菜单只影响下一次添加”。B 略多字段,符合验收。
- 我最终采用的实现:
  截图用 B:`savePNG()` 先 `this.draw()` 再 `canvas.toBlob(..., 'image/png')`,文件名 `实验3_画布_时间.png`。对象用 B:`selectOptions()` 返回普通对象字面量,经 `createObject()` 写入每条记录。
- 测试与反思:
  Task D:中心点击提示约 `(0.000, 0.000)`;约 `(200,150)` 处约 `(-0.667, 0.500)`。先加两个圆再加两个三角形,四个都在动。Task E:清屏后计数 0 仍可再添加;应用 `960×540` 后圆仍是圆。截图前重绘是必要的,不能只信 `preserveDrawingBuffer`。

## 其他使用AI的记录(如有)
- 工具、原始关键提示词、处理说明和验证:
  同一会话内按 `README-TODO.md` 的 A-01~E-03 共 18 项补全 `js/graphics.js`、`js/transforms.js`、`js/app.js`。验证方式:本地打开 A–E 页面,看 Console、五项矩阵测试、动画暂停/速度、鼠标世界坐标与清屏。Challenge 未做(选做)。