AI 协作日志
学生 Web 实验作品平台
学号:202412211401032 · 来源:ai-log.md
# 实验四 AI协作记录
> 学号:202412211401032
> 姓名:张智豪
> AI工具与使用版本:Trae 内置 AI(GLM 模型),用于概念核验、调试思路协商与方案比较;所有代码均由本人逐行实现、运行与核验。
> 说明:以下三个协作均按"目标与预测 → 提示词 → AI建议摘要 → 我的判断 → 测试 → 结果 → 修正结论"的闭环记录。
## 协作1:变换次序核验(Task B)
### 我的目标与先验预测
目标:在相同参数 tx=2、θ=90°、s=1 下,核验 M1=T·Ry·S 与 M2=Ry·T·S 作用于局部原点 (0,0,0) 后的世界中心。
我的独立预测(列向量约定,矩阵右乘顶点,右侧矩阵先作用):
- M1·(0,0,0,1):S、R 都绕原点,原点不动,最后被 T 平移 → **(2, 0, 0)**。
- M2·(0,0,0,1):先被 T 平移到 (2,0,0),再被 Ry(90°) 旋转。右手系绕 +Y 旋转 90° 把 +X 轴转向 −Z → **(0, 0, −2)**。
- θ=0° 时 R=I,两种结果都应为 (2,0,0);θ=180° 时 M2 应为 (−2,0,0)。
### 关键提示词
> 在WebGL2的列向量约定下,局部原点为(0,0,0),平移(2,0,0),绕Y轴旋转90°。请分别分析T·R与R·T的世界中心位置和计算步骤,并建议我要打印哪些数值进行核验;不要直接重写完整程序。
### AI建议摘要
AI 确认了方向:列向量下 v' = M·v,最右矩阵先作用。T·R 的平移列是 (2,0,0) 本身;R·T 的平移列是 R·(2,0,0),而 Ry(90°)(右手系,从 +Y 往下看为逆时针)把 (2,0,0) 映到 (0,0,−2)。AI 建议核验三类数值:① 两个复合矩阵各自的第 4 列(平移列);② 局部原点经 c.point() 变换的世界坐标;③ 在 θ∈{0°, 90°, 180°} 三档下重复对比。AI 还提醒:θ=0° 时两矩阵相等是"R 为单位阵"的特例,不能作为可交换的证据。
### 我的判断与手算
按右手系 Ry(θ) 矩阵(列向量):
```
Ry(θ) = | cosθ 0 sinθ |
| 0 1 0 |
|−sinθ 0 cosθ |
```
θ=90° 时 cos=0、sin=1,故 Ry(90°)·(2,0,0)ᵀ = (0·2+0·0+1·0, 0, −1·2+0+0)ᵀ = **(0, 0, −2)ᵀ**。与我的预测一致,AI 的分析成立。
### 我实际测试的参数与坐标
| 参数 | M1=T·Ry·S 预测 | M1 实际(状态栏) | M2=Ry·T·S 预测 | M2 实际(状态栏) |
|---|---|---|---|---|
| tx=2, θ=90°, s=1(一键测试) | (2,0,0) | (2.00, 0.00, 0.00) | (0,0,−2) | (0.00, 0.00, −2.00) |
| tx=2, θ=0°, s=1 | (2,0,0) | (2.00, 0.00, 0.00) | (2,0,0) | (2.00, 0.00, 0.00) |
| tx=2, θ=180°, s=1 | (2,0,0) | (2.00, 0.00, 0.00) | (−2,0,0) | (−2.00, 0.00, 0.00) |
另验证了 s 的影响:s=1.5 时两组中心坐标均不变(缩放不移动原点),仅立方体变大。
### 运行现象/数值结果
全部实测值与手算预测一致。画面上暖色立方体(T·R·S)始终停在 +X 侧,青色立方体(R·T·S)在 θ=90° 时转到 −Z 侧,与状态栏数值互相印证。
### 修正结论
1. T 与 R 不交换的根源:R 的平移列为零、只旋转几何;T 在 R **左侧**时平移分量原样保留,T 在 R **右侧**时平移向量被 R 一起旋转(M1·0 = t,M2·0 = R·t)。
2. θ=0° 时两种结果相同只是 R=I 的特例,一个特例不能证明矩阵乘法可交换;θ=90°/180° 的反例已证明 T·R ≠ R·T。
## 协作2:程序调试(Task D)
### 错误现象与自己的初步分析
第一次实现 Task D 后拖动"机械臂俯仰"滑块出现两个异常:**探头与臂端分离**,且探头盒子随俯仰角**变歪、宽高被拉伸**。只拖"基座偏航"时大体正常。我的初步猜测是旋转轴选错了(可能该绕 Y 而不是 Z)。
### 提示词
> 我的三维对象能显示,但修改父关节角度后探头位置异常。请提出三个最有可能的矩阵顺序或局部坐标错误,每个错误给出一项能区分原因的测试,不要直接替我重写整份代码。
### AI提出的可能原因
1. **非均匀缩放进入父子链**:把臂段绘制矩阵(含 S(.38,2.2,.45))当作末端关节的父位姿传递,缩放会传播给探头造成拉伸/剪切。区分测试:pitch=0° 时探头正常,一旦改 pitch(或改臂长参数)探头形状随之改变,即命中此因。
2. **关节内旋转与平移顺序颠倒**:写成 Mbase·Rz(pitch)·T(0,h,0),肩关节会绕基座原点俯仰而不是绕肩部点。区分测试:pitch=30° 时打印肩部世界坐标,正常应恒为 (0,−0.75,0);若坐标随 pitch 漂移即命中此因。
3. **末端未继承父位姿、直接用世界坐标定位**:末端只在某个姿态下碰巧对上,动 pitch 后脱离臂端。区分测试:pitch=0° 与 pitch=45° 各打印末端关节世界坐标,与手算 Mshoulder·T(0,L,0)·(0,0,0,1) 对照。
### 我逐项完成的测试
- **测试A(对应原因1)**:把探头挂在 armDraw 上的写法下,pitch=0° 时探头位置正确;pitch=45° 时探头明显歪斜变形 → 命中原因1。
- **测试B(对应原因2)**:检查肩部代码,发现我确实写成了 `chain(basePose, R("Z", pitch), T(0,.55,0))`。pitch=30° 时状态栏肩部坐标显示 (−0.28, −0.56, 0) 而非 (0, −0.75, 0) → 命中原因2。
- **测试C(对应原因3)**:pitch=0°、yaw=0° 时末端坐标 (0, 1.45, 0) 与手算一致;修复前两个问题后,pitch=30° 时末端实测 (−1.10, 1.16, 0),与手算 (0,−0.75,0)+Rz(30°)·(0,2.2,0) = (−2.2·sin30°, −0.75+2.2·cos30°, 0) = (−1.10, 1.16, 0) 完全一致。
### 真实原因与修复
同时犯了原因1和原因2:① 肩部把 Rz 放在了 T(0,h,0) 之前,肩关节绕错了支点;② 末端挂在了含非均匀缩放的臂段绘制矩阵上。修复:
```
shoulderPose = Mbase · T(0,.55,0) · Rz(pitch) // 先升到肩高,再绕肩部局部Z轴俯仰
tipPose = Mshoulder · T(0,2.2,0) // 位姿链只含 T/R
probeDraw = tipPose · T(0,.32,0) · S(.72,.65,.72) // 非均匀缩放只留在绘制矩阵最右端
```
### AI建议是否采纳及理由
三条假设全部采纳并逐项排除测试。采纳理由:三条假设各自配了"能区分原因"的判据(形状是否变形、支点坐标是否漂移、末端坐标是否与手算一致),符合本实验"用测试点坐标验证矩阵"的方法论;最终实测坐标与手算逐位吻合,确认修复正确。
## 协作3:主题场景协商(Task E)
### 我希望实现的对象关系
保留教师示例"医学设备定位装置+旋转样本台"的骨架,但做实质性结构与行为修改:左侧为两级父子链(基座偏航→机械臂俯仰→探头),右侧样本自转、指示标记绕样本中心公转,并让公转参数真正独立可调。
### 关键提示词
> 我已实现T·R·S、绕指定点旋转和两级父子变换。请提出两个可在40分钟内用简单立方体完成的三维联动场景,并比较部件关系、矩阵链、交互参数、验证难度。请复用现有WebGL2框架,不引入相机拾取、光照或外部库,也不要直接生成整套代码。
### AI提供的两个方案与比较
- **方案一:行星—卫星系统**。恒星自转;行星挂恒星位姿做公转+自转;卫星再挂行星位姿构成三级父子。优点:关系直观、公转=绕点旋转的天然示例;缺点:行星间区分度低、坐标验证要靠心算轨道半径,且三级链超出实验要求的两级,交互参数容易退化成"同一角速度伪装跟随"。
- **方案二:改造现有定位装置+样本台**。保留两级父子链与样本自转;把标记公转矩阵改为 T(P)·Ry(orbit)·T(r,h,0),新增"公转半径 r"独立滑杆;状态栏实时打印末端与标记世界坐标。优点:复用现有控件与框架、验证难度低(坐标读数直接与手算对照)、参数独立性强;缺点:主题与教师示例同源,必须明确写出功能性差异。
### 我的选择理由
选择方案二。理由:① 评分考查矩阵关系而非建模规模,方案二的半径参数把"绕指定点旋转"从固定值升级为可操作变量,验证更直接;② 复用实验三的暂停/速度/重置逻辑,40 分钟内可完成并留出验证时间;③ 状态栏输出末端与标记坐标,满足"预期与实际对照"的要求。
### 实际矩阵链与交互参数
| 部件 | 矩阵链 | 机制 |
|---|---|---|
| 基座 | Mbase = T(−2,−1.3,0)·Ry(yaw) | 父关节(偏航) |
| 机械臂 | Marm = Mbase·T(0,.55,0)·Rz(pitch)·T(0,1.10,0)·S(.38,2.2,.45) | 父子继承 |
| 探头 | Mprobe = Mbase·T(0,.55,0)·Rz(pitch)·T(0,2.2,0)·T(0,.32,0)·S(.73,.65,.73) | 父子继承 |
| 样本 | Mspecimen = T(2,−0.48,0)·Ry(spin)·S(.7,.78,.7),spin=65°/s·elapsed | 自转 |
| 环绕标记 | Mmarker = T(2,−0.48,0)·Ry(orbit)·T(r,.28,0)·S(.22),orbit=42°/s·elapsed | 绕点公转,r 独立可调 |
独立参数:基座 yaw、肩部 pitch、样本速度倍率 speed、公转半径 r(本次新增);另有暂停/继续、重置、PNG截图。
### 两组对照测试
**状态1**:yaw=0°、pitch=0°、r=1.16、elapsed=0(公转角 0°)
- 预期:末端 = (−2, −0.75+2.2, 0) = **(−2.00, 1.45, 0.00)**;标记 = (2+1.16, −0.48+0.28, 0) = **(3.16, −0.20, 0.00)**。
- 实际(状态栏):末端 (−2.00, 1.45, 0.00);标记 (3.16, −0.20, 0.00)。一致。
**状态2**:yaw=0°、pitch=30°、r=0.80、elapsed=0(公转角 0°)
- 预期:末端 = (0,−0.75,0) + Rz(30°)·(0,2.2,0) = **(−1.10, 1.16, 0.00)**;标记 = (2+0.80, −0.20, 0) = **(2.80, −0.20, 0.00)**。
- 实际(状态栏):末端 (−1.10, 1.16, 0.00);标记 (2.80, −0.20, 0.00)。一致。
补充行为测试:调 yaw 时基座、臂、探头整体跟随而样本台不动;调 pitch 时基座静止、探头随臂端;暂停 2 秒画面保持,继续无突跳;speed=0.25× 时自转/公转明显变慢;公转半径从 1.16 改为 0.50,标记轨迹圆半径同步缩小且轨道圆心仍为样本中心 P;PNG 截图打开非空白。
### 最终结果和反思
最终采纳方案二并完成新增功能:**公转半径独立滑杆、公转与自转角速度解耦(65°/s 与 42°/s)、状态栏实时输出末端与标记世界坐标**。反思:与 AI 协商最有价值的部分不是生成代码,而是让 AI 互相比较两个方案的"验证难度"——把验证成本纳入方案取舍,正是本实验强调"画面正确≠矩阵被验证"的落地方式。