AI 协作日志

学生 Web 实验作品平台

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

# 实验四 AI协作记录

> 学号:(提交前填写)
> 姓名:(提交前填写)
> AI工具与使用版本:豆包(WebGL2 / GLSL ES 3.00 列向量约定)

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

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

目标:在 WebGL2 列向量约定下,验证同样的 T(2,0,0) 与 Ry(90°),为什么 T·R 与 R·T 作用于局部原点后落点不同。

先验预测(不看AI、手推):
- M1 = T·Ry·S,作用于原点 (0,0,0)。最右 S 先:缩放对原点无影响,仍为 (0,0,0);再 Ry(90°):原点旋转后还是原点;最左 T(2,0,0):得到 (2,0,0)。
- M2 = Ry·T·S。最右 S 后,T(2,0,0) 先把原点移到 (2,0,0);再 Ry(90°) 绕世界Y轴转。我预测落点会变,但一开始我猜成了 (0,0,2)。

### 关键提示词

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

### AI建议摘要

AI指出:gl-matrix 的 `mat4.fromYRotation` 对应右手系绕Y轴正角旋转,对一点 (x,0,z) 的作用是
x' = x·cosθ + z·sinθ,z' = -x·sinθ + z·cosθ。
代入 (2,0,0)、θ=90°:x' = 0,z' = -2。即 R·T 后落点是 (0,0,-2),不是我猜的 (0,0,2)。
建议打印:每个矩阵作用后局部原点、以及一个非原点测试点(如局部 (0.5,0,0))的世界坐标,用来区分"中心对了但朝向错了"。

### 我的判断与手算

我对照 gl-matrix 源码确认了 fromYRotation 的第三行是 [-sin, 0, cos],与 AI 一致。
- M1 中心:T·Ry·S·(0,0,0,1) = T·(0,0,0,1) = (2,0,0)。
- M2 中心:Ry·T·S·(0,0,0,1) = Ry·(2,0,0,1) = (2·cos90, 0, -2·sin90) = (0,0,-2)。
我之前符号猜反的原因:把绕Y轴旋转的方向记成了左手系。修正。

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

- 一键90°测试:tx=2、θ=90°、s=1。
- θ=0°:tx=2,两种顺序中心均应落到 (2,0,0)。
- θ=180°:手算 M2 中心应为 (-2,0,0)(把 (2,0,0) 绕Y转180°)。

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

程序状态栏实测:
- θ=90°:T·R·S 中心 = (2.00, 0.00, 0.00);R·T·S 中心 = (0.00, 0.00, -2.00)。与手算完全一致。
- θ=0°:两者中心都是 (2.00, 0.00, 0.00),画面也重合。
- θ=180°:T·R·S 中心仍为 (2.00,0,0);R·T·S 中心 = (-2.00, 0.00, 0.00),与手算一致。

### 修正结论

T 与 R 一般不可交换:M1 中平移发生在旋转之后(最左),平移向量不被旋转影响;M2 中平移先发生、随后被 R 作用,平移方向被旋转"转了一下"。θ=0° 时两矩阵恰好相等只是退化特例(旋转为单位阵),不能据此证明矩阵乘法可交换。改变 s 时两中心都不变,因为缩放作用于原点仍得原点。

## 协作2:程序调试(Task C 绕点旋转)

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

初版实现绕 P 旋转后,现象是:物体虽然在动,但 P=(0,0,0)、θ=90° 时中心落到了 (0,0,2) 而不是预期的 (0,0,-2),而且 P 不在原点时物体像是绕世界原点而不是 P 在转。
我的初步猜测:(1) Ry 的角度符号反了;(2) T(-P) 与 T(P) 位置写反;(3) T(q) 被放到了 T(-P) 前面。

### 提示词

> 我的三维对象能显示,但绕指定点P旋转的落点不对。请提出三个最有可能的矩阵顺序或局部坐标错误,每个错误给出一项能区分原因的测试,不要直接替我重写整份代码。

### AI提出的可能原因

1. T(P) 与 T(-P) 顺序写反(写成了 T(-P)·R·T(P)),旋转轴会从 P 跑到 -P 关于原点的对称点。
2. 把 T(q) 写到了 T(-P) 之前,导致初始中心 q 没有先被平移到 P 的局部坐标系里。
3. Ry 角度正负号与 gl-matrix 约定不一致,使 90° 落到 +Z 而非 -Z。

### 我逐项完成的测试

- 测试A(隔离符号):令 P=(0,0,0)、q=(2,0,0)、θ=90°。此时 T(P)=T(-P)=单位阵,轨道矩阵退化为 Ry·T(q)·S。若中心是 (0,0,-2),说明符号对;若是 (0,0,2),则只是 Ry 符号问题,与 P 无关。
- 测试B(隔离 P 位置):令 P=(1,0,0)、θ=0°。θ=0° 时旋转为单位阵,轨道矩阵应退化为 T(q)·S,中心必须回到 (2,0,0),与 P 无关。若此时中心跑偏,说明 P 被错误地留在了未旋转的链里。
- 测试C(隔离顺序):把链临时写成 T(P)·R·T(-P)·T(q) 与 T(P)·R·T(q)·T(-P) 两版对比,观察 P 不在原点时轨迹圆心是否在 P。

### 真实原因与修复

测试A 直接暴露问题:P=0 时中心是 (0,0,2)。对照 gl-matrix fromYRotation,我把角度传成了 `-angle`,导致 90° 变成 -90°,z' 符号翻转。改回 `c.R("Y", angle)` 后测试A 通过,中心 = (0,0,-2)。
接着测试B:P=(1,0,0)、θ=0°,中心正确回到 (2,0,0),说明 T(q) 位置正确。
测试C:完整链 T(P)·R·T(-P)·T(q)·S 在 P=(1,0,0) 时,轨迹圆心稳定在 P 标记处,P 本身不动,360° 后物体回到 (2,0,0)。

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

三条建议全部采纳,但真正命中根因的是第3条(符号),第1、2条是我为了排除顺序问题做的对照测试。教训:P=0 的退化情形是最便宜的诊断工具——它能把"绕点旋转"问题瞬间降级成"纯 R·T 顺序"问题,避免在长链里盲猜。

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

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

### 关键提示词

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

### 我的选择理由

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

### 两组对照测试

### 最终结果和反思