AI 协作日志

学生 Web 实验作品平台

学号:202412211401030 · 来源:ai-log.md

# 实验四 AI协作记录

> 学号:202412211401030
> 姓名:张博
> AI工具与使用版本(如适用):Trae 内置 AI(GLM 模型),仅用于概念核验、调试建议与方案协商;全部代码亲手输入、运行与验证。

## 协作1:变换次序核验(Task B)

### 我的目标与先验预测

目标:在列向量约定下,用相同参数 T(2,0,0)、Ry(θ)、S(1) 比较 M₁=T·Ry·S 与 M₂=Ry·T·S 作用在局部原点 (0,0,0) 后的世界中心。

先验预测:
- M₁:原点先被 S、R 作用(都在原点,不动),再被 T 平移,预测中心 = (2,0,0),且不随 θ 变化。
- M₂:原点先被 T 平移到 (2,0,0),再被 Ry 绕世界原点转动。θ=90° 时我一开始想当然地以为中心还在 (2,0,0)(觉得“旋转不改变到原点的距离”),后来画俯视图发现 (2,0,0) 在 XOZ 平面上距原点 2,旋转 90° 后应转到 Z 轴负方向,预测约为 (0,0,-2)。

### 关键提示词

> 在WebGL2的列向量约定下,局部原点为(0,0,0),平移(2,0,0),绕Y轴旋转90°。请分别分析T·R与R·T的世界中心位置和计算步骤,并建议我要打印哪些数值进行核验;不要直接重写完整程序。

### AI建议摘要

AI 确认:列向量下 M·v 右侧矩阵先作用。M₁·(0,0,0,1)=T·R·(0,0,0,1)=(2,0,0);M₂·(0,0,0,1)=R·T·(0,0,0,1)=R·(2,0,0,1)。并给出绕 Y 旋转的坐标公式 x′=x·cosθ+z·sinθ,z′=−x·sinθ+z·cosθ,代入得 (2cos90°,0,−2sin90°)=(0,0,−2)。AI 还建议打印三组数值核验:θ=0°、90°、180° 时两个模型矩阵第四列(平移分量),以及同一个非中心测试点(如局部 (0.5,0,0))的世界坐标。

### 我的判断与手算

AI 的公式与我推导一致,但我不接受“看起来对”,按建议手算:
- θ=0°:两式均为 (2,0,0)(特例重合)。
- θ=90°:M₁=(2,0,0);M₂=(0,0,−2)。
- θ=180°:M₁=(2,0,0);M₂=(2cos180°,0,−2sin180°)=(−2,0,0)。

### 我实际测试的参数与坐标

在 task-b.html 点击“一键设置90°测试”(tx=2、θ=90°、s=1、同时显示),再手动把角度改为 0°、180° 逐次记录状态栏两组中心坐标;另用“仅显示”模式确认颜色与中心对应关系。

### 运行现象/数值结果

| θ | T·R·S 中心(实测) | R·T·S 中心(实测) | 与手算 |
|---|---|---|---|
| 0° | (2.00, 0.00, 0.00) | (2.00, 0.00, 0.00) | 一致 |
| 90° | (2.00, 0.00, 0.00) | (0.00, 0.00, -2.00) | 一致 |
| 180° | (2.00, 0.00, 0.00) | (-2.00, 0.00, 0.00) | 一致 |

画面上:90° 时暖色立方体仍在 +X 侧、青色立方体被“甩”到 −Z 侧,黄色/青色中心标记位置与状态栏数值吻合。

### 修正结论

1. T·R ≠ R·T:R 绕的是“世界原点”,先 T 后 R 会把平移出的偏移 (2,0,0) 绕原点转到 (0,0,−2);先 R 后 T 时 R 作用在未平移的原点 (0,0,0) 上不动,再被 T 送回 (2,0,0)。
2. θ=0°(或 tx=0、θ=180° 时中心对称)等重合只是特例,不能据此证明矩阵乘法可交换——判断非交换性必须至少取一个旋转角非 0°/180° 的状态。
3. AI 的数学分析与实测完全一致;我补测的 180° 情形((2,0,0) 与 (−2,0,0) 关于原点对称)进一步佐证。

## 协作2:程序调试(Task C或D)

### 错误现象与自己的初步分析

现象(Task D 起始模板遗留写法):页面能显示三个部件,但拖动基座 yaw 滑块时基座和机械臂转了,末端探头却“留在原地”,pitch 变化时探头也不跟随;yaw=30°、pitch=−25° 时探头悬空,与臂端明显脱节。

初步分析:末端 tipPose 当时直接写成世界坐标 `c.T(0, 2.2, 0)`,怀疑它没有继承肩部位姿;但不确定肩部一级是否也有问题,于是先问 AI 而不是乱改。

### 提示词

> 我的三维对象能显示,但修改父关节角度后探头位置异常。请提出三个最有可能的矩阵顺序或局部坐标错误,每个错误给出一项能区分原因的测试,不要直接替我重写整份代码。

### AI提出的可能原因

1. 末端位姿未继承父级:tipPose 用了世界坐标平移 T(0,2.2,0),而不是 Mshoulder·T(0,2.2,0)。测试:打印 yaw=90°、pitch=0° 时末端世界坐标,若恒为 (0,2.2,0) 不随 yaw 变化即为此原因。
2. 肩部位姿未继承基座(或把绘制矩阵当位姿传递):shoulderPose 若不包含 basePose,整个臂系不随 yaw 动。测试:固定 pitch,把 yaw 从 0° 改到 90°,观察肩部世界坐标是否变化、臂是否跟着基座转。
3. 非均匀缩放混入位姿传递:若把臂段的 S(.38,2.2,.45) 并入传给末端的矩阵,探头会被拉长且位置错误。测试:故意让探头继承臂段缩放矩阵,打印探头中心坐标与正确值对比,并观察探头形状。

### 我逐项完成的测试

- 测试1:修复前打印末端坐标——yaw=0°/90°、pitch 任意时恒为 (0.00, 2.20, 0.00),与原因1的“指纹”完全吻合。
- 测试2:检查 shoulderPose 已写成 basePose·T(0,.55,0)·Rz(pitch) 后,固定 pitch=0° 改 yaw:肩部世界坐标始终 (0,−0.75,0)(在基座竖直轴上,绕轴旋转坐标不变属正常),臂与探头整体随基座转动——继承链正确。
- 测试3:故意制造原因3:tipPose 后错误地接上臂段缩放再画探头,测得探头中心 (1.87, 3.88, −1.08),而正确写法为 (0.92, 1.53, −0.53);同时探头外形被纵向拉长 2.2 倍。确认后已恢复,非均匀缩放只保留在 armDraw/probeDraw 自身绘制矩阵末端。

### 真实原因与修复

真实原因:tipPose 用世界坐标 T(0,2.2,0) 直接定位,丢失了父位姿(Mbase 的平移与 yaw、Mshoulder 的俯仰)。修复为:

```javascript
const shoulderPose = c.chain(basePose, c.T(0, .55, 0), c.R("Z", pitch));
const tipPose      = c.chain(shoulderPose, c.T(0, 2.2, 0));
```

修复后核验:yaw=90°、pitch=0° 时末端 (0.00, 1.45, 0.00);yaw=30°、pitch=−25° 时末端 (0.81, 1.24, −0.46),与手算 (Rz(−25°) 作用 (0,2.2,0) 后再加肩部偏移、再经 Ry(30°) 旋转、最后加基座平移) 完全一致;探头始终连接臂端。

### AI建议是否采纳及理由

采纳原因1和原因3的测试思路,原因2用作回归检查。未让 AI 代写代码,只按其建议的“区分性测试”逐项定位;收获是把“打印一个测试点的世界坐标”作为验证父子链的通用手段,比看画面更可靠。

## 协作3:主题场景协商(Task E)

### 我希望实现的对象关系

希望保留教师示例的“定位装置+旋转台”骨架并做实质性功能改造:左侧基座—机械臂—探头保持父子层次;右侧样本自转+标记公转,且公转要有可验证的新行为,而不是换个颜色的复制品。

### 关键提示词

> 我已实现T·R·S、绕指定点旋转和两级父子变换。请提出两个可在40分钟内用简单立方体完成的三维联动场景,并比较部件关系、矩阵链、交互参数、验证难度。请复用现有WebGL2框架,不引入相机拾取、光照或外部库,也不要直接生成整套代码。

### AI提供的两个方案与比较

- 方案一“行星—卫星系统”:行星自转(T·R·S)、卫星作为行星子对象公转(Mplanet·T(轨道半径,0,0)·R)、卫星自带小月亮再绕卫星转。优点:机制典型、和 Task C 呼应好;缺点:三个以上天体都在 Y 轴平面内转,画面区分度低,且“父子继承”与“绕点公转”容易混在一起,向助教演示“父动子动、子动父不动”时不如机械臂直观。
- 方案二“医学定位装置(改造版)”:保留父子机械臂,右侧样本台+自转样本+公转标记;在此基础上新增两个可验证行为——探头随俯仰角进给伸缩、公转标记反向且高度按正弦起伏(空间螺旋轨迹)。优点:两种机制界限清晰、验收情境与指导书逐条对应、验证点能手算;缺点:需要自己设计两个新行为的矩阵位置。

### 我的选择理由

选方案二。一是父子关系的“带动/不带动”在机械臂上最容易被眼睛和坐标同时验证;二是两个新增行为各自只增加一个矩阵因子,链条短、好手算;三是与 Task D 的代码结构衔接,能把 D4“缩放局部性”的结论直接复用。

### 实际矩阵链与交互参数

- 基座:Mbase = T(−2,−1.3,0) · Ry(yaw)
- 肩部:Mshoulder = Mbase · T(0,.55,0) · Rz(pitch)
- 末端:Mtip = Mshoulder · T(0,2.2,0)
- 探头(自主修改①进给):Mprobe = Mtip · T(0,probeLen/2,0) · S(.73, probeLen, .73),probeLen = .45+(pitch+60)/120×.4
- 样本自转:Mspec = T(pivot) · Ry(65·t) · S(.7,.78,.7),pivot=(2,−0.805,0)(样本底面恰落在转台面 y=−1.195 上)
- 标记公转(自主修改②反向+起伏):Mmark = T(pivot) · Ry(−42·t) · T(1.16, bobH, 0) · S(.22),bobH = .28+.22·|sin(42t·π/180)|

交互参数:yaw、pitch、speed 三个独立参数;暂停/继续(暂停期间 elapsed 不累加,继续无突跳)、重置、PNG 截图。

### 两组对照测试

状态①(默认 yaw=25°、pitch=−20°、speed=1×):预测末端 (−1.32, 1.32, −0.32)、探头长 0.583、探头中心 (−1.23, 1.59, −0.36);标记 orbit=0° 时 (3.16, −0.52, 0)。实测状态栏/画面全部一致。

状态②(yaw=0°、pitch=+60°、speed=1×):预测末端 (−3.91, 0.35, 0.00)、探头伸长到 0.850、探头中心 (−4.27, 0.56, 0.00);标记转过 90° 后应在 (2.00, −0.31, 1.16)(半径 1.16、高度抬升 0.22)。实测一致,且对比状态①可见探头随俯仰进给、基座静止时探头只随臂动。

补充回归:暂停 2 秒画面完全静止,继续后无突跳;speed=0 时样本与标记冻结;样本自转中心恒为 (2, −0.81, 0) 不随 t 改变(自转≠公转轨迹);保存的 PNG 打开非空白、尺寸与 Canvas 一致。

### 最终结果和反思

最终场景满足全部验收条件:6 个可区分部件、1 条父子链(基座→肩部→探头)、3 种复合机制(父子关节、自转、反向螺旋公转)、3 个独立参数。与教师示例相比的功能性差异:①探头随 pitch 进给伸缩(把独立参数耦合到末端局部缩放,且不污染关节位姿);②公转反向并叠加正弦高度,标记轨迹由平面圆变为空间螺旋;③样本中心下移贴合转台面,消除悬空。反思:矩阵关系验证必须靠“手算一个点 → 与程序输出对照”,画面相似不等于机制正确;暂停用“冻结时间增量”而不是停掉循环,才不会有恢复突跳。