AI 协作日志
学生 Web 实验作品平台
学号:202412211401010 · 来源:ai-log.md
# 实验三 AI协作记录(请学生在实际完成实验后填写)
> 教师参考代码包不包含虚构的AI协作过程。学生提交时需填写真实工具、提示词、独立测试与结论。
## AI协作1:矩阵和变换次序
- 我自己的预测:
`R·T`与`T·R`
`R·T`先移动再旋转
`T·R`先旋转再移动
- AI工具与原始提示词:
工具:deepseek
原始提示词:推导 Rz(45°)·T(C)和T(C)·Rz(45°) 对局部原点 (0,0,1) 的变换顺序结果,这个和C=(0.5,0.25) 的几何作用有什么不同
- AI的建议:
1. 对 R·T(C):先把局部原点 o 平移到 C,得到点 C;随后 R 绕世界原点旋转,把 C 整体转到 R·C 的位置。所以对象中心 C 被"甩"到别处,表现为绕世界原点公转,姿态也随 R 改变。代入 C=(0.5,0.25)、θ=45°,AI 给出的结果与手算一致:Rz(45°)·(0.5,0.25) ≈ (0.177, 0.530)。
2.对 T(C)·R:R 先作用,但此时对象还在局部原点附近,相当于对象绕自身中心自转;随后 T(C) 把整个对象平移到 C。C 是平移终点,不参与旋转,所以中心始终停在 (0.5,0.25),只有姿态转了 45°。
3. 结论:两个矩阵一般不相等,仅在 C=0 或 R 为单位阵时相同;矩阵乘法不满足交换律,几何上就是"先转后移"与"先移后转"的区别。
- 本人计算、运行与证据:
{translate: Array(4), scale: Array(4), rotateZ: Array(4), rotateY: Array(4), vector: Array(4)}
rotateY: (4) [6.123234262925839e-17, 0, -1, 1]
rotateZ: (4) [6.123234262925839e-17, 1, 0, 1]scale: (4) [2, 0, 0, 1]
translate: (4) [1.2999999523162842, -0.20000000298023224, 0, 1]
vector: (4) [1, 0, 0, 0][[Prototype]]: Object
控制台结果
- 采纳或修正结论:
采纳“右乘先执行”的解释,和我的实验结果验证一致。
确认 w=0 方向向量不受平移影响。
## AI协作2:实际故障排查
- 错误现象与重现步骤:
现象:动画暂停一段时间后再点继续,图形在恢复的第一帧突然跳变位置而不是继续
重现步骤:
四个对象正在运动
点暂停,等3秒
点继续,图形瞬移。
- 我先检查了什么:
Console 看是否有报错:无红色错误,Shader/上下文正常,排除初始化问题。
打印 CG3TEST.getScene()[0].elapsed,暂停期间该值不增长,说明“暂停时 dt=0”的逻辑本身生效。
在 tick 内临时加 console.log(dt),对比正常与错误版本恢复首帧的 dt
判断问题不在动画公式,而在“暂停期间时间戳是否更新”这一处。
- AI工具与原始提示词:
工具deepseek
提示词:动画中暂停一段时间后恢复,图形在继续之后突然跳变,为什么,怎么解决
- AI建议的候选原因与测试:
1) 暂停期间冻结了 lastTime,恢复首帧 dt 等于整个暂停时长。
测试:有意把 this.lastMs=ms 移入 if(this.running),复现瞬移,
console 显示恢复首帧 dt≈3.0s。→ 命中,确认为本次根因。
2) 存在多个 requestAnimationFrame 循环重复累加时间。
测试:全文搜索 requestAnimationFrame,仅 tick 末尾一处;
打印每帧调用次数为 1。→ 排除。
3) dt 未限幅,切后台标签页或断点调试后 dt 过大。
测试:在错误版本上再去掉 if(dt>0.1)dt=0.1,切标签页 10 秒回来跳变更明显;
恢复限幅后跳变减轻但冻结 lastTime 仍会跳。→ 说明限幅是必要的第二道防线,
但不是本次根因。
4) 暂停时把 elapsed 清零或复位。
测试:检查代码无清零逻辑,暂停期间 elapsed 不变。→ 排除。
5) 暂停/继续按钮重复绑定事件,导致状态翻转多次。
测试:打印 running 状态,每次点击只翻转一次。→ 排除。
- 实测结果、修复与复测:
原因:暂停期间未更新 this.lastMs,恢复首帧 dt 等于整个暂停时长,
## AI协作3:设计方案比较
- 我考虑的两种实现:
- AI工具与原始提示词:
- 对比、取舍与原因:
- 实际实现及核验:
**思考题A:** 若只改变圆的显示位置,是否必须重新上传它的全部局部顶点?为什么?
不用,圆的局部顶点在 Graphics 构造函数里已经上传一次。改变位置只需改 Model 矩阵里的平移分量
**思考题B:** 为什么`T(C)·R`与`R·T(C)`通常不相等?方向向量`w=0`为什么不会随着平移矩阵改变?
先移后转和先转后移不同而且不满足交换律,w=0系数为0,不参与计算
**思考题C:** 为什么建议从对象的初始中心和时间参数计算位置,而不是持续对“当前坐标”累加位移?为什么动画可以持续更新Uniform而不重新上传所有顶点?
累加会产生浮点误差累积,改速度和暂停比较难搞。
顶点只负责描绘形状,Model矩阵来变换
**思考题D:** 为什么对象需要同时保存“初始中心”和“当前动画状态”?为什么不能只保存GPU里的顶点数组?
初始中心是基准点做当前状态的参考,同时保存可以做速度变化和暂停的参考。
顶点是局部的形状还有位置时间状态其他条件构成一整个对象运动