AI 协作日志
学生 Web 实验作品平台
学号:202412211401018 · 来源:ai-log.md
# 实验三 AI协作记录(请学生在实际完成实验后填写)
> 教师参考代码包不包含虚构的AI协作过程。学生提交时需填写真实工具、提示词、独立测试与结论。
## AI协作1:矩阵和变换次序
- 我自己的预测:
正方形初始世界坐标C=(0.5,0.25)。WebGL使用列向量。先平移后旋转RT(-c)和先旋转后平移T(-c)R结果不一样
- AI工具与原始提示词:
用webGL绘制图形,先平移后旋和先旋转后效果不同吗,为什么
- AI的建议:
列向量规则:矩阵表达式右侧变换先执行。
`multiply(R, T)`等价 R·T:先T后R → 公转;
`multiply(T, R)`等价 T·R:先R后T → 自转。
同时提醒需要做5组单元测试验证平移、缩放、旋转、方向向量w=0。
- 本人计算、运行与证据:
在task‑b页面,观察正方形运动轨迹;查看页面矩阵测试面板5项结果。
world模式:R·T,图形绕画布原点转圈;
self模式:T·R,图形原地转动。
- 采纳或修正结论:
world模式正方形绕原点公转,self模式在初始中心原地旋转,两种行为区分明显,和我预先预测一致。
## AI协作2:实际故障排查
- 错误现象与重现步骤:
程序全部页面白屏,控制台报错‘X is not defined’,transforms.js内部调用‘X.deg2rad’。
现象:打开task‑a.html直接启动失败,notice提示启动失败,没有任何图形输出。
- 我先检查了什么:
1.检查HTML引入js文件顺序;
2.检查gl‑matrix库是否正常加载;
3.查看控制台报错,定位错误位置在transforms.js的modelFor函数。
- AI工具与原始提示词:
transforms.js模块内部 Uncaught ReferenceError X is not defined,自执行函数内部不能使用外部导出对象别名
- AI建议的候选原因与测试:
1.transforms.js自执行闭包内部,变量X是外部app.js定义别名,本模块内部没有X;
2.模块内部应当直接调用本地函数’deg2rad()‘,不能写’X.deg2rad()‘;
3.multiply同理,内部不能写X.multiply,直接使用本地multiply函数;
4.导出给外部CG3Transforms对象只是给外部调用使用,模块内部不可以使用。
- 实测结果、修复与复测:
尝试把‘X.deg2rad’全部替换成本地‘deg2rad()’,‘X.multiply’替换成本地‘multiply()’,保存后刷新页面,报错消失。
真正原因:transforms.js闭包内部误用外部别名X。
修改位置:‘transforms.js’中‘modelFor()’函数两处‘X.deg2rad’改为‘deg2rad’;`X.deg2rad‘.
复测:task‑a、task‑b页面正常渲染图形,task‑c动画运行正常,暂停继续不会时间跳变。
## AI协作3:设计方案比较
- 我考虑的两种实现:
方案1:直接调用canvas.toBlob,不调用draw()。
方案2:截图前手动执行’this.draw()‘强制重绘画面,再执行toBlob;
- AI工具与原始提示词:
豆包
提示词:WebGL2 canvas toBlob得到黑色图片,preserveDrawingBuffer:true,
截图前是否需要主动draw(),两种实现方案对比优缺点
- 对比、取舍与原因:
方案1:直接调用canvas.toBlob,不调用draw()。
优点:代码行数少;
缺点:WebGL绘图缓冲区会被浏览器自动清空,如果刚好页面重绘间隔调用截图,缓冲为空,得到黑色空白PNG。依赖时机不稳定,可靠性差。
方案2:截图前手动执行’this.draw()‘强制重绘画面,再执行toBlob;构造函数开启’preserveDrawingBuffer:true‘。
优点:保证截图缓冲拥有最新画面,稳定,不会黑屏;
缺点:多执行一次完整绘制,微小性能开销,实验场景可以忽略。
- 实际实现及核验:
在savePNG函数开头执行’this.draw()‘,之后调用canvas.toBlob;增加回调判断blob是否为空,做提示;
使用临时a标签下载,之后释放’URL.revokeObjectURL(url)‘释放内存。
测试:多次点击保存截图;修改画布尺寸、修改背景色,截图文件都能正确保存图形与背景颜色,不会出现黑色图片。