AI 协作日志

学生 Web 实验作品平台

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

# 实验三 AI协作记录

> 记录内容均来自本次实验的真实完成过程:先独立预测/排查,再咨询AI,最后用运行现象与数值核验。

## AI协作1:矩阵和变换次序

- **我自己的预测**:做 Task B-05 的旋转中心时,我推测"公转"应该是先把物体平移到轨道位置、再绕原点转,所以矩阵顺序是 `T·R`(T 在左、R 在右);"自转"则是先原地转再平移,即 `R·T`。对这个判断我不是很确定。
- **AI工具与原始提示词**:豆包(Doubao)。提示词大意:"Task B 的旋转,pivot=world(世界原点公转)和 pivot=self(对象中心自转)时,T 和 R 的乘法顺序分别应该怎么写?"
- **AI的建议**:采用列向量约定,矩阵乘法中**右侧的矩阵先作用于顶点**:
  - 世界原点公转 `world`:`M = R · T`(T 先执行,把物体搬到中心位置,再绕世界原点旋转);
  - 对象中心自转 `self`:`M = T · R`(R 先执行,物体先在局部原点自转,再平移到中心位置)。
  - 并用地球"公转/自转"作类比解释两种现象。
- **本人计算、运行与证据**:手动推算 `Rz(90°)·T(0.5,0.25)`:顶点先被平移到 (0.5,0.25),再绕世界原点转 90°,运动轨迹是以原点为圆心的圆弧——公转;而 `T·Rz(90°)` 中旋转先作用,物体姿态原地改变,再被平移到 (0.5,0.25)——自转。运行 `task-b.html`:正方形切换两种 pivot,画布上明显呈现"绕画布中心绕圈"与"在自身位置原地打转"两种不同行为;右侧 5 项矩阵数值测试(平移、均匀缩放、Z轴+90°、Y轴+90°、w=0 方向向量)全部通过 ✓。
- **采纳或修正结论**:采纳 AI 建议,修正了我最初的预测(公转应为 `R·T`,自转应为 `T·R`)。代码与运行现象均验证正确。

## AI协作2:实际故障排查

- **错误现象与重现步骤**:在 `transforms.js` 完成 C-02(往复平移)后,刷新 `task-c.html`,**画布全黑,无任何图形显示**;打开控制台可见报错 `X is not defined`。
- **我先检查了什么**:先确认 A 阶段绘制层没问题(控制台 `CG3TEST.addAtWorld('triangle', ...)` 能画出三角形),排除 graphics.js;随后逐行检查 `modelFor()`,发现 C-02 分支里写了 `X.deg2rad(obj.directionDeg)` 和 `X.T(...)`。
- **AI工具与原始提示词**:豆包(Doubao)。提示词大意:"transforms.js 里调用 X.deg2rad 报错 X is not defined,X 是什么?为什么这里不能用?"
- **AI建议的候选原因与测试**:`X` 只是 **app.js 顶部**为外部模块起的局部别名(`const X = CG3Transforms;`),在 `transforms.js` 自己内部并不存在 `X`,应直接使用本文件的裸函数名 `deg2rad`、`T`、`S`、`R`、`multiply`、`triangle01`。建议把 `X.deg2rad` 改为 `deg2rad`、`X.T` 改为 `T` 后重刷页面验证。
- **实测结果、修复与复测**:按建议修改后,画布恢复正常,四个对象显示出来(当时 C-05/C-06 未填,动画时间不前进,图形静止属预期状态);随后填完 C-05(帧间隔 dt,含 0.1s 上限限制与暂停归零)和 C-06(`elapsed += dt × globalSpeed × obj.speed`),动画正常运行:圆 1↔2 倍呼吸缩放、三角形左右往复、正方形绕原点公转、四面体绕自身 Y 轴自转,暂停/继续与全局速度滑块均生效。

## AI协作3:设计方案比较

- **我考虑的两种实现**:Task C 的三角形往复平移,周期函数有两种候选:
  - 方案A:使用三角波 `triangle01(obj.elapsed / obj.period)`,位移在 ±amplitude 间做折线往复;
  - 方案B:使用正弦 `Math.sin(Math.PI * 2 * obj.elapsed / obj.period)`,位移平滑往复。
- **AI工具与原始提示词**:豆包(Doubao)。提示词大意:"三角形往复平移的周期位移,用三角波还是正弦?哪个更合适?"
- **对比、取舍与原因**:实验指导书明确"周期函数可以使用三角波或平滑正弦规律",两种都满足不漂移、可往复的要求。最终选择**正弦**,原因:
  1. 正弦曲线平滑、转向无尖角,运动观感更自然;
  2. `app.js` 调试面板 `motion-debug` 中已有的三角形位移公式就是 `amplitude * Math.sin(2π·elapsed/3)`,用同一公式便于把画面现象与面板数值对照核验。
- **实际实现及核验**:实现为 `offset = obj.amplitude * Math.sin(Math.PI * 2 * obj.elapsed / obj.period)`,位移始终基于初始中心 `c` 计算(`return T(c[0]+offset*dx, c[1]+offset*dy)`),避免逐帧累加漂移。运行 `task-c.html`:三角形在 ±0.30 范围内水平往复,长时间运行位置不偏移,与调试面板数值一致。