AI 协作日志

学生 Web 实验作品平台

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

# 实验四 AI协作记录

> 学号:202412210607035  
> 姓名: 韦玉珍 
> AI工具与使用版本(如适用):豆包和TRAE  
> 请用真实过程填充,保留关键提示词原文;不要只贴整段AI代码或聊天截图。

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

### 我的目标与先验预测
列向量约定,局部原点(0,0,0);平移T(2,0,0),绕Y旋转90°。预测:
- $M_1=T\cdot R$:先旋转局部,再平移,局部原点结果(2,0,0)
- $M_2=R\cdot T$:先把局部原点平移到(2,0,0),再被旋转矩阵作用,点变为(0,0,-2)

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

### AI建议摘要
列向量下$v'=Mv$,右侧矩阵先执行。
1. T·R:$v'=T(Rv)$,R只旋转局部顶点,原点R(0,0,0)=(0,0,0),再T平移得到(2,0,0)
2. R·T:$v'=R(Tv)$,Tv把原点挪到(2,0,0),再R_y(90°)旋转向量(2,0,0)得到(0,0,-2);
3. 建议打印status状态栏输出两个中心坐标,核对手算结果。

### 我的判断与手算
Ry(90°)矩阵:
$$
R_y=\begin{bmatrix}0&0&1&0\\0&1&0&0\\-1&0&0&0\\0&0&0&1\end{bmatrix}
$$
- $T\cdot R$作用(0,0,0)得到 (2,0,0)
- $R\cdot T$:$R_y \cdot [2,0,0,1]^T = [0,0,-2,1]^T$

### 我实际测试的参数与坐标
tx=2,angle=90°,scale=1,点击一键90测试。

### 运行现象/数值结果
status输出:T·R·S中心:(2.00, 0.00, 0.00) | R·T·S中心:(0.00, 0.00, -2.00)。与手算完全吻合。

### 修正结论
矩阵乘法不具备交换律,变换顺序直接改变几何结果;即使θ=0°R是单位矩阵两者输出一样,**不能证明矩阵乘法可交换**。

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

### 错误现象与自己的初步分析
现象:Task‑D,修改基座yaw,探头位置完全不动,只有机械臂自己旋转。
猜想1:basePose没有把旋转乘进去;猜想2:肩部位姿没有继承basePose;猜想3:tipPose直接用世界原点,没有继承shoulderPose。

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

### AI提出的可能原因
1. 肩部位姿没有把父basePose放在chain最左侧,没有继承父变换;测试:打印shoulderPose的世界原点坐标,转动基座看坐标是否变化。
2. 把缩放矩阵写进父位姿矩阵,子节点继承拉伸;测试:观察探头立方体外形是否畸形拉伸。
3. 子tipPose直接用T(0,2.2,0),完全丢弃父shoulderPose;测试:tip世界坐标完全不受yaw影响。

### 我逐项完成的测试
1. 打印shoulderPose点坐标,转动基座yaw,坐标完全不变 → 定位问题:shoulderPose没有chain(basePose,...)
2. 外形没有拉伸,排除缩放混入位姿。
3. tipPose也没有继承shoulderPose。

### 真实原因与修复
原代码: ```js const shoulderPose = c.T(0,.55,0),;
const tipPose = c.T(0,2.2,0);
修复为:const shoulderPose = c.chain(basePose, c.T(0,0.55,0), c.R("Z", pitch)); const tipPose = c.chain(shoulderPose, c.T(0, 2.2, 0)); 

### AI建议是否采纳及理由
采纳,三个错误假设帮我快速定位层次继承 bug。父位姿必须放在 chain 最左边,子节点 = chain (父位姿,子局部变换)。

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

### 我希望实现的对象关系
保留教师示例医学定位装置,基座‑机械臂‑探头父子;增加样本台,样本自转、标记绕样本公转;至少 3 部件,一组父子,两种复合变换,两个独立滑块参数 yaw/pitch,动画调速、暂停截图。

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

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

方案 A:医学定位装置(本实验模板)

- 部件:基座、机械臂、探头;样本台、样本、环绕标记
- 矩阵链:basePose→shoulderPose→tipPose 父子;样本自转 T (P)・Ry・S;标记公转 T (P)・Ry・T (r)・S
- 参数:基座 yaw,肩部 pitch,动画速度 speed;可暂停截图
- 优点:贴合实验 D,复用 D 的层次代码,验证点清晰;难度适中。

方案 B:行星‑卫星系统

- 部件:太阳,地球(自转 + 绕太阳公转),月球(绕地球公转)
- 矩阵链:地球:T (sun)・Ry (t)・T (d)・Ry (t)・S;月球继承地球位姿再局部旋转平移
- 参数:公转速度,自转速度;
- 优点天体主题有趣;缺点需要修改大量绘制逻辑,截图功能需要额外适配。

### 我的选择理由
选择方案 A,医学定位装置,和 D 的机械臂代码一脉相承,便于验证父子继承,满足实验全部硬性要求:≥3 部件、父子关系、两种复合变换、两个交互参数,截图、暂停调速。

### 实际矩阵链与交互参数
1. 基座位姿:`basePose = c.chain(c.T(-2,-1.3,0), c.R("Y", yaw))`
2. 肩部:`shoulderPose = c.chain(basePose, c.T(0,0.55,0), c.R("Z", pitch))`
3. 末端 tip:`tipPose = c.chain(shoulderPose, c.T(0,2.2,0))`
4. 样本自转:`c.chain(T(samplePivot), c.R("Y", spinAngle), c.S(...))`
5. 标记公转:`c.chain(T(samplePivot), c.R("Y",orbitAngle), c.T(1.16,0.28,0),c.S(...))`
交互参数:yaw 基座偏航;pitch 肩部俯仰;speed 动画倍率;暂停、重置、截图。

### 两组对照测试
测试 1:yaw=30°, pitch=0。基座旋转,机械臂探头全部跟随旋转,样本台不受基座影响。
测试 2:yaw=0°, pitch=-45°。基座不动,机械臂向下俯仰摆动;样本持续自转,标记持续绕样本公转。暂停动画,全部物体冻结,继续后无跳变。

### 最终结果和反思
全部功能运行正常。

- 父子变换:父矩阵放在 chain 左侧,子局部变换写后面;**缩放 S 仅用于绘制,禁止混入关节位姿**。
- 绕点旋转标准范式:`T(中心点) · R · T(-中心点)`;
- 动画不要累计矩阵,每帧从原始参数重建 model 矩阵,防止漂移;用 dt 做时间增量,暂停时停止角度累加。