AI 协作日志
学生 Web 实验作品平台
学号:202412211401022 · 来源:ai-log.md
# 实验五AI协作与核验记录(学生填写)
学号:202412211401022 姓名:路馨 日期:2026.11.11
> 必须记录**自己的预测、原始问题、AI建议、自主判断与实际核验**。AI代码不能代替本人解释。可附完整对话链接/导出记录,避免只放聊天截图而无测试证据。
## 协作一:观察与投影概念核验(Task B / C,3 分)
2. **我的问题和事先预测(M/V/P 中谁变化?预期画面如何变化?):**
想要区分移动物体、移动相机、切换投影带来的画面效果。
预测:
① 修改 V(相机),M、P 不变:物体世界坐标不变,只是观察视角改变。
② 修改 M(模型),V、P 不变:物体在世界空间发生位移旋转。
③ 修改 P(投影),M、V 保持不变:物体世界位置完全不动。正交投影远近物体屏幕显示大小一致;透视投影会出现近大远小。
使用两个世界尺寸相同、深度不同的立方体对照,正交模式屏幕高度基本一样;透视模式近处立方体显示更大。
3. **我实际输入给 AI 的提示词:**
> 在 WebGL2 右手坐标系、列向量和 P・V・M 顺序下,我想比较移动物体与移动相机、正交与透视投影。请给我三组能区分原因的控制变量实验,指出应改变 M/V/P 中的哪项,说明可以打印哪些坐标数值进行核验,不要直接生成整套代码。
4. **AI 建议摘要(包括关键数学依据):**
裁剪坐标公式:\(\boldsymbol p_{clip}=P\cdot V\cdot M\cdot \boldsymbol p_{local}\)
- 实验 1(改变 V):锁死 M、P;修改 eye/target。核验打印模型世界坐标 \(M\cdot p_{local}\),世界坐标数值不会改变,仅 V 矩阵内容变化。
- 实验 2(改变 M):锁死 V、P;修改模型平移旋转。核验模型世界坐标跟随 M 发生改变。
- 实验 3(改变 P):锁死 M、V;切换 ortho/perspective 投影。核验模型世界坐标完全不变;对比远近同等尺寸物体屏幕输出大小。
正交投影无透视除法,没有近大远小;透视投影经过透视除法,z 深度会影响屏幕像素大小。
5. **我的判断和采纳 / 拒绝理由:**
全部采纳。控制变量是投影对照实验的核心。做正交‑透视对照必须固定 M、V,只改动 P,否则分不清是物体、相机还是投影造成画面变化。Challenge 双画布任务就采用该原则,两块画布 M/V 完全共用,只有 P 矩阵不同。
6. **我的测试参数、测试操作与结果(附截图 / 数值):**
测试参数:eye=(0,1.8,8.5),target=(0,0,0);两个立方体世界尺寸一致,一个 z=0,一个 z=-3。
操作:左画布正交投影,右画布透视投影,全程不改动 M、V。
结果:左侧正交,两个立方体屏幕高度几乎相等;右侧透视,z=0 近处立方体明显更大,z=-3 远处立方体更小。截图保存双画布对照画面。
7. **AI 是否正确?我最终修正了什么认识?**
AI 原理正确。我原先以为画面物体变大就等价于模型被放大。现在明白:**相机靠近(改 V)、FOV 变化(改 P)、模型缩放(改 M)都能让屏幕图像变大,但物体世界坐标变化完全不一样,不能只靠肉眼,要打印世界坐标区分。**
## 协作二:程序故障诊断(Task C / D,4 分)
2. **真实错误现象和我起初怀疑的原因:**
现象:尝试做 Challenge 选做题,使用自定义`data‑task="challenge"`页面直接白屏,控制台有时候看不到报错。
一开始怀疑 shader 出错、模型没有加载、矩阵计算 NaN。
3. **向 AI 提出的诊断问题:**
> 我的页面完全白屏,控制台没有红色报错。我复用课程实验框架,使用 data‑task="challenge",task‑a~e 全部正常。请从任务标识、框架初始化、JS 加载顺序给出至少三种假设,分别给出最小测试方案,不要直接重写完整代码。
4. **AI 建议的至少两个可区分原因及测试:**
假设 1:`ui.js`内部`descriptions`字典只预定义 a/b/c/d/e,不存在 challenge 键,调用`CG5UI.render()`抛出异常,初始化直接终止。
测试:把 body 改为`data‑task="e"`,看页面 UI 是否正常渲染。
假设 2:两套渲染体系冲突:同时引入`app.js`又自己 new CG.Scene 创建画布,两套渲染循环打架。
测试:删除`app.js`、`ui.js`,手写 HTML 画布,不调用`CG5Start()`,观察页面是否恢复。
假设 3:JS 脚本加载顺序错误,业务代码在依赖库完成加载前就执行。
测试:调整 script 引入顺序,公共库放最前面,业务 js 放末尾。
5. **我实际逐项测试了什么?各自结果如何?**
测试 1:修改`data‑task="e"`,页面 UI 可以正常渲染,证实缺少 challenge 条目会造成初始化崩溃。
测试 2:移除`app.js/ui.js`,手写页面、手动实例化`CG.Scene`,页面可以运行,确认两套体系不能混用。
测试 3:调整脚本顺序,但只要保留`data‑task="challenge"`依旧白屏。
6. **最终根因、修复处及修复后结果:**
根因:框架`ui.js`中`descriptions`仅包含 a‑e 五个任务 ID,自定义 challenge 任务 ID 会造成`CG5UI.render()`抛出异常,页面初始化直接中断,表现为白屏,部分环境异常被吞,控制台看不到报错。
修复方案:放弃使用`CG5Start/app.js`这套任务体系,采用**独立页面方案**,手写全部页面布局,手动实例化两个 CG.Scene 对象,复用 task‑a/b/c/d 导出的业务函数,不再调用`CG5UI.render()`。
修复结果:Challenge 正交透视双画布页面正常打开,双画布渲染,模型加载、鼠标键盘交互、投影对照全部正常。
> 若首次没有故障,可以备份后临时制造一处可恢复错误,完成排查后修复。
## 协作三:综合工作台方案比较(Task E,3 分)
2. **我准备完成的观察任务:**
完成 Challenge 选做题:**正交 / 透视双画布控制变量对照实验**。同一套 M、V 矩阵,左右两块画布仅投影矩阵 P 不同;支持内置 / 本地 OBJ 模型加载,鼠标键盘滚轮同步操作,支持导出拼接对照截图。
3. **向 AI 询问的两种设计方案:**
方案 A:沿用课程`CG5Start/app.js`框架,使用`ex.extra`钩子,单张画布用 viewport 切分成左右两半实现双视图。
方案 B:独立页面,创建两个`CG.Scene`实例,两块`<canvas>`画布,分别管理两套 WebGL 上下文;复用 taskA‑D 的函数,不调用 CG5Start。
4. **两种方案的功能、矩阵链、测试难度对比:**
表格
| 对比项 | 方案 A(单画布 + viewport 切分,框架内) | 方案 B(双 canvas 双 Scene 独立页面) |
| ---- | ------------------------------------------------- | ----------------------------------------- |
| 矩阵 | M/V 计算一份,切换 viewport,分别生成 P1、P2 | M/V 计算一份,两个场景分别传入 P1、P2 |
| 模型上传 | mesh 只需上传一次 | **必须分别 upload 给两个 WebGL 上下文** |
| UI | 复用框架自带整套控制面板 | 需要手写全部 HTML 面板控件 |
| 测试难度 | 中等;受 descriptions 任务 ID 限制,自定义 task 极易白屏 | 较高,要处理双 WebGL 上下文资源;但不受任务 ID 限制 |
| 优点 | 代码量少,复用全部框架 UI | 完全独立,不受框架任务 ID 限制;左右画布统计参数可以分开显示,对照实验直观清晰 |
| 缺点 | viewport 分割视图共用一套 UI,左右参数不方便分别展示;自定义 task 容易初始化崩溃 | 需要手写 HTML,注意不能直接共用 mesh 对象给两个 WebGL 上下文 |
5. **最终采纳的方案与理由:**
采纳**方案 B(双 canvas 独立页面)**。
理由:方案 A 受限于`ui.js`的`descriptions`字典,自定义 challenge 任务极易白屏。方案 B 独立页面,不依赖`CG5Start`。虽然要手写 HTML,但是左右画布可以分别展示投影相关统计信息,做投影对照实验现象更加直观。
6. **自己实现或修改的功能差异:**
参考参考示例代码做自主修改:
① 修改页面标题、提示文本、初始默认参数(正交高度、FOV、初始旋转角度);
② 修改两组辅助对比立方体的颜色,区分参考原版;
③ 改写部分注释,完善画面尺度对齐功能的提示文字;
④ 实现两张画布画面拼接导出一张 PNG 截图,便于写实验报告;
⑤ 增加两块画布宽高比不一致时的警告提示。
7. **预测与实际结果对照,仍存在的局限:**
预测:锁死 M/V,仅仅改变 P,就可以观察正交、透视投影的近大远小差异。
实际结果:功能符合预测。
局限:页面同时开启两个 WebGL 上下文,如果浏览器标签页长时间后台休眠,有小概率其中一块画布 WebGL 上下文丢失,出现单侧黑屏,刷新页面可以恢复。
## 全局诚信声明
- 我提交的代码均已本人运行并核验;无法解释的 AI 输出未直接作为完成结果。
- 我明确标注了使用 AI 辅助的功能和本人自主完成的关键判断。