AI 协作日志
学生 Web 实验作品平台
学号:202412211401028 · 来源:ai-log.md
# 实验五AI协作与核验记录(学生填写) 学号:202412211401028 姓名: 日期:2026-11-09 > 必做A—E已全部实现并运行核验;关键截图保存在`evidence/`,数值记录见文末附录。使用AI辅助完成概念核对、故障排查和方案比较,最终代码、参数选择和结论由本人复核。 ## 协作一:观察与投影概念核验(Task B / C,3分) 1. **我的问题和事先预测(M/V/P中谁变化?预期画面如何变化?)** - 预测1:只改eye/target(移动相机)时,改变的是`V`;模型世界坐标与状态栏“模型世界中心”不应变化,画面只是观察方向改变。 - 预测2:保持M、V不变只切换ortho/perspective时,改变的是`P`;正交投影下两个等尺寸不同深度的立方体表观尺寸基本相同,透视投影下近处立方体更大。 - 预测3:增大FOV只改变透视`P`,模型世界尺寸不变,但画面中物体占比变小;它不等价于Model缩小。 2. **我实际输入给AI的提示词:** > 在WebGL2右手坐标系、列向量和P·V·M的顺序下,我想比较移动物体与移动相机、正交与透视投影。请给我三组能区分原因的控制变量实验,指出应改变M/V/P中的哪项,说明可以打印哪些坐标数值进行核验,不要直接生成整套代码。 3. **AI建议摘要(包括关键数学依据):** - 实验一:固定`M`、`P`,只改`eye/target`(V);打印`P·V·M·N·c_local`以及世界中心,验证世界坐标不随V改变。 - 实验二:固定`M`、`V`,只切换`P`;在世界中放两个同尺寸、不同深度的立方体,比较屏幕表观尺寸。 - 实验三:固定`M`、`V`,只改FOV;打印P矩阵的`m11=1/tan(fov/2)`,说明FOV改变的是投影锥,不是世界缩放。 - AI还提醒:`mat4.lookAt(out, eye, target, up)`返回的是世界→相机的V;列向量下顶点按`P·V·M·N`从右往左作用。 4. **我的判断和采纳/拒绝理由:** - 采纳“控制变量+打印矩阵/世界中心”的建议,因为它可以把“看起来相似”拆成可核对的状态证据。 - 拒绝“通过修改Model来模拟相机移动”的做法:那会把世界中心一起移走,属于M变化而非V变化,不能用于验证观察变换。 - 人工补充:判断画面变化前先读状态栏中的相机、投影和Model参数,避免只凭肉眼。 5. **我的测试参数、测试操作与结果(附截图/数值):** - Task B:`eye=(0,0,8)→(8,0,0)→(0,8,0)→(6,4,7)`切换四个预设,状态栏“模型世界中心”始终为`(0.00,0.00,0.00)`;`V·eye=(0,0,0)`,`V·target=(0,0,-8)`;顶部视角把世界`-Z`映射为屏幕`+Y`。截图:`evidence/task-b-iso.jpg`。 - Task C:同一M/V下切换投影,`eye (0.00,1.80,8.50)→target (0.00,0.00,0.00)`、世界中心均不变;透视下左侧近立方体明显大于右侧远立方体,正交下两者表观尺寸相同。截图:`evidence/task-c-perspective.jpg`、`evidence/task-c-ortho.jpg`。 - 数值:在`aspect=2`的独立计算中,透视投影`x=0.5,z=-2`的NDC x为`0.268`,`z=-6`为`0.089`;正交投影两者均为`0.091`。 6. **AI是否正确?我最终修正了什么认识?** - AI的三组控制变量建议与实测一致。修正点:FOV变大时物体在画面中变小,不是因为“物体被缩小”,而是`P`的投影锥变大、同样的世界高度占据更少NDC范围;正交投影没有透视除法,因此深度不改变表观尺寸。 ## 协作二:程序故障诊断(Task C / D,4分) 1. **真实错误现象和我起初怀疑的原因:** - 在实现顶部视角时,若沿用普通`up=(0,1,0)`,观察方向`eye-target=(0,8,0)`与up平行。此时`lookAt`内部`up×viewDir`叉积为零,得到退化矩阵,画面模型消失/视图异常。起初怀疑是模型归一化或裁剪面把模型裁掉了。 2. **向AI提出的诊断问题:** > 我的OBJ能显示,但切换透视投影后形状被拉伸/裁剪或者鼠标拖动方向异常。请从宽高比、裁剪面、矩阵顺序和观察基向量中提出至少三种假设,分别给一项最小测试,先帮助排查,不要直接重写完整程序。 3. **AI建议的至少两个可区分原因及测试:** - 假设A:宽高比错误导致拉伸。最小测试:打印`aspect`与Canvas实际`width/height`,二者应一致(本页为`1.60`,状态栏显示`aspect 1.60`)。 - 假设B:near/far或相机方向错误导致裁剪。最小测试:只把`near`设为0或让`far<near`,观察是否出现可读错误提示而不是画面悄悄消失。 - 假设C:矩阵顺序错误。最小测试:固定M、V,仅切换P,检查世界中心与相机参数不变。 - 假设D:观察基向量退化。最小测试:顶部视角分别用`up=(0,1,0)`与`up=(0,0,-1)`构造V,打印矩阵并检查是否有零列。 4. **我实际逐项测试了什么?各自结果如何?** - 宽高比:Canvas宽高比与状态栏`aspect`均为1.60,排除A。 - 裁剪面:把`near=0`后应用给出“参数错误:near必须大于0(当前near=0)”,恢复`near=0.1`后提示“参数已恢复有效范围”,排除静默裁剪。 - 矩阵顺序:仅切换ortho/perspective,M、V参数与世界中心均未变化,P切换有效,排除C。 - 基向量:用`up=(0,1,0)`算顶部V得到`[0,0,0,0, 0,0,1,0, 0,0,0,0, 0,0,-8,1]`,前两列退化;改用`up=(0,0,-1)`后矩阵有效,顶部视角正常,世界`-Z`映射为屏幕`+Y`。 5. **最终根因、修复处及修复后结果:** - 根因:顶部视角的`up`与观察方向共线,`lookAt`叉积退化。 - 修复:`js/task-b.js`的`ex.view`中,当观察方向的水平分量为0时改用`(0,0,-1)`(向下看)或`(0,0,1)`(向上看);同时在eye与target重合时抛出可读错误。 - 修复后:顶部/底部视角无黑屏、无NaN,四预设与参数面板联动正常。 ## 协作三:综合工作台方案比较(Task E,3分) 1. **我准备完成的观察任务:** - 以茶壶为对象,在模型中放一个固定参考点P,让橙色标记绕P运动,并用它解释`T(P)·R·T(-P)`与模型自转的区别;同时希望验证父子复合变换。 2. **向AI询问的两种设计方案:** > 我已完成OBJ导入、观察视角、正交/透视以及鼠标键盘变换。请提供两个能在40分钟内复用已有WebGL2模块的观察台拓展设计,对比功能、矩阵链、交互参数和验证难度。不引入Three.js、光照、纹理或复杂模型编辑器。 3. **两种方案的功能、矩阵链、测试难度对比:** - 方案1:固定参考点P + 单个绕点标记。矩阵链`M_marker=T(P)·Ry(θ)·T(-P)·T(q)·S`;交互只需`orbit`一个参数;验证简单(比较θ=0与90°时标记中心)。 - 方案2:可调参考点P + 绕点标记 + 子部件(父子继承)。在方案1的父链上再加`T(q)·Ry(2θ)·T(0.30,0,0)·S`;需要P的X/Y/Z和轨道半径参数;验证要求同时检查绕点轨迹、子块与父块的距离以及参数改变后的联动。 4. **最终采纳的方案与理由:** - 采纳方案2,并在`ui.js`/`app.js`增加“参考点P X/Y/Z、轨道半径”输入(同时保持A—D页面不受影响)。理由:它同时覆盖“绕指定点旋转”和“父子继承”两种复合机制,比只放一个固定标记更能说明矩阵链的层级关系,且复用现有`CG5.T/R/S/chain/point`即可完成,验证量在可接受范围。 - 讨论由AI提供,但“采用方案2、增加P坐标输入、把子块设为父级的子节点”这一最终决定由本人作出。 5. **自己实现或修改的功能差异:** - 新增固定参考点P与轨道半径的界面输入(`px/py/pz/pr`),使绕点中心可调,而不仅是固定位置。 - 新增青色子部件:它继承橙色父块的绕点运动,同时以`2θ`相对自转并绕父块中心`0.30`偏移运动,体现父子矩阵相乘。 - 黄色小块显示P本身,橙色小块显示绕点结果,形成可对照的三级视觉标记。 6. **预测与实际结果对照,仍存在的局限:** - 预测θ=0时橙色块位于`q=P+(r,0,0)`;实测`P=(0.9,0.9,0)`、`r=0.55`时橙色中心为`(1.45,0.90,0)`,与预测一致。 - 预测θ=90°时橙色块绕P转到`(0.9,0.9,-0.55)`;实测一致,且青色子块与橙色父块中心距离恒为`0.30`。 - 局限:辅助标记是教学立方体,不是真实模型部件;未做光照、纹理和复杂OBJ解析;轨道只在Y轴平面内旋转。 ## 全局诚信声明 - 我提交的代码均已本人运行并核验;无法解释的AI输出未直接作为完成结果。 - 我明确标注了使用AI辅助的功能和本人自主完成的关键判断。 ## 附录:数值与行为验证记录 测试环境:Chromium内核浏览器(WebGL2可用),通过`index.html`进入五个任务页;页面Canvas宽高比实测`aspect=1.60`。 | 任务 | 操作/参数 | 实测结果 | |---|---|---| | A 归一化 | 理论测试模型`min=(-2,-1,-1), max=(4,3,1)` | `c=(1,1,0)`、`L=6`、缩放`1/3`;`N·c=(0,0,0)`;变换后x跨度=2 | | A 导入 | 内置茶壶/球体/兔子、本地`models/sphere.obj` | 茶壶858顶点/1512面,最长边3.560,缩放0.562;兔子1580/2728,最长边2.660,缩放0.752;球体551/1008,最长边2.000;世界中心均为`(0,0,0)` | | A 异常 | 选择内容为`garbage`的`.obj` | 提示“模型读取失败:OBJ 缺少 v 顶点或 f 面”,原模型保留,页面继续运行 | | B View | 正面/侧面/顶部/斜上方 | eye依次`(0,0,8)/(8,0,0)/(0,8,0)/(6,4,7)`;世界中心始终`(0.00,0.00,0.00)`;`V·eye=(0,0,0)`、`V·target=(0,0,-8)` | | B up处理 | 顶部视角`up=(0,0,-1)` | V矩阵有效;世界`-Z`方向映射为屏幕`+Y`;普通`up=(0,1,0)`会得到退化矩阵(见协作二) | | C 投影 | 同一M/V切换ortho/perspective | 相机与世界中心不变;投影栏正确显示“正交/透视”;`aspect=1.60` | | C 裁剪 | `near=0`、`far<near`、`orthoH=0`、`fov=180` | 均给出中文错误提示;恢复合法值后自动解除报警 | | C 对照 | `aspect=2`数值测试:x=0.5,z=-2与-6 | 透视NDC x=`0.268` vs `0.089`(近大远小);正交均=`0.091`(表观相同) | | D 旋转 | 左键拖动dx=10,dy=20像素 | `ry=4.5°`、`rx=9°`,tx/ty/tz与eye不变 | | D 平移 | Shift+左拖dx=10像素(正面观察) | `tx≈+0.125`,方向为屏幕右;垂直向下拖动使`ty`减小 | | D 滚轮 | 滚轮向下`deltaY=100` | 相机距离`8.688→9.602`,`scale`保持`1.00` | | D 键盘 | `D`、`+`、`Q` | `tx:0→0.12`、`scale:1→1.08`、`ry:0→-5°`;eye不变 | | D 重置 | 点击“重置参数” | tx/ty/tz=0、rx/ry=0、scale=1、eye=`(0,1.8,8.5)`,恢复默认 | | E 绕点 | `P=(0.9,0.9,0)`、`r=0.55`、θ=0/90° | θ=0时橙色中心`(1.45,0.9,0)`;θ=90°时`(0.9,0.9,-0.55)`,符合绕P旋转 | | E 父子 | θ=90°,子块相对父块偏移0.30 | 父子中心距离恒为`0.30`,子块随父级绕点并自转 | | E 可调P | `P=(0,0,0)`、`r=1` | 标记中心到P距离=1,说明P与半径输入生效 | | 截图 | “保存PNG截图”/Canvas采样 | Canvas为658×411,非背景像素约15682,中心像素`[81,126,146]`;`toDataURL`长度37034,PNG非空白 | 证据截图:`evidence/task-a.jpg`、`evidence/task-b-iso.jpg`、`evidence/task-c-perspective.jpg`、`evidence/task-c-ortho.jpg`、`evidence/task-d.jpg`、`evidence/task-e.jpg`。