AI 协作日志
学生 Web 实验作品平台
学号:202412211402016 · 来源:ai-log.md
# 实验三 AI协作记录
AI工具:Codex。
学号:202412211402016。
记录范围:本日志参考实验一的“目标、提示词、AI建议、判断、测试与结论”结构,整理本次真实对话及工具运行结果。本次由用户提供学生填充版并要求补全TODO,代码实现、浏览器自动测试与截图检查由Codex执行。下文的算法判断和测试结果均注明执行者,不将AI测试写成学生本人已经亲自完成的实验。
本次真实关键提示词(原文):
> 那你帮我做一份,完全按照要求,只修改todo内容,然后导出为文件夹,我自己解压
随后用户指定已经解压的实验2、实验3文件夹,并补充:
> 那么就用这两个地址来进行吧,我已解压完成
以下三个协作点均来自上述同一次补全请求,没有另行编造三段独立的咨询对话。用户在咨询前的个人预测和亲自运行后的理解尚未在对话中提供;如课程要求个人独立核验,应由本人运行后如实补充。
## AI协作1:矩阵与变换次序
### 我的目标
补全缩放和三轴旋转矩阵、区分世界原点公转与对象自身中心自转,并使Task B的控制和五项数值检查有效。
### 提示词
使用前述真实补全请求,本次未另行提出矩阵咨询提示词。
### AI关键回答及计算依据
采用列向量,右侧矩阵先作用。对于初始中心C=(0.5,0.25)的对象,Rz(45°)·T(C)先平移后旋转,中心应变为约(0.176777,0.530330);T(C)·Rz(45°)则保持中心(0.5,0.25)。这是Codex用于实现和核验的数学判断,用户在咨询前的个人预测未提供。
围绕自身中心缩放采用T(C)·S(k)。旋转矩阵分别调用随包公共库的fromXRotation、fromYRotation和fromZRotation;公共库文件没有修改。
### 实际测试结果(Codex执行)
本地Edge打开Task B,五项检查均显示通过:
| 检查 | 结果 |
|---|---|
| T(0.3,-0.2)作用于(1,0,0,1) | (1.3,-0.2,0,1) |
| S(2)作用于(1,0,0,1) | (2,0,0,1) |
| Z轴+90° | (0,1,0,1),允许浮点误差 |
| Y轴+90° | (0,0,-1,1),允许浮点误差 |
| 平移作用于w=0方向向量 | (1,0,0,0) |
切换Task B旋转中心并读取Model矩阵平移列,R·T与T·R分别符合上述计算值,数值容差检查通过。
### 采用方案与结论
采用world→R·T、self→T·R的统一规则,在静态矩阵实验和动态对象中保持一致。
## AI协作2:动画故障诊断与修复
### 现象及排查依据
原始学生版tick中dt固定为0,而且C-06尚未推进obj.elapsed;因此时间相关运动无法发生。transforms.js中相应Model矩阵也仍为静止占位实现。这里记录的是本次实际检查和复现的模板未完成问题。
### 提示词及AI建议
沿用真实补全请求,没有编造用户独立提出的Bug Hunt提示词。Codex的排查顺序是:先读动画时间,再确认dt和elapsed的更新条件,最后检查modelFor及矩阵次序,而不是在每帧重新上传几何。
### 实际对照测试(Codex执行)
在原始Task C页面等待约0.5秒后,四对象elapsed仍全部为0。完成版相同测试中,四对象elapsed均约0.518秒,说明单一rAF循环已推进全部对象时间。
修改位置为js/app.js的C-05与C-06,以及js/transforms.js的C-01—C-04:
```javascript
const dt=Math.max(0,Math.min((ms-this.lastMs)/1000,.1));
if(this.running&&this.globalSpeed>0)
for(const obj of this.objects)
obj.elapsed+=dt*this.globalSpeed*obj.speed;
```
每帧仍更新lastMs,暂停时不推进elapsed,并限制过大的帧间隔。创建循环的原有结构没有改动,不会因点击继续而新增循环。
### 复测结果与结论
四对象时间均向前推进;点击暂停后等待,再次读取所有elapsed,与暂停时一致。抽样检查圆的缩放范围为1—2且中心不动。三角形位置由初始中心加周期位移计算,避免反复累加位置造成漂移。暂停测试只验证了本次自动检查覆盖的时间段,不把未执行的长时间手工测试写作事实。
## AI协作3:对象组织、画布与截图方案
### 设计目标与提示词
沿用本次补全请求,完成参数快照、鼠标添加、画布设置、清空和PNG下载。以下是Codex实现中的方案说明,未虚构另一次用户提问。
### 两种方案及取舍
方案一:动画时重新计算每个对象的全部世界顶点并反复上传Buffer。这样会增加CPU计算与数据上传,也更容易混淆对象初始参数和当前位置。
方案二:复用原框架中的固定局部几何Buffer,以对象记录保存初始中心、模式、方向、幅度、旋转中心、速度和elapsed,每帧只计算Model矩阵并更新Uniform。此方案符合实验“只补TODO”和复用GPU资源的要求,最终采用。
截图可选择在保存前主动重绘后toBlob,或依靠保留绘图缓冲。原框架已经设置preserveDrawingBuffer:true;本次同时在保存前主动draw,再toBlob并检查Blob非空,以临时链接下载后清理URL。
### 实际实现与测试结果(Codex执行)
在Task E通过控件和鼠标创建6个对象:圆、两种方向三角形、world/self两个正方形、四面体。读取对象记录确认方向分别为0°与30°、两种pivot独立保存,数量为6。
将画布调整为960×540后对象仍为6,正交投影X缩放符合540/960,圆形比例不变。点击下载PNG,读取文件头确认960×540且文件非空;打开图像确认包含浅色背景及六个图形。
点击清空后数组长度和界面数量均为0;按调整后Canvas显示区域的1/4、1/4位置再次点击,世界中心接近(-0.889,+0.5),定位与再次添加检查通过。Task A四模型/单模型切换、全部五个任务启动及JavaScript异常检查均通过。
### 结论
保留原有对象结构和GPU资源,TODO实现只连接参数、状态、矩阵及导出管线。对象参数在创建时保存,全局速度和暂停则影响所有对象。
## 核验材料与个人复核
evidence/包含六对象页面截图、960×540实际导出的PNG和本次自动测试记录。上述证据由Codex生成。本人应亲自打开index.html,复核公转/自转、三角形方向、暂停/速度、画布比例和截图,并按真实情况补充个人预测与理解。本日志不声称已完成邮件或课程平台提交。