AI 协作日志
学生 Web 实验作品平台
学号:202412211402013 · 来源:ai-log.md
# 实验五AI协作与核验记录(学生填写) 学号:202412211402013 姓名:顾喆祺 日期:2026.11.9 > 必须记录**自己的预测、原始问题、AI建议、自主判断与实际核验**。AI代码不能代替本人解释。可附完整对话链接/导出记录,避免只放聊天截图而无测试证据。 ## 协作一:观察与投影概念核验(Task B / C,3分) 1. 我的问题和事先预测(M/V/P中谁变化?预期画面如何变化?): 我想要区分移动模型(修改 M)、移动相机(修改 V)、切换投影(修改 P)三者效果。 预测: 修改 M(旋转模型):模型世界坐标改变,状态栏模型世界中心改变; 修改 V(相机动,M 不变):画面会旋转,但模型世界中心数值保持不变; 修改 P(正交 <--> 透视,M、V 完全不动):物体世界位置不变;正交下远近物体表观尺寸一样,透视出现近大远小。 2. 我实际输入给AI的提示词: 在 WebGL2 右手坐标系、列向量和 P・V・M 的顺序下,我想比较移动物体与移动相机、正交与透视投影。请给我三组能区分原因的控制变量实验,指出应改变 M/V/P 中的哪项,说明可以打印哪些坐标数值进行核验,不要直接生成整套代码。 3. AI建议摘要(包括关键数学依据): 实验 1(区分 M 与 V):固定 P; 实验组 A:修改 M 的 ry 旋转模型(改变模型矩阵 M);核验:读取状态栏模型世界中心,数值发生改变。 实验组 B:修改 V 的 eye 参数旋转相机(改变观察矩阵 V);M 保持原样;核验模型世界中心数值不变,只是视觉转动。 实验 2(正交 vs 透视):固定 M、V,仅修改 P;开启远近两个等大对照立方体; 正交投影:远近立方体屏幕大小一致;透视投影近处大远处小。 实验 3(FOV 改变):M、V 不变,修改透视 FOV;FOV 增大物体画面占比缩小,物体世界坐标完全不变,只改变投影矩阵。 核验依据:`P·V·M·N`变换流水线;V 仅把世界坐标转到相机空间,不会修改物体的世界坐标;只有 M 才修改物体世界位置。 4. 我的判断和采纳/拒绝理由: 全部采纳 AI 提出的三组控制变量思路;但矩阵代码由自己结合实验指导书手写,没有直接复制 AI 完整代码。关键点:判断 M/V 不要只看画面观感,要看状态栏输出的模型世界中心数值,肉眼画面相似不能当作等价。 5. 我的测试参数、测试操作与结果(附截图/数值): 测试 1:Task‑B,点击侧面相机预设。M 参数全部不变;eye 变为`(8,0,0)`;状态栏模型世界中心保持`(0.00,0.00,0.00)`。画面视角切换,但物体世界坐标不动。 测试 2:Task‑C,M/V 固定;切换正交模式;两个对照立方体,近处与远处方块屏幕高度几乎相等;切回透视,远处方块明显变小。 测试 3:透视模式,增大 FOV 从 50°→90°,茶壶在画布中变小;模型世界中心仍然为原点。 6. AI是否正确?我最终修正了什么认识? AI 给出的控制变量思路正确。 原先误区:以为画面转动就代表物体动了;现在明白:画面旋转有两种完全不同来源:物体 M 变换 / 相机 V 变换,必须看世界坐标数值区分,不能只靠肉眼。 ## 协作二:程序故障诊断(Task C / D,4分) 1. 真实错误现象和我起初怀疑的原因: 现象:Shift + 左键向上拖动画布,物体向屏幕下方跑;切换侧面视角,拖动方向完全混乱,不跟随屏幕平面移动。 我一开始怀疑:是旋转灵敏度`sensitivityMove`数值设置过大,或者`drag`函数没有被框架调用。 2. 向AI提出的诊断问题: 我的 OBJ 能显示,但切换透视投影后形状被拉伸 / 裁剪或者鼠标拖动方向异常。请从宽高比、裁剪面、矩阵顺序和观察基向量中提出至少三种假设,分别给一项最小测试,先帮助排查,不要直接重写完整程序。 3. AI建议的至少两个可区分原因及测试: 假设①:dy 符号错误:浏览器`pointermove`中 dy 向下为正,屏幕向上移动需要`‑dy`做符号反转;测试:打印 dx、dy 观察正负。 假设②:直接使用`lookAt`输出矩阵求逆获取相机基向量;`lookAt`内部会自动修正 up 向量,得到的 right/camUp 向量是被篡改过的,不能拿来做屏幕平移;测试:手动手写叉积计算 forward、right、camUp,不和 lookAt 结果复用对比。 假设③:矩阵乘法顺序错误;测试:暂时把 shift 移动步长调大观察变化趋势。 4. 我实际逐项测试了什么?各自结果如何? 测试假设①:console 打印 dy;鼠标向上拖动,dy 输出正值,确认 dy 向下为正;原代码没有取负,符号颠倒,**该假设成立**。 测试假设②:原来代码调用`mat4.lookAt`再求逆矩阵拿相机轴;改为手写叉积计算相机 forward/right/camUp,不再复用 lookAt 矩阵;拖动方向错乱现象大幅改善,证明该假设成立。 测试假设③:放大移动灵敏度,现象只有移动幅度变化,方向错乱依旧存在,排除矩阵顺序问题。 5. 最终根因、修复处及修复后结果: 根因两点: 1)Shift 拖动直接复用`lookAt`生成 view 矩阵求逆获取相机基向量,lookAt 内部自动修正 up,得到错误相机轴; 2)浏览器鼠标 dy 向下为正,缺少负号,上下移动颠倒。 修复:手写叉积计算`forward‑right‑camUp`相机局部坐标系;移动 Y 分量使用`‑dy`。 修复结果:普通拖动旋转模型正常;Shift + 拖动物体严格跟随屏幕平面上下左右移动;切换侧面 / 顶部视角,物体依旧跟随屏幕方向移动。 > 若首次没有故障,可以备份后临时制造一处可恢复错误,完成排查后修复。 ## 协作三:综合工作台方案比较(Task E,3分) 1. 我准备完成的观察任务: 完成 E 综合工作台,在原有模型观察基础上实现物体绕世界任意指定参考点做 Y 轴旋转,绘制标记点可视化旋转中心,区分 “绕外部点旋转” 和物体自身自转。 2. 向AI询问的两种设计方案: 我已完成 OBJ 导入、观察视角、正交 / 透视以及鼠标键盘变换。请提供两个能在 40 分钟内复用已有 WebGL2 模块的观察台拓展设计,对比功能、矩阵链、交互参数和验证难度。不引入 Three.js、光照、纹理或复杂模型编辑器。 3. 两种方案的功能、矩阵链、测试难度对比: 方案 A:外部参考点绕 Y 旋转(本次选用) 功能:设置世界旋转中心点 P,使用小立方体标记 P 点;另一个方块物体围绕 P 点进行旋转;通过 UI 滑块控制旋转角度 theta,能够直观区分绕外部点公转和物体自身自转两种效果。 矩阵链:M_orbit = T (P)・Ry (θ)・T (−P)・T (q)・S 交互参数:依靠 UI 滑块里的 s.orbit 参数控制旋转角度;旋转中心点 P 固定为世界原点;q 代表运动方块的初始偏移位置。 测试难度:低。可以直接复用框架提供的 ex.extra 接口返回绘制物体列表,不需要修改框架事件代码;只需要核对标记方块的坐标即可完成验证,调试简单。 方案 B:相机轨道环绕模式 功能:鼠标拖拽画布直接环绕 target 目标点旋转相机 eye 位置,全程不修改模型矩阵 M,实现轨道式相机观察效果。 矩阵链:根据鼠标 dx、dy 更新球坐标 φ、θ;eye = target + R (φ,θ)・(0,0,−distance) 交互参数:鼠标拖动改变俯仰角与方位角;需要在 state 中额外保存球坐标状态,每次更新相机 eye 的坐标。 测试难度:较高。需要处理万向锁问题,必须新增状态变量;还要修改 drag 鼠标事件逻辑,会和 Task‑D 原本的模型拖动逻辑产生冲突,容易互相干扰。 4. 最终采纳的方案与理由: 采纳方案 A:绕世界参考点 Y 轴旋转可视化标记。 理由: 1)可以直接复用现有`ex.extra`接口,不用修改 app.js 框架代码,不会破坏前面 Task‑D 鼠标交互逻辑; 2)符合实验文档 E 给出的示例复合变换,便于完成 “\(T(P)RyT(-P)\)与自转区别” 的验证; 3)调试难度低,时间可控,适合 40 分钟完成;方案 B 轨道相机改动大,容易破坏 D 任务已有鼠标模型拖动功能,留作 challenge 拓展。 5. 自己实现或修改的功能差异: 在 AI 给出矩阵基础上我自主修改: 固定旋转参考点 P 为世界原点; 设置黄色方块标记旋转中心 P;橙色方块作为被旋转物体; 设置合理缩放 0.35,避免标记方块过大遮挡模型; 完全使用框架内置`cubeMesh`,不新增模型文件。 6. 预测与实际结果对照,仍存在的局限: 预测:滑动 orbit 滑块,橙色方块围绕黄色方块公转,而不是绕自身中心自转。 实际结果:现象符合预期。 局限:当前只能绕 Y 轴旋转;P 写死为世界原点,没有 UI 输入框自定义 P 坐标;如果要支持任意点旋转,需要额外增加 UI 输入参数(可作为 challenge)。 ## 全局诚信声明 - 我提交的代码均已本人运行并核验;无法解释的AI输出未直接作为完成结果。 - 我明确标注了使用AI辅助的功能和本人自主完成的关键判断。