AI 协作日志

学生 Web 实验作品平台

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

# 实验四 AI 辅助对话记录

学号:202412211402003  
姓名:戴金诚  
班级:计算机科学与技术2班  
辅助工具:OpenAI Codex  

下面根据这次实现和测试过程整理。AI 主要用于核对矩阵推导、设计排错实验和比较场景方案;最终采用的矩阵都另外用数值和浏览器画面验证。

## 协作一:Task B 变换次序核验

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

我想比较 `T·Ry·S` 和 `Ry·T·S`。局部原点是 `(0,0,0)`,取 `tx=2、theta=90°、s=1`。我先预测第一种中心是 `(2,0,0)`;第二种平移向量还会被旋转,所以中心是 `(0,0,-2)`。

### 对话整理

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

**AI:** 右侧矩阵先作用。`T·R` 中原点先旋转仍为原点,再平移到 `(2,0,0)`;`R·T` 中先平移到 `(2,0,0)`,再绕 Y 轴旋转到 `(0,0,-2)`。建议同时输出两张 Model 矩阵、两次局部原点变换结果,以及独立公式 `(tx·cosθ,0,-tx·sinθ)`。

**我:** 如果角度设为 0°,两个中心相同,能不能说明 T 和 R 可交换?

**AI:** 不能。0° 时 R 是单位矩阵,只是一个特殊参数。再测 90°、180°,才能看到一般情况下次序会影响结果。

### 我的判断、测试与结论

我没有只根据画面位置判断,而是在状态栏同时显示矩阵实算和三角函数预测。实际结果:

| theta | T·R·S 中心 | R·T·S 中心 |
|---:|---|---|
| 0° | `(2,0,0)` | `(2,0,0)` |
| 90° | `(2,0,0)` | `(0,0,-2)` |
| 180° | `(2,0,0)` | `(-2,0,0)` |

90° 页面实测最大误差约 `5.3e-24`。结论是平移和旋转一般不可交换;在 `R·T` 中,平移方向属于随后被旋转的局部结果。

## 协作二:Task C 绕点旋转调试

### 错误现象与初步分析

为了做可区分的排错实验,我在隔离测试中故意把绕点链里的 `T(P)` 和 `T(-P)` 调换。测试参数为 `P=(1,0,1)、q=(2,0,0)、theta=90°`。我的初步判断是正负平移或相乘顺序写错,因为物体能转,但轨道中心不对。

### 对话整理

**我:** 对象能显示,但 P 不在原点时轨道中心明显错误。请给出三个最可能的矩阵或坐标错误,每个给一个区分测试,不要重写代码。

**AI:** 第一,检查链是否完整为 `T(P)·R·T(-P)·T(q)·S`,可把 `P=(1,0,1)`、角度设为 90°并手算中心;第二,检查 `P` 与 `q` 是否都使用世界坐标,可用 0° 验证结果必须仍是 q;第三,检查角度是否误把度直接传给弧度接口,可用 90° 和 360°两个关键角测试。

**我:** 我怎样快速判断是 `T(P)` 和 `T(-P)` 颠倒造成的?

**AI:** 用非原点 P。正确链先把 P 移到原点再旋转,最后移回;若正负平移颠倒,误差会随 P 成倍显现。记录同一参数下的正确、错误中心最容易区分。

### 逐项测试、真实原因与修复

- 正确链在 `P=(1,0,1)、90°` 时中心约为 `(0,0,0)`。
- 故意颠倒后得到 `(0,0,-4)`,因此确认是参考点平移方向错误。
- 恢复正确链后,0° 时中心为 `(2,0,0)`,90° 为 `(0,0,0)`,360° 回到 `(2,0,0)`。
- 暂停 40 个模拟帧中心不变;恢复后只增加当前帧的 `speed×dt`,没有补算暂停时间。

我采纳了“用非原点 P 放大差异”的建议。最终交付代码已恢复正确顺序,页面增加 0°/90°/180°/360°按钮和预测误差,便于复查。

## 协作三:Task E 场景方案协商

### 我的目标

我希望保留简单立方体和固定相机,在已有知识范围内做一个有明显功能差异的场景,同时包含父子关节、自转、公转、两个以上独立参数和暂停控制。

### 对话整理

**我:** 已实现 `T·R·S`、绕指定点旋转和两级父子变换。请提出两个 40 分钟内可用简单立方体完成的三维联动场景,比较部件关系、矩阵链、交互参数和验证难度;不要引入光照、拾取或外部库。

**AI:** 方案一是行星—卫星系统:恒星、行星和卫星组成公转层级,参数是两级轨道角和速度,优点是矩阵直观,缺点是和 Task C 的公转重复较多。方案二是双关节自动检测台:基座、肩关节、肘关节、前臂、伸缩探头组成层次链,旁边样本自转并带环绕标记;参数包括 yaw、肩角、肘角、伸缩量和速度,验证重点是末端世界坐标和暂停状态。

**我:** 哪个方案更容易证明不是只改颜色或数量?

**AI:** 双关节检测台更明显,因为新增肘关节和伸缩自由度会改变矩阵层级;只要展示 `M_elbow` 和 `M_probe` 的父子链,并给两组末端坐标,就能说明是行为变化。

### 选择、矩阵链与实际结果

我选择方案二。相对起始示例,新增了独立肘关节和探头局部伸缩:

- `M_elbow=M_shoulder·T(0,L1,0)·Rz(elbow)`;
- `M_wrist=M_elbow·T(0,L2,0)`;
- `M_probe=M_wrist·T(0,extension,0)`;
- 样本:`T(sample)·Ry(spin)·S`;
- 环绕标记:`T(sample)·Ry(orbit)·T(radius)`。

两组浏览器实测:

| 预设 | 肘关节 | 腕部 | 探头端点 |
|---|---|---|---|
| yaw=0°、肩=0°、肘=0°、伸缩=.30 | `(-2,.55,0)` | `(-2,1.70,0)` | `(-2,2.36,0)` |
| yaw=90°、肩=-30°、肘=60°、伸缩=.50 | `(-2,.38,-.65)` | `(-2,1.37,-.08)` | `(-2,2.12,.35)` |

两个预设都会把动画暂停并把时间归零。暂停后等待 250ms,角度和时间都不变;改为 2 倍速度后继续,样本与标记以各自角速度推进,重新暂停后再次保持。PNG 实际导出为 960×600、56201 字节且不是空白图。

### 最终反思

AI 的帮助主要是把“画面看起来对”转成可以区分原因的坐标测试。最后我保留了独立预测、关键角预设、世界坐标和最大误差;这些数值比只截图更容易说明矩阵链确实正确。