AI 协作日志

学生 Web 实验作品平台

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

# 实验四 AI 协作记录

> 
> 学号:_202412211401022_______
> 姓名:__路馨______
> AI 工具与使用版本:豆包
## 协作 1:变换次序核验(Task B)

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

目标:对比 `T·R·S` 和 `R·T·S` 两种变换顺序,验证矩阵乘法不可交换;手动预判局部原点 (0,0,0) 经过两组变换后的世界坐标,和程序运行结果对照。
先验预测:原点经过旋转不会改变位置;先平移再旋转,原点停留在平移位置;先旋转再平移,平移后的点会被旋转带动。

### 关键提示词

> 
> 帮我写 Task B,两种次序 modelTRS=T・R・S,modelRTS=R・T・S,用 c.chain,tx=2、角度 90° 先手算中心坐标。

### AI 建议摘要

使用`c.chain(move, rotate, scale)`代表 `T·R·S`;`c.chain(rotate, move, scale)`代表 `R·T·S`;提醒`c.chain(A,B,C)`等价于矩阵 `A × B × C`,右侧矩阵先作用顶点。给出 90° 测试的理论坐标预期。

### 我的判断与手算

- `T·R·S`:S、R_Y 作用于原点,原点不变;再执行`T(2,0,0)` → 结果 **(2,0,0)**
- `R·T·S`:先 S,再 T 把点挪到 (2,0,0),再绕 Y 轴 90° 旋转:`x'=-z, z'=x` → **(0,0,2)**

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

测试参数:tx=2,angle=90°,scale=1
TRS 中心:(2.00, 0.00, 0.00)
RTS 中心:(0.00, 0.00, 2.00)

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

暖色立方体(TRS)固定在 X=2 位置,仅自身转向;青色立方体(RTS)绕世界原点旋转,90° 后跑到 Z 轴正方向。状态栏坐标和手算完全吻合;角度为 0° 时两个方块重合,不能证明矩阵可交换。

### 修正结论

三维变换矩阵乘法**不满足交换律**,平移与旋转的先后顺序会产生完全不同的几何效果;只有旋转角度为 0 时才碰巧结果一致。

## 协作 2:程序调试(Task D 层次关节)

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

初始代码直接写`shoulderPose = c.T(0,.55,0)`,没有继承 basePose;调节基座 yaw 旋转时,基座转了,但是机械臂、探头留在原地不动,没有跟着基座一起转动。
初步猜测:平移写错了,或者 R 参数大小写错误。

### 提示词

> 
> Task D,肩部位姿要继承 basePose,父子层次,基座旋转带动肩部和末端,c.chain 顺序怎么写?

### AI 提出的可能原因

1. shoulderPose 没有把父矩阵 basePose 放进 chain 最左侧,没有继承父坐标系;
2. 缩放矩阵放进位姿 Pose,会把子部件拉伸变形;绘制缩放必须单独放在 draw 链末尾;
3. 旋转轴写错,俯仰应该是局部 Z 轴 `R("Z",pitch)`,不是 Y 轴。

### 我逐项完成的测试

1. 只调 yaw,观察臂是否跟随基座;
2. 固定 yaw=0,单独调节 pitch,观察基座是否不动、臂单独摆动;
3. 打印 shoulderPose 中心点坐标,对比预期值。

### 真实原因与修复

根源:肩部位姿没有继承基座位姿矩阵。
修复:

```
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));
```

父矩阵放在 chain 最左边,子局部变换放在右侧,保证父子坐标系传递。

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

全部采纳。该层次变换逻辑是计算机图形学标准局部坐标系继承方式,符合 CG4 库`c.chain`矩阵左乘规则,测试后联动效果正常,父动带子、子不动父。

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

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

保留机械臂父子结构(基座→肩部→探头),额外增加一套独立动画:样本自转 + 标记绕样本公转;至少 3 个部件、一组父子、两种复合变换、两个独立可控参数,做成医学定位平台场景。

### 关键提示词

> 
> Task E,医学设备主题,左侧机械臂层次联动,右侧样本原地自转,小方块标记绕样本公转,用 c.chain 写自转和公转矩阵。

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

方案 1(行星卫星):中心天体自转,卫星公转;适合天文主题,但是和前面 D 机械臂关联性弱。
方案 2(医学定位机械臂 + 旋转样本台):复用 D 的机械臂代码,新增样本台,一边是父子关节联动,一边是定点公转自转;可以复用 A-D 学到的变换知识,方便对照理解。

### 我的选择理由

选择方案 2 医学定位场景。复用之前 TaskD 机械臂层次代码,降低调试成本;同时包含**父子层级变换**和**绕定点公转**两种复合变换,满足任务硬性要求,和截图界面匹配。

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

- basePose = `T(-2,-1.3,0) · R_Y(yaw)`
- shoulderPose = `basePose · T(0,0.55,0) · R_Z(pitch)`
- tipPose = `shoulderPose · T(0,2.2,0)`
- 样本自转:`T(P) · R_Y(spinAngle) · S`
- 标记公转:`T(P) · R_Y(orbitAngle) · T(r) · S`

交互参数:基座 yaw 角度、肩部 pitch 俯仰、动画 speed 倍速

### 两组对照测试

对照测试 1:固定 pitch=0,拖动基座 yaw 滑块 → 基座、机械臂、探头整体同步旋转;右侧样本、标记不受影响,独立自转公转。
对照测试 2:固定 yaw=0,拖动 pitch 滑块 → 基座不动,机械臂和探头单独俯仰摆动;暂停动画,所有旋转冻结,继续后动画连续无跳变。

### 最终结果和反思

最终场景和实验页面截图一致,满足全部任务约束:≥3 部件、1 组父子、两种复合变换、多个独立参数。
反思:层次变换核心是**父矩阵左乘**;绕点公转顺序很关键,必须先移到旋转中心、旋转、再向外偏移半径;缩放尽量放在绘制链末尾,避免污染子坐标系。