AI 协作日志

学生 Web 实验作品平台

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

# 实验四 AI协作记录

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

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

### 我的目标与先验预测
实验Task‑B要对比矩阵T·R·S和R·T·S的输出结果。我学习到本实验是列向量,矩阵右边的变换先执行。
我的预测:
1. 参数tx=2,angle=90°,scale=1。
2. M1 = T·Ry·S:先缩放,自身旋转,之后平移;物体中心世界坐标为 (2.00,0.00,0.00)。
3. M2 = Ry·T·S:先缩放,平移,再旋转;平移向量会被旋转改变,物体中心变成(0.00,0.00,-2.00)。
4. 当angle=0°,旋转矩阵是单位矩阵,两者画面会重合,但我认为这不代表矩阵乘法可以交换。
我希望AI帮我确认我的手算是否正确,并告诉我应该打印什么数据用来验证。
### 关键提示词
在WebGL2的列向量约定下,局部原点为(0,0,0),平移(2,0,0),绕Y轴旋转90°。
请分别分析T·R与R·T的世界中心位置和计算步骤,并建议我要打印哪些数值进行核验;不要直接重写完整程序。
### AI建议摘要
1. 列向量计算规则:P_world = M * P_local,矩阵从右向左依次作用于顶点。
2. T·R:先对物体做旋转,之后再平移;平移向量不受旋转影响,局部原点结果(2,0,0)。
3. R·T:先把物体平移到(2,0,0),再对点做绕Y轴旋转90°;向量(2,0,0)绕Y旋转90°得到(0,0,-2)。
4. 建议调用point(model,0,0,0)拿到局部原点变换后的世界坐标,打印该坐标做核验,不能只靠肉眼看画面。
5. 角度0°两个结果一致只是旋转矩阵为单位矩阵的特例,不能证明矩阵可交换。
### 我的判断与手算
AI推导和我预先预测结果一致。
手算:
- T·Ry作用于(0,0,0):T(Ry*(0,0,0)) = T(0,0,0) = (2,0,0)
- Ry·T作用于(0,0,0):Ry((2,0,0)) = (0,0,-2)
我理解关键点:R·T模式中平移出来的点本身会被旋转矩阵变换。
### 我实际测试的参数与坐标
测试参数:tx=2,angle=90°,scale=1。
使用框架函数c.point(modelTRS,0,0,0)、c.point(modelRTS,0,0,0)获取局部原点世界坐标。
### 运行现象/数值结果
打开task‑b.html,点击一键设置90°测试:
- T·R·S中心输出:(2.00, 0.00, 0.00)
- R·T·S中心输出:(0.00, 0.00, -2.00)
将angle设置为0°,两个立方体位置完全重合;修改angle=180°,两个物体位置再次明显分开。
### 修正结论
矩阵乘法不具备交换律,T·R ≠ R·T。
即使视觉画面看起来一样,也要打印测试点的世界坐标做数值核验,不能只依靠肉眼画面。angle=0°重合只是特殊情况,不能证明矩阵可以交换。
## 协作2:程序调试(Task C或D)

### 错误现象与自己的初步分析
我做Task‑D机械臂父子变换,我猜想:如果子对象没有继承父的位姿矩阵,当基座yaw旋转时,子部件不会跟随基座一起运动。
我准备人为制造bug来练习排错:把肩部位姿里面父basePose继承去掉。
我的初步猜测:故障来源有三种可能性:矩阵相乘顺序错误;子没有继承父位姿;位姿矩阵混入缩放。
### 提示词
我的三维对象能显示,但修改父关节角度后探头位置异常。
请提出三个最有可能的矩阵顺序或局部坐标错误,每个错误给出一项能区分原因的测试,不要直接替我重写整份代码。
### AI提出的可能原因
1.子对象位姿没有继承父位姿矩阵;测试方法:打印父关节、子关节世界坐标;转动父参数,如果子坐标完全不变就是该问题。
2. 矩阵相乘顺序颠倒,例如绕点旋转T(P)和T(-P)写反;测试现象物体轨迹乱飞,不会绕目标点旋转。
3. 位姿矩阵混入非均匀缩放S传递给子对象;测试现象模型发生扭曲畸变,旋转角度越大变形越严重。
### 我逐项完成的测试
我选择测试第一种故障:子位姿不继承父位姿。
1. 修改task‑d.js,肩部位姿去掉basePose继承,bug代码:
const shoulderPose = c.chain(c.T(0, 0.55, 0), c.R("Z", pitch));
2. 滑动yaw基座角度,观察画面,同时观察状态栏肩部关节世界坐标。
3. 现象:基座方块会跟着yaw旋转,但是大臂、探头完全不动;状态栏打印的肩部位姿坐标完全不随yaw改变。
4. 修复:恢复正确代码 const shoulderPose = c.chain(basePose, c.T(0, 0.55, 0), c.R("Z", pitch));
5. 修复完成,再次滑动yaw,机械臂、探头跟随基座整体转动。
像这样,那Task‑C绕点旋转,如果T(P)、T(-P)写反,物体不会绕P点公转,会飞出去。
### 真实原因与修复
真实原因:肩部位姿缺少父对象basePose,父子变换继承断裂,父的变换没有传递到子对象。
修复:子位姿矩阵c.chain()第一个参数必须放入父的位姿矩阵,实现继承。
同时记住:位姿矩阵只能放平移和旋转,不能加入非均匀缩放;缩放只能写在绘制矩阵,不能传给子对象。
### AI建议是否采纳及理由
全部采纳AI给出的排错思路。
理由:初学者很容易只看画面,忽略打印关节世界坐标;AI提醒我调试的时候优先打印关节坐标,而不是单纯肉眼观察画面,这个方法可以快速定位矩阵继承问题。
## 协作3:主题场景协商(Task E)

### 我希望实现的对象关系
完成Task‑E自主三维联动场景,硬性要求:至少3个部件、一组真实父子继承,两种不同复合变换,两个可调节参数,动画暂停、调速、截图。
我已经掌握T·R·S复合变换、绕指定点旋转、两级父子层次变换。希望AI给我两套可实现方案,对比优缺点。
### 关键提示词
我已实现T·R·S、绕指定点旋转和两级父子变换。请提出两个可在40分钟内用简单立方体完成的三维联动场景,并比较部件关系、矩阵链、交互参数、验证难度。
请复用现有WebGL2框架,不引入相机拾取、光照或外部库,也不要直接生成整套代码。
### AI提供的两个方案与比较
方案A:医学定位机械臂+旋转样本台
- 部件:基座、机械臂、探头、样本、环绕标记。
- 变换机制:基座→肩部→探头父子层次变换;样本自身自转;标记绕样本中心公转。
- 交互参数:基座yaw,肩部pitch,全局动画速度speed。
- 优点:可以复用Task‑D已经调试完成的机械臂矩阵代码,开发工作量小;同时覆盖父子继承、自转、绕点公转两种变换;测试验证简单。
方案B:行星卫星系统
- 部件:太阳、地球、月球。
- 变换机制:地球绕太阳公转+自转;月球作为地球子对象跟随地球,月球自身自转。
- 参数:公转速度、自转速度。
- 缺点:需要全部重新编写矩阵链,调试工作量更大。
### 我的选择理由
我选择方案A(医学机械臂+旋转样本台)。
理由:我已经调试通过Task‑D机械臂代码,可以直接复用,40分钟内可以完成,
同时满足任务E全部硬性条件:父子层次、自转、绕点公转,有多个可调参数,方便做两组参数对照测试。
### 实际矩阵链与交互参数
1. 基座:basePose = T(-2,-1.3,0) · Ry(yaw)(位姿矩阵,无缩放)
2. 肩部位姿:shoulderPose = basePose · T(0,0.55,0) · Rz(pitch),继承基座
3. 末端tip位姿:tipPose = shoulderPose · T(0, 2.2, 0),继承肩部
4. 样本自转绘制矩阵:specimenDraw = T(P) · Ry(spinAngle) · S(...)
5. 环绕标记公转矩阵:orbitMarker = T(P) · Ry(orbitAngle) · T(radius) · S(...)
交互参数:
- yaw:基座绕Y轴旋转
- pitch:机械臂局部Z轴俯仰
- speed:全局动画速度倍率
功能:暂停、继续、重置、PNG截图。
### 两组对照测试
测试1
参数:yaw=0°,pitch=0°,speed=1
预期现象:基座朝向Z方向,机械臂竖直向上;样本原地自转;标记围绕样本做公转运动;探头处于手臂正上方。
实际现象:画面与预期一致;状态栏末端探头世界坐标正常;暂停可以静止画面。
测试2
参数:yaw=45°,pitch=-30°,speed=2
预期现象:基座整体旋转45°;机械臂向下俯仰摆动;样本自转速度加快,标记公转同步加快;探头跟随父关节保持装配连接。
实际现象:和预期现象一致;继续/暂停动画没有角度跳变;PNG截图保存成功,图片不为空白。
### 最终结果和反思
1. Task‑E全部硬性条件满足:部件数量≥3;真实父子继承;父子层次+自转+绕点公转两种复合变换;多个可调参数;暂停调速截图全部可用。
2. 关键点:父子变换,子位姿chain第一个参数必须是父位姿;绕点公转矩阵顺序T(P)‑R‑T(偏移半径)顺序不能颠倒。
3. 反思:不能只看画面视觉效果,一定要打印关节/测试点的世界坐标,做数值对照,很多矩阵错误肉眼不容易直接发现。
4. 和原始模板对比功能性修改:补全完整父子继承逻辑;实现样本自转;实现标记绕样本中心公转,不是简单修改颜色和立方体数量。