AI 协作日志
学生 Web 实验作品平台
学号:202412211402013 · 来源:ai-log.md
# 实验四 AI协作记录
> 学号:202412211402013
> 姓名:顾喆祺
> AI工具与使用版本(如适用):豆包,大模型版本:Seed 大模型基座
> 请用真实过程填充,保留关键提示词原文;不要只贴整段AI代码或聊天截图。
## 协作1:变换次序核验(Task B)
### 我的目标与先验预测
目标:验证列向量规则下矩阵乘法不具备交换性,对比 T・Ry・S 与 Ry・T・S 两种变换次序得到的模型中心。
预测:参数 tx=2,绕 Y 旋转 90°,scale=1。M1=T・Ry・S,物体先缩放、旋转,之后整体平移,模型中心为 (2,0,0);M2=Ry・T・S,物体先缩放,平移后再绕世界原点旋转,平移后的点会被旋转带动,中心得到 (0,0,-2)。旋转角度为 0 度时两者输出坐标相同,但这只是特例,不能证明矩阵乘法可交换。
### 关键提示词
在 WebGL2 的列向量约定下,局部原点为 (0,0,0),平移 (2,0,0),绕 Y 轴旋转 90°。请分别分析 T・R 与 R・T 的世界中心位置和计算步骤,并建议我要打印哪些数值进行核验;不要直接重写完整程序。
### AI建议摘要
1. chain (A,B,C) 等价矩阵 A×B×C,列向量规则,最右侧矩阵最先作用于顶点。
2. T・R:先对局部模型做旋转,旋转完成后整体做平移,平移不受旋转影响,局部原点输出等于平移向量。
3. R・T:先执行平移把原点移到 (2,0,0),再基于世界原点做 Y 轴旋转 90°,点 (2,0,0) 旋转后得到 (0,0,-2)。
4. 使用 c.point (model,0,0,0) 读取局部原点转换后的世界坐标,依靠状态栏数值核验,不能只依靠肉眼画面。
5. 旋转 0° 得到相同结果属于特例,旋转矩阵此时为单位矩阵,不能证明矩阵乘法可交换。
### 我的判断与手算
判断 AI 推导逻辑和我的预测一致,必须以 c.point 输出的数值作为判断依据,不能仅凭视觉。
手算:
T・Ry・S:局部原点经过 S、Ry 变换后仍然是 (0,0,0),最后 T 平移得到 (2,0,0)。
Ry・T・S:S 后原点 (0,0,0),T 平移得到 (2,0,0),Ry90° 旋转后变换结果 (0,0,-2)。
### 我实际测试的参数与坐标
测试参数:tx=2,angle=90°,scale=1;额外补充 angle=0° 对照组。
### 运行现象/数值结果
tx=2,angle=90°,scale=1:
T・R・S 中心输出:(2.00, 0.00, 0.00)
R・T・S 中心输出:(0.00, 0.00, -2.00)
angle=0° 时两组中心均输出 (2.00, 0.00, 0.00),画面位置重合。
### 修正结论
矩阵乘法不满足交换律,变换相乘顺序会直接改变物体最终世界位置;仅当旋转为单位矩阵时才会出现结果一致的特殊情况,不能以此认定矩阵可以交换。c.point 函数可以脱离视觉,通过数值直接核验复合变换正确性。
## 协作2:程序调试(Task C或D)
### 错误现象与自己的初步分析
现象:模型可以正常绘制,修改基座 yaw 角度,机械臂和探头不会跟随基座转动;修改 pitch 俯仰角度,手臂摆动动作正常。
初步分析:大概率是 chain 矩阵顺序写错,父子层次变换父位姿应当写在 chain 左侧,怀疑父矩阵放到右侧导致父变换无法作用子对象。
### 提示词
我的三维对象能显示,但修改父关节角度后探头位置异常。请提出三个最有可能的矩阵顺序或局部坐标错误,每个错误给出一项能区分原因的测试,不要直接替我重写整份代码。
### AI提出的可能原因
1. 父子矩阵顺序颠倒:父位姿应当放在 chain 左侧,子局部变换放在右侧;父矩阵写在右侧,父变换不会传递到子对象。测试:打印肩部世界坐标,改变 yaw,如果肩部坐标不变即为该问题。
2. 位姿矩阵混入非均匀缩放:绘制几何体的缩放写入关节位姿矩阵,缩放扭曲后续子对象。测试:观察探头是否出现异常拉伸变形。
3. 关节平移坐标参数错误。测试:yaw=0、pitch=0 时观察肩部标记是否在预期装配位置。
### 我逐项完成的测试
测试 1:修改基座 yaw,打印 c.point (shoulderPose,0,0,0) 肩部世界坐标;yaw 变化 XZ 坐标完全不变,匹配第一条错误特征。
测试 2:观察探头外形,探头没有异常拉伸,排除第二条缩放混入 bug。
测试 3:yaw=0、pitch=0,肩部标记位置装配正常,排除参数写错。
### 真实原因与修复
真实原因:肩部位姿矩阵 chain 顺序颠倒,父 basePose 放在 chain 参数右侧,父变换无法作用子对象。
修复代码:shoulderPose = c.chain (basePose, c.T (0,.55,0), c.R ("Z", pitch)),父位姿 basePose 置于 chain 最左侧。修复后调节 yaw,肩部、手臂、探头跟随基座旋转;调节 pitch 基座保持不动,手臂探头俯仰摆动。
### AI建议是否采纳及理由
采纳第一条错误分析。AI 给出的测试方案可以快速定位矩阵顺序问题,帮助区分多种潜在 bug,不需要直接修改代码,符合实验要求。
## 协作3:主题场景协商(Task E)
### 我希望实现的对象关系
需要至少 3 个部件,一组明确父子继承,两种不同复合变换,两个以上独立可调参数;动画支持暂停、速度调节、重置截图;复用现有 WebGL 立方体框架,不引入外部库。
### 关键提示词
我已实现 T・R・S、绕指定点旋转和两级父子变换。请提出两个可在 40 分钟内用简单立方体完成的三维联动场景,并比较部件关系、矩阵链、交互参数、验证难度。请复用现有 WebGL2 框架,不引入相机拾取、光照或外部库,也不要直接生成整套代码。
### AI提供的两个方案与比较
方案 A:行星卫星场景
部件:固定太阳、地球(公转 + 自转)、月球;地球‑月球为父子关系,地球绕太阳做绕点公转。
参数:自转角速度、公转角速度倍数。
矩阵链:地球 = T (sunPivot)・R (orbit)・T (radius)・R (selfSpin)・S;月球 = earthPose・R (moonOrbit)・T (moonRadius)・S。
验证难度:中等,需要自己新增 UI 控件。
方案 B:改造医学定位装置场景
部件:基座、机械臂、探头(父子继承);旋转样本台、自转样本、环绕标记。基座控制整体偏航,肩部控制俯仰;样本自身自转,标记绕样本做公转。
参数:基座 yaw、肩部 pitch、动画 speed;自带暂停、重置、截图控件。
矩阵链:basePose=T (basePos)・Ry (yaw);shoulderPose=chain (basePose,T (0,0.55,0),Rz (pitch));tipPose=chain (shoulderPose,T (0,2.2,0));specimenDraw=T (pivot)・Ry (spinAngle)・S;orbitMarker=T (pivot)・Ry (orbitAngle)・T (offset)・S。
验证难度:低,HTML 控件已经全部就绪,只需要补全矩阵逻辑。
对比:方案 A 需要重新编写界面控件;方案 B 复用模板页面,专注矩阵逻辑,适合 40 分钟完成。
### 我的选择理由
选择方案 B 改造医学定位装置。无需修改 HTML 页面,只完善 JS 矩阵;做实质性修改:机械臂整体平移至 (-2,-1.3,0);样本自转、标记公转使用两套不同角速度;拥有 yaw、pitch、speed 多个独立参数,满足实验全部硬性条件。
### 实际矩阵链与交互参数
父子链:basePose → shoulderPose → tipPose
basePose = c.chain (c.T (-2,-1.3,0), c.R ("Y", yaw) );
shoulderPose = c.chain ( basePose, c.T (0,.55,0), c.R ("Z", pitch) );
tipPose = c.chain ( shoulderPose, c.T (0,2.2,0) );
specimenDraw = c.chain (c.T (samplePivot [0],samplePivot [1],samplePivot [2]),c.R ("Y", spinAngle),c.S (.7,.78,.7));
orbitMarker = c.chain (c.T (samplePivot [0],samplePivot [1],samplePivot [2]),c.R ("Y", orbitAngle),c.T (1.16,.28,0),c.S (.22));
交互参数:
yaw:基座 Y 轴偏航;
pitch:肩部 Z 轴俯仰;
speed:全局动画速度倍率;
功能:播放 / 暂停、重置、PNG 截图。
### 两组对照测试
测试状态 1:yaw=0°,pitch=0°,speed=1.0
预期:机械臂竖直向上;样本持续自转,标记绕样本公转;探头处于臂末端。
实际结果:与预期完全吻合。
测试状态 2:yaw=30°,pitch=-25°,speed=2.0
预期:基座整体旋转 30°,手臂向下俯仰摆动;动画运动速度加快;探头与手臂末端连接不脱离。
实际结果:与预期完全吻合。
### 最终结果和反思
完成全部验收条件:部件数量大于 3,基座‑肩部‑探头具备真实父子继承;包含层次父子变换、对象自转、绕点公转两种以上复合变换;多组独立可调参数;动画暂停冻结画面,继续无跳变,截图功能正常。
反思:绕点公转不能直接复用物体自身角速度,必须严格使用 T (P)・R・T (offset)・S 矩阵链;父子变换中父位姿必须放在 chain 最左侧;缩放仅放在绘制链末尾,不能传入子关节位姿。