AI 协作日志

学生 Web 实验作品平台

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

# 实验三 AI协作记录

> 以下记录为本人在完成实验过程中的真实协作过程:先有自己的预测与实现,再借助AI讨论/诊断,最后亲自运行核验。所有结论均以运行结果为准。

AI工具:豆包(Doubao)桌面端对话(含代码审阅、数值核验与故障诊断)

## AI协作1:矩阵和变换次序(Task B)
- 我自己的预测:
  目标是让同一个正方形(初始中心 C=(0.50, 0.25))能表现出"绕世界原点旋转"和"绕自身中心旋转"两种不同效果。我的预测:列向量约定下矩阵右侧先作用于顶点,所以绕世界原点旋转应写成 R·T(C)(先平移到 C,再绕原点转);绕自身中心旋转应写成 T(C)·R(先绕自身原点转,再平移到 C)。
- AI工具与原始提示词:
  "Task B 的 B-05,world 和 self 两种旋转中心,矩阵乘法次序分别怎么写?"
- AI的建议:
  确认了"右侧先执行"的约定,并给出两条:
  - world(公转):M = R(θ)·T(C),图形整体绕世界原点旋转;
  - self(自转):M = T(C)·R(θ),图形在原地旋转,中心不变。
  并提醒:正方形在 task-b 页面旋转轴固定为 Z,角度输入是度、进入三角函数前要转弧度。
- 本人计算、运行与证据:
  在 task-b.html 里把中心设为 (0.50, 0.25)、角度 45°,先选"世界原点·R×T"观察,再切"对象中心·T×R"观察;同时看右侧"矩阵数值检验"5 项测试。结果:world 模式下正方形整体绕画布中心公转;self 模式下正方形以 (0.50,0.25) 为圆心原地转动,轨迹明显不同。数值检验 5 项全部 ✓:平移 (1.3,-0.2,0,1)、均匀缩放 (2,0,0,1)、Z轴+90° (0,1,0,1)、Y轴+90° (0,0,-1,1)、平移作用于 w=0 向量不变 (1,0,0,0)。
- 采纳或修正结论:
  采纳 AI 建议,并与我的预测一致。通过运行确认:T·R 与 R·T 不交换,写反会出现"公转变自转"的典型错误;w=0 的方向向量乘平移矩阵不受影响。

## AI协作2:实际故障排查(Task C 联调)
- 错误现象与重现步骤:
  完成 js/transforms.js 的 B-01/B-02/C-01~C-04 后,打开 task-b.html 和 task-c.html 全部空白,浏览器控制台报 SyntaxError,页面 JS 整体没有执行。
- 我先检查了什么:
  先核对脚本引用顺序(common → geometry → graphics → transforms → app),路径都在;再逐个函数检查括号配对,怀疑是某个函数没闭合。
- AI工具与原始提示词:
  "哪里有问题"(附上我改过的 transforms.js 全文)
- AI建议的候选原因与测试:
  AI 指出:R() 函数在 `return M.fromZRotation(out,rad);` 之后缺少收尾的右花括号 `}`,导致后面的 deg2rad、triangle01 等全部被吞进 R 的函数体,整个文件语法错误;同时说明 S()、modelFor() 三个分支本身实现正确。
- 实测结果、修复与复测:
  在 R() 末尾补上 `}` 后重新打开页面:task-b.html 矩阵数值检验 5 项全过;task-c.html 四个形状各自开始动画(圆 1↔2 倍缩放、三角形 X 向往复、正方形绕原点公转、四面体绕自身 Y 轴自转),Console 无报错。确认真正原因就是替换占位代码时把 `return out;` 和 `}` 一起删掉了,修改位置为 js/transforms.js 的 R()。

## AI协作3:设计方案比较(Task E)
- 我考虑的两种实现:
  方案A:每帧在 CPU 上把变换后的顶点坐标算好,重新上传/覆盖 GPU 顶点 Buffer 再绘制;
  方案B:几何顶点只上传一次(STATIC_DRAW),每帧只计算 4×4 Model 矩阵并用 uniformMatrix4fv 交给 Shader。
- AI工具与原始提示词:
  "动画每帧更新 Model 矩阵而不是重建顶点 Buffer,这两种方案在时间成本、正确性、可维护性上怎么比较?"
- 对比、取舍与原因:
  - 时间成本:方案A每帧遍历全部顶点并上传,对象多时开销线性增长;方案B每帧只更新 16 个数,几乎可忽略。
  - 正确性:方案A容易在逐帧累加中产生浮点漂移;方案B位置由"初始中心 + 时间参数"现算,无累积误差。
  - 可维护性:方案A的变换逻辑散落在上传代码里;方案B矩阵构造集中在 modelFor(),加一种运动规律只需加一个分支。
- 实际实现及核验:
  采用方案B:geometry.js 提供局部顶点,graphics.js 构造时一次性建 VAO/Buffer;动画循环只推进各对象 elapsed 并更新 Model 矩阵,draw() 逐对象 uniformMatrix4fv。截图前先主动 draw() 重绘,再 canvas.toBlob 保存(Graphics 已配置 preserveDrawingBuffer:true)。运行数个周期后:圆始终在 1↔2 倍、三角形不漂移、正方形公转、四面体自转;暂停 2 秒恢复无突跳;PNG 尺寸与 Canvas 一致且含背景色,证明方案B在三个维度上均更优。

## 其他使用AI的记录(如有)
- Challenge C2 页面"没东西":页面布局正常但画布空白、数值面板全空,控制台无报错。我先核对 challenge.html 中 JS 引用的所有元素 ID 都存在,后由 AI 指出 js/challenge.js 只导出了 CG3Challenge 类、缺少 DOMContentLoaded 实例化入口。补上 `new CG3Challenge()` 入口后页面正常显示两个正方形与数值;并用 θ=0° 时两顺序完全重合(距离差 0.000)、θ=45° 时中心分别停在 (0.30,0.20) 与 (0.07,0.35) 完成数值核验。
- 矩阵数值核验:Task B 的 5 项数值测试与挑战页测试点 P 的变换结果均与手算一致后采纳,未盲目照搬。