AI 协作日志
学生 Web 实验作品平台
学号:202412211402034 · 来源:ai-log.md
# 实验四 AI协作记录
> 学号:202412211402034
> 姓名:龙春地
> AI工具与使用版本:豆包
## 协作1:变换次序核验(Task B)
### 我的目标与先验预测
列向量约定,局部原点(0,0,0),平移T(2,0,0),绕Y轴90°,缩放S=1。
预测:
M1=T·R·S:先S,再R,最后T;局部原点(0,0,0)经过S、R仍然(0,0,0),T平移得到世界(2,0,0)。
M2=R·T·S:S→T→R;先把点(0,0,0)平移到(2,0,0),再绕Y轴旋转90°,X→‑Z,得到(0,0,-2)。
### 关键提示词
> 在WebGL2的列向量约定下,局部原点为(0,0,0),平移(2,0,0),绕Y轴旋转90°。请分别分析T·R与R·T的世界中心位置和计算步骤,并建议我要打印哪些数值进行核验;不要直接重写完整程序。
### AI建议摘要
1. 列向量:`M * vec`,矩阵链右侧先执行。
2. T·R:先R旋转局部点,再T平移;原点不受旋转影响,结果=平移向量(2,0,0)。
3. R·T:先T把局部原点移到(2,0,0),再R绕Y旋转90°得到(0,0,-2)。
4. 核验手段:打印`c.point(modelTRS,0,0,0)`、`c.point(modelRTS,0,0,0)`,看状态栏输出坐标。
### 我的判断与手算
- T·R·S:S(0,0,0)=(0,0,0);Ry(0,0,0)=(0,0,0);T:(2,0,0) ✔
- R·T·S:S(0,0,0)=(0,0,0);T得到(2,0,0);Ry(2,0,0)=(0,0,-2) ✔
### 我实际测试的参数与坐标
tx=2,angle=90°,scale=1。
### 运行现象/数值结果
- T·R·S 输出:(2.00, 0.00, 0.00)
- R·T·S 输出:(0.00, 0.00, -2.00)
和手算完全一致。
### 修正结论
矩阵乘法**不满足交换律**,T与R交换顺序结果完全不同;theta=0°时两者输出相同,**不能证明矩阵可交换**,只是特殊参数巧合。
## 协作2:程序调试(Task C或D)
### 错误现象与自己的初步分析
> 假设bug:Task‑D修改基座yaw,探头不跟随基座;初步怀疑矩阵顺序写错,把缩放放到父位姿矩阵;或者链式顺序写反。
### 提示词
> 我的三维对象能显示,但修改父关节角度后探头位置异常。请提出三个最有可能的矩阵顺序或局部坐标错误,每个错误给出一项能区分原因的测试,不要直接替我重写整份代码。
### AI提出的可能原因
1. 父子链顺序写反,子位姿 × 父位姿,而不是父 × 子;测试:yaw=90°,观察肩部坐标是否发生旋转。
2. 将几何非均匀缩放混入父关节位姿矩阵;缩放只允许放在绘制链末尾;测试:yaw=90,pitch=0,观察臂形状是否扭曲。
3. 末端tipPose直接使用世界坐标T,没有继承shoulderPose;测试:pitch改变,看肩部marker动,探头不动。
### 我逐项完成的测试
1. 测试1:yaw=90°,肩部marker没有旋转 → 链顺序错误;修复:`c.chain(basePose, local‑trans‑rot)`父在前。
2. 测试2:缩放从位姿移到绘制链末尾;臂不再拉伸畸变。
3. 测试3:tipPose继承shoulderPose;探头跟随肩部运动。
### 真实原因与修复
一开始写反chain顺序,子矩阵写在chain第一个参数;修复:父位姿放chain最左边。
```js
//错误:const shoulderPose = c.chain(c.T(0,0.55,0), c.R("Z", pitch), basePose);
//正确:const shoulderPose = c.chain(basePose, c.T(0, 0.55, 0), c.R("Z", pitch));