AI 协作日志

学生 Web 实验作品平台

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

# 实验四 AI协作记录

> 学号:202412211402018
> 姓名:李书瑶
> AI工具与使用版本(如适用):豆包

## 协作1:变换次序核验(Task B)
### 我的目标与先验预测
Task‑A目标(TODO A1、A2):
完成复合变换代码,验证局部原点经过model矩阵变换之后的世界坐标。
预测:在本框架c.chain调用规则下,传入chain最右侧矩阵最先作用顶点;旋转、缩放不会改变模型中心点,中心点由平移参数决定。
测试用例:tx=1,ty=0,tz=0,angle=90度,scale=1,预测模型世界中心=(1.00, 0.00, 0.00)。

Task‑B目标(TODO B1‑B4):
验证矩阵相乘不具备交换性。
设置平移tx=2,绕Y轴旋转90度,缩放s=1。
我预测:
- 先旋转后平移和先平移后旋转,得到物体位置不一样。
不能仅依靠肉眼画面,需要调用c.point()读取局部原点变换后的世界坐标做定量核验。

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

### AI建议摘要
1. 本框架c.chain(A,B,C)代表矩阵相乘,列向量规则:传入chain最右侧的矩阵会最先作用到顶点。
2. 先旋转再平移:先对局部模型做旋转,之后整体平移,平移向量不受旋转矩阵改变。
3. 先平移再旋转:先执行平移得到局部点,再执行旋转,平移向量会被旋转改变坐标。
4. 核验手段:使用c.point(model,0,0,0)获取局部原点变换后的三维世界坐标,读取页面状态栏输出作为证据。
5. 修改模型姿态只需要更新model矩阵,不需要重新上传GPU顶点缓冲区。

### 我的判断与手算
Task‑A(TODO A2思考记录):
手算:局部原点(0,0,0)经过平移、旋转、缩放变换之后,中心点等于平移参数。旋转和缩放只会改变立方体姿态大小,不会移动中心点。

Task‑B(TODO B3、B4思考记录):
手算:
- 先平移后旋转,局部原点变换得到世界坐标(2, 0, 0)
- 先旋转后平移,局部原点变换得到世界坐标(0, 0, -2)。
当angle=0度,旋转相当于单位矩阵,两种情况输出结果一样,但这不代表矩阵可以交换,只是旋转没有效果。
画面视觉效果只能作为参考,坐标数值才是验证矩阵正确性的证据。

### 我实际测试的参数与坐标
Task‑A测试参数:tx=1,ty=0,tz=0,angle=90°,scale=1;
Task‑B测试参数:tx=2,angle=90°,scale=1,点击页面“一键90°测试”按钮。

### 运行现象/数值结果
Task‑A:状态栏模型中心输出 (1.00, 0.00, 0.00);修改scale缩放,中心点坐标保持不变,符合预测。
Task‑B:状态栏输出:
- T·R·S中心:(2.00, 0.00, 0.00)
- R·T·S中心:(0.00, 0.00, -2.00)
两个立方体空间位置明显区分;当angle=0度两者位置重合。

### 修正结论
4×4几何变换矩阵乘法不满足交换律。变换顺序调换,空间结果完全不同;旋转会对已经完成的平移向量产生变换。做实验不能只看画面,应当选取测试点读取变换后的世界坐标完成定量验证。

## 协作2:程序调试(Task C、Task D)
### 错误现象与自己的初步分析
现象1:Task‑C动画转速异常飞快,物体高速旋转。页面HTML speed输入框标签写“动画速度(度/秒)”。
我的初步猜想:dt时间计算出错 / chain顺序写错 / speed参数理解错误。

现象2:Task‑D机械臂层次调试(TODO D4、D5思考):
需要思考:非均匀缩放如果传给子关节会带来什么后果;测试验证父子变换规则:父运动带动子部件,子部件变换不会影响父部件。

现象3(Challenge挑战题):三自由度机械臂部件互相断开,关节marker不在杆件接缝,部件错位分离;同时Challenge页面status状态栏一直显示“初始化中…”,关节坐标无法刷新。
初步猜想:矩阵继承逻辑错误、平移距离数值错误、JS变量作用域问题。

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

### AI提出的可能原因
1. 位姿pose矩阵混入非均匀缩放并传给子对象,子空间被拉伸扭曲;测试:对比yaw=0度与yaw=90度关节marker坐标。
2. 矩阵chain相乘顺序颠倒;静态给定90度角度,对比理论位置和实际物体位置。
3. UI读取DOM控件语义理解错误,参数错误放大;JS变量作用域错误,内部定义变量外部无法访问;几何平移混淆半长与杆件总长度,造成机械臂杆件错位分离。

### 我逐项完成的测试
1. Task‑C测试验证:
设置P=(0,0,0),angle=90度进行静态测试,观察自转立方体、公转立方体位置是否符合理论预期。
动画部分调试:打印读取到的speed值,发现输入框本身单位就是度每秒,我错误额外乘了60,角速度被放大,导致物体飞转。修复后使用dt做时间增量,playing变量控制暂停,角度对360取模,旋转一周回到初始位置。

2. Task‑D测试验证(D4、D5思考与测试):
思考:如果把非均匀缩放放入pose位姿矩阵并且传给子关节,子对象局部坐标系会被拉伸变形。缩放只能写在绘制矩阵,只用于渲染当前物体,不能传给子节点。
手动测试:调节yaw,基座、大臂、探头全部跟随转动;调节pitch,基座保持不动,大臂和探头运动。验证父子变换规则:父带动子,子不影响父。

3. Challenge调试:
- 问题1:关节点坐标变量写在scene.frame回调内部,draw函数外部访问不到,状态栏无法更新文字。
- 问题2:几何尺寸混淆:立方体半长用于绘制摆放,杆件完整总长用于定位下一个关节;平移数值写错,杆件之间出现缝隙断开。

### 真实原因与修复
1. Task‑C:误解speed输入框语义,额外乘以倍率,转速爆炸;修复后直接读取speed作为角速度,增加异常数值防护。暂停、旋转归位功能全部正常。
2. Task‑D:严格区分pose位姿矩阵(只存平移旋转,可以传给子)和draw绘制矩阵(带缩放,仅渲染)。手动测试现象符合层次变换预期。
3. Challenge:
   - 将关节点坐标计算移到scene.frame外部,解决状态栏变量访问问题。
   - 修改平移距离:绘制立方体使用半长,寻找下级关节使用杆件完整总长。归零姿态杆件紧密拼接,marker落在关节接缝。

### AI建议是否采纳及理由
部分采纳。AI给出多维度排查方向,帮助区分矩阵逻辑bug、参数语义bug、JS作用域bug、几何尺寸bug。没有直接复制完整代码,自己逐项测试定位问题,手动修改并验证每一项修复后的现象。

## 协作3:主题场景协商(Task E)
### 我的目标与预测
需要至少3个三维部件,一组真实父子继承关系,两种复合变换机制;具备独立可调参数,动画暂停调速、截图保存PNG。
参考模板:医疗定位装置,基座‑机械臂‑探头父子层次;右侧样本台物体自转,标记绕样本中心做公转。

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

### AI提供的两个方案与比较
方案1:行星‑卫星系统。太阳为中心,行星继承太阳位姿,卫星继承行星位姿;行星自转,卫星公转。
优点:变换逻辑清晰;缺点:需要从零搭建全部矩阵链,各个天体坐标需要手动验证,开发工作量大。

方案2:医学定位机械臂+样本台。复用Task‑D已经调试正确的基座‑肩部‑探头两级父子;增加样本自转、标记绕样本点公转。
优点:大量复用D经过验证的层次变换代码,开发时间短;同时演示父子层次变换、绕世界指定点公转两种实验要求变换;交互参数yaw、pitch、speed,验证简单。
缺点:模型全部使用立方体,没有复杂外形。

### 我的选择理由
选择方案2(医学定位机械臂+样本台)。
理由:
1. 同时覆盖实验硬性要求:父子继承、物体自转、绕点公转;
2. 复用Task‑D已经验证正确的位姿矩阵代码,减少引入新bug;
3. 满足条件:大于3个部件,2组独立调节参数,支持暂停调速、PNG截图。

### 两组对照测试
测试组1:yaw=0,pitch=0。
现象:机械臂竖直向上;样本原地自转,标记围绕样本画圆;父基座不动,子探头位置正确。

测试组2:yaw=45,pitch=-30。
现象:基座整体旋转45度,机械臂俯仰向下;探头跟随基座与肩部一起运动;样本自转不受机械臂影响;标记公转轨迹不变。

### 最终结果和反思
E6要求记录场景方案与测试结果:本场景为医疗定位装置+旋转样本台;包含父子关节、物体自转、物体绕点公转;两组对照测试如上,截图按钮可以正常导出图片。

运行结果符合预期:父对象运动会带动全部子部件,子对象局部变换不会改变父对象。样本自转、标记公转两套变换独立运行。
反思:层次变换中,pose位姿矩阵只能传递平移和旋转;非均匀缩放只能写在绘制矩阵,严禁传给子关节;每帧必须由原始参数重新构造矩阵,不能矩阵累加,防止位置漂移。

## 附加:Challenge三自由度机械臂
### 拓展目标
在Task‑D两自由度机械臂基础增加肘关节,实现三级父子层次:基座 →大臂 →肘关节 →小臂‑探头。
预期行为:yaw转动会驱动全部部件;pitch只驱动大臂以及下级部件;elbow只驱动小臂与探头,基座、大臂保持不动;marker标记三处关节,状态栏输出关节世界坐标。

### 遇到的问题与调试过程
1. JS变量作用域问题:关节点坐标写在frame回调内部,外部拿不到数值,状态栏文字无法刷新。
2. 几何摆放错误:混淆立方体半长与杆件总长度,平移数值写错,各个杆件互相分离,关节marker不在接缝。

### 测试现象
归零yaw=0、pitch=0、elbow=0,机械臂竖直完整拼接;拖动elbow,仅小臂绕肘关节marker旋转;父关节不会被子关节影响。各个marker标记正好落在杆件接缝位置,状态栏正常输出关节世界坐标。