AI 协作日志

学生 Web 实验作品平台

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

# 实验三 AI协作记录(请学生在实际完成实验后填写)

> 教师参考代码包不包含虚构的AI协作过程。学生提交时需填写真实工具、提示词、独立测试与结论。

## AI协作1:矩阵和变换次序
我自己的预测:
刚开始学习齐次矩阵变换,我以为代码书写的先后顺序,就是物体实际执行变换的顺序。写Task‑B公转自转功能,我把multiply(T,R)用来实现绕世界原点公转,运行后正方形只会原地自转,不会绕画布原点转圈。我了解列向量模式矩阵变换顺序会反转,但分不清glMatrix的multiply(A,B)哪个变换先执行,自己猜测参数写反,但不能确定。
- AI工具与原始提示词:
 豆包     glMatrix multiply(A,B) 矩阵乘法顺序,平移旋转,公转自转,为什么结果不一样
- AI的建议:
1. glMatrix.mat4.multiply(A,B)等价数学A × B,第二个传入的矩阵B先执行变换,A后执行。
2. 公转(绕世界原点):multiply(R,T),先平移物体位置,再绕世界原点旋转。
3. 自转(对象自身):multiply(T,R),物体先在局部原点旋转,再平移到画布位置。
4. 区分齐次坐标w=1点、w=0方向向量,平移不会改变方向向量。
- 本人计算、运行与证据:
修改bItem函数multiply的两个入参,切换下拉pivot参数world/self,观察正方形运动轨迹;同时查看页面输出矩阵文本,运行页面5组矩阵单元测试。world模式正方形绕画布原点转圈,self模式原地自转,全部测试项通过。
- 采纳或修正结论:
采纳AI对矩阵运算顺序的讲解,修正代码矩阵相乘参数。理解列向量右乘优先,Task‑B平移、旋转、缩放全部功能正常。

## AI协作2:实际故障排查
- 错误现象与重现步骤:
Task‑D鼠标点击画布创建对象,鼠标点击位置和生成物体位置对不上。点击画布中心,物体不在中心;点击画布下方,物体跑到画面上方;非正方形画布水平方向也会偏移。控制台无报错,对象可以正常创建,只是坐标映射出错。
重现步骤:打开task‑d.html,点击画布像素中心位置,生成物体偏离点击的位置。
- 我先检查了什么:
1. 打印getBoundingClientRect,确认可以拿到画布left、top位置。
2. u、v归一化计算可能出错。
3. 浏览器鼠标Y轴向下,WebGL世界Y轴向上,怀疑没有做Y轴翻转。
4. 实验文档提到画布宽高比aspect,猜测X坐标没有乘aspect造成水平偏移,自己无法拼出完整转换公式。
- AI工具与原始提示词:
豆包   WebGL canvas鼠标坐标转世界坐标,Y轴颠倒,点击位置物体生成位置不对,aspect宽高比
- AI建议的候选原因与测试:
候选原因:
1. 没有Y轴翻转处理,浏览器与WebGLY轴方向相反;
2. X坐标没有乘以画布宽高比aspect;
3. u、v归一化计算错误;
4. 直接把clientX、clientY当做世界坐标。
测试建议:打印u、v、cx、cy中间变量观察数值,定位错误点。
- 实测结果、修复与复测:
打印中间变量,发现cy正负颠倒,cx缺少aspect相乘。修复addFromMouse内部坐标转换代码,正确计算u、v、aspect、cx、cy。
复测:800×600画布点击中心(400,300),对象生成在世界坐标(0,0);各个点击位置物体坐标都匹配。Task‑D多对象创建、参数快照功能全部正常。

## AI协作3:设计方案比较
- 我考虑的两种实现:
本处针对Task‑E的PNG截图导出功能。
方案A:截图按钮触发时,先主动调用this.draw()重绘画布,再调用toBlob导出图片。
方案B:不执行draw重绘,直接调用toBlob,依靠浏览器保留WebGL绘制缓冲。
- AI工具与原始提示词:
豆包   WebGL2 canvas.toBlob截图,preserveDrawingBuffer,截图前draw重绘和直接截图两种方案对比,学生实验哪个更合适
- 对比、取舍与原因:
方案A
优点:不依赖preserveDrawingBuffer配置;浏览器丢弃缓冲也能得到完整画面;切换标签页截图不会黑屏,实验提交可靠性高;本实验图形不多,额外绘制性能开销很小。
缺点:截图操作会额外执行一次绘制函数。
方案B
优点:代码行数更少,不需要额外draw调用。
缺点:强依赖浏览器缓冲状态;浏览器会自动释放WebGL缓冲,很容易导出黑色空白PNG,实验验收有失败风险。
取舍:选择方案A。实验作业正确性优先级高于代码简短,规避黑屏风险。
- 实际实现及核验:
修改savePNG函数,函数开头执行this.draw(),再执行toBlob下载PNG。
核验:正常截图图片与画布画面完全一致;切换浏览器标签页返回再截图也不会黑屏;Task‑E画布设置、清空画布等其余功能不受改动。

其他AI使用记录:Challenge‑C1选做加分题
C1故障排查:点击图形物体无法选中,总是新建对象
- 错误现象与重现步骤:
开发Challenge‑C1,预期点击图形选中物体、点击空白创建对象;实际点击已绘制图形不会选中,直接新建对象,控制台无语法报错,UI按钮正常。
- 我先检查了什么:
核对HTML按钮id与JS;检查class类大括号配对,之前粘贴代码出现过大括号错位;怀疑拾取pickObjectByMouse没有运行;猜测removeEventListener删除监听失效。
- AI工具与原始提示词:
 豆包   JS addEventListener使用箭头匿名函数,removeEventListener为什么删不掉监听,两套click事件同时运行
- AI建议的候选原因与测试:
匿名箭头函数每次生成全新函数对象,removeEventListener无法移除旧监听,新旧两套click事件同时执行。
给出两套思路:①频繁绑定解绑监听;②保留一套监听,布尔标记,函数内部分支处理。
- 实测结果、修复与复测:
放弃绑定解绑监听方案;App构造函数增加this.isChallengeMode = false;challenge页面开启标记;删除canvas相关add/removeEventListener代码;在addFromMouse开头增加拾取判断,命中物体直接return阻止新建对象。
复测:点击图形正常选中,点击空白新建对象;修改单对象速度、删除、取消选择全部可用;task‑a~e不受任何影响。

C1实现方案比较
- 我考虑的两种实现:
方案 A:给 canvas 绑定两套 click 监听;challenge 页面删掉旧监听,注册全新拾取优先的点击事件。
方案 B:保留原来的鼠标点击监听,增加一个布尔模式标记。
- AI工具与原始提示词:豆包  做 WebGL 拾取选中,页面之间复用同一个 canvas,两种点击处理怎么选择,优缺点对比
- 对比、取舍与原因:
- 方案 A(替换监听)
优点:逻辑看上去分离,C1 代码独立。
缺点:JS 匿名箭头函数无法 removeEventListener,会残留旧事件,出现重复执行 bug;维护麻烦,切换页面容易监听堆积。
方案 B(标记 + 分支)
优点:只使用一套 DOM 监听,不会产生事件堆积;task‑a~e 完全复用原有逻辑,不需要改动页面绑定;模式切换安全稳定。
缺点:同一个函数里面 if 分支变多,代码可读性稍微下降。
取舍:选择方案 B,避开匿名监听删除的 JS 陷阱,保证必做题代码完全不受 C1 加分代码干扰,这对于实验项目很重要,不能改坏前面已经完成的 A‑E 任务。
- 实际实现及核验: 使用this.isChallengeMode标记。
1. challenge 页面开启标记,点击优先执行包围盒拾取;命中物体 return 阻止新建对象;空白位置继续创建对象。
2. 普通 task 页面标记关闭,直接跳过拾取逻辑,沿用 D/E 原来鼠标点击创建对象全部旧逻辑。
3. 核验:
①C1 功能:选中物体、修改单对象速度、单独删除对象、取消选择全部可用;使用简化二维包围盒拾取。
②打开 task‑a、b、c、d、e,原有全部功能和修改之前一模一样,没有引入副作用。