AI 协作日志
学生 Web 实验作品平台
学号:202412211401021 · 来源:ai-log.md
# 实验四 AI协作记录
> 学号:202412211401021
> 姓名:徐艳
> AI工具与使用版本(如适用):豆包 · 计算机图形学实验辅助(WebGL2 / gl-matrix 3.3.0)
> 协作过程为真实实验记录:先独立预测,再核验 AI 数学分析与实际画面,所有关键坐标均通过 c.point() 数值验证。
## 协作1:变换次序核验(Task B)
### 我的目标与先验预测
目标:用控制变量(仅交换 T 与 Ry 的相乘次序)比较 T·Ry·S 与 Ry·T·S,验证矩阵乘法的非交换性。
先验预测:列向量约定下 M1 = T·Ry·S 应先缩放、再旋转、最后平移,局部原点(0,0,0)不受 S、Ry 影响,故中心应等于平移量(2,0,0);而 M2 = Ry·T·S 中 T 先作用把原点移到(2,0,0),再被 Ry 旋转,所以中心大约在(0,0,-2)。
### 关键提示词
> 在WebGL2的列向量约定下,局部原点为(0,0,0),平移(2,0,0),绕Y轴旋转90°。请分别分析T·R与R·T的世界中心位置和计算步骤,并建议我要打印哪些数值进行核验;不要直接重写完整程序。
### AI建议摘要
AI 说明 chain(A,B,C) = A×B×C、右侧矩阵先作用:M1 中心 = T(2,0,0) 作用原点 = (2,0,0);M2 中心 = Ry(90°)·(2,0,0),绕Y旋转把 +X 轴转到 −Z 轴,故为 (0,0,−2)。建议打印 c.point(model,0,0,0) 和模型矩阵的平移列,并固定 tx=2、θ=90、s=1 作为单一可复现测试。
### 我的判断与手算
认同 AI 的推导。手算 Ry(90°)·(2,0,0):绕Y旋转时 x' = x·cosθ + z·sinθ = 0,z' = −x·sinθ + z·cosθ = −2,y 不变,得 (0,0,−2)。确认只要打印局部原点即可验证中心。
### 我实际测试的参数与坐标
tx=2、θ=90°、s=1;分别打印 T·Ry·S 与 Ry·T·S 两个模型矩阵作用(0,0,0)后的世界坐标。
### 运行现象/数值结果
```
T·R·S 中心:(2.000, 0.000, 0.000)
R·T·S 中心:(0.000, 0.000, -2.000)
```
与预测完全一致,画面中暖色立方体在 +X 方向、青色立方体在 −Z 方向。
### 修正结论
两种次序结果不同,证明 T 与 R 不可交换:T·R 中平移保持世界方向,R·T 中平移向量被旋转,因此同一平移在不同顺序下指向不同世界方向。θ=0° 时 Ry=I,两种结果恰好相同,但只是一个特例,不能据此证明矩阵乘法可交换(交换性需要所有矩阵、所有参数都满足 A·B=B·A)。
## 协作2:程序调试(Task C或D)
### 错误现象与自己的初步分析
Task D 中,我只拖动基座角度(yaw),机械臂与探头本应整体跟随,但画面里臂和探头仍停在初始位置,只有基座在转。初步怀疑:肩部位姿 shoulderPose 漏掉了对父位姿 basePose 的继承,而是直接用了世界坐标 T(0,.55,0)。
### 提示词
> 我的三维对象能显示,但修改父关节角度后探头位置异常。请提出三个最有可能的矩阵顺序或局部坐标错误,每个错误给出一项能区分原因的测试,不要直接替我重写整份代码。
### AI提出的可能原因
1. 肩部位姿未左乘父位姿 basePose,直接以世界坐标定位,导致子对象不随父运动;
2. 把臂段绘制用的非均匀缩放 S(.38,2.2,.45) 错误地乘进位姿矩阵,污染了下一层关节坐标;
3. 关节旋转轴用错(该用局部 Rz(pitch) 却用了 Ry),或绕点旋转时 T(P)/T(-P) 次序颠倒。
### 我逐项完成的测试
- 测试1(区分原因1):固定 pitch,打印 shoulderPoint 在 yaw=0 与 yaw=90 时的世界坐标。若 yaw 改变而肩部坐标完全不变 → 未继承父位姿。
- 测试2(区分原因2):检查传给 probeDraw 的矩阵是否经过 S(.38,2.2,.45),对比肩关节与末端的缩放分量。
- 测试3(区分原因3):单独改 pitch,观察臂是否绕局部 Z 摆动、基座是否静止。
### 真实原因与修复
测试1 证实了原因1:yaw=0 与 yaw=90 时 shoulderPoint 均为 (0,−0.75,0),说明 shoulderPose 没有乘上 basePose。修复为:
```
shoulderPose = chain(basePose, T(0,.55,0), R("Z", pitch)); // 先继承父,再局部平移+俯仰
```
同时确认 tipPose 必须继承 shoulderPose 而非世界原点:tipPose = chain(shoulderPose, T(0,2.2,0))。修复后再次测试:改 yaw 时肩/末端绕基座轴整体转动(父带子),改 pitch 时基座不动而臂/探头随局部 Z 摆动,符合验收。
### AI建议是否采纳及理由
采纳。三项建议中原因1 是主因,原因2/3 通过测试2、3 被排除(探测与臂的缩放确实只出现在绘制矩阵,pitch 轴也正确)。按实验要求,即使第一次可能写对,也主动制造了“肩部位姿漏乘父位姿”这一处可恢复错误来完成完整调试闭环,最终已修复。
## 协作3:主题场景协商(Task E)
### 我希望实现的对象关系
保留教师示例主题“医学设备定位装置+旋转样本台”,但做实质性结构改动:左侧基座→机械臂→末端探头沿用两级父子关节,并给肩部真实局部 Z 俯仰;右侧把“样本台整体旋转”拆成“样本绕自身中心自转”与“指示标记绕样本中心公转”两种不同矩阵机制,二者角速度不同;整合速度、暂停/继续、重置、PNG 截图。
### 关键提示词
> 我已实现T·R·S、绕指定点旋转和两级父子变换。请提出两个可在40分钟内用简单立方体完成的三维联动场景,并比较部件关系、矩阵链、交互参数、验证难度。请复用现有WebGL2框架,不引入相机拾取、光照或外部库,也不要直接生成整套代码。
### AI提供的两个方案与比较
- 方案一:行星—卫星系统。恒星自转,行星沿椭圆轨道公转+自转,卫星再绕行星公转(两层父子+两层公转)。优点:矩阵语义清晰、天然体现“绕点旋转”;缺点:需要两层轨道参数,轨道半径调试较繁琐。
- 方案二:自动化操作台+旋转样本台(医学主题)。平移/旋转基座→关节臂→末端工具,右侧样本自转+标记公转。优点:可直接复用 Task D 的父子链,改动量小、验证点明确;缺点:部件区分度需靠颜色与位置保证。
### 我的选择理由
选择方案二(医学设备主题)。它复用 Task D 已验证的父子链,把左侧关节与右侧“自转+公转”两套独立机制并列,同时满足“至少3部件、1组父子、2种复合机制、2个独立参数”,验证与截图成本低、容错高。相比方案一,轨道参数更少,40分钟内更可控。
### 实际矩阵链与交互参数
```
基座位姿 basePose = T(-2,-1.3,0) · Ry(yaw)
肩部位姿 shoulderPose = basePose · T(0,.55,0) · Rz(pitch)
末端关节 tipPose = shoulderPose · T(0,2.2,0)
臂段绘制 armDraw = shoulderPose · T(0,1.10,0) · S(.38,2.2,.45)
探头绘制 probeDraw = tipPose · T(0,.32,0) · S(.73,.65,.73)
样本自转 specimenDraw = T(P)·Ry(spinAngle)·S(.7,.78,.7) // spinAngle=elapsed*65
标记公转 orbitMarker = T(P)·Ry(orbitAngle)·T(1.16,.28,0)·S(.22) // orbitAngle=elapsed*42
```
独立交互参数:基座角度 yaw、肩部俯仰 pitch、样本旋转速度 speed(0~3×)。
### 两组对照测试
- 测试1(父子关系):固定 pitch=−20° 只改 yaw:末端坐标随基座整体绕 Y 转动(父带子);固定 yaw=25° 只改 pitch:基座坐标不变、末端随臂绕局部 Z 摆动(子不改变父)。数值核验:yaw25/pitch−20 时末端 ≈ (−1.318, 1.317, −0.318)。
- 测试2(自转 vs 公转):样本自转 θ=0° 与 θ=90° 时中心恒为 P=(2,−0.48,0)(只转不动);标记公转 θ=0° 为 (3.16,−0.2,0)、θ=90° 为 (2,−0.2,−1.16)(沿轨道移动)。两者轨迹不同,证明自转与公转是不同矩阵机制。暂停2秒画面保持、继续无突跳;改 speed 可观察自转/公转速率同步变化;保存 PNG 非空且与画布尺寸一致。
### 最终结果和反思
采用方案二后,场景包含三种复合变换机制(父子关节、样本自转、标记公转),满足 Task E 全部 6 条验收条件。反思:自转与公转表面看都是“绕 Y 旋转”,但只有公转多了“旋转后再平移半径”的一步,才产生轨道运动;如果只让两个部件共享相同角速度而不用独立矩阵链,就无法体现真实的“跟随”,这正是本实验强调“不能仅靠同速伪装跟随”的原因。