AI 协作日志
学生 Web 实验作品平台
学号:202412211401029 · 来源:ai-log.md
# 实验四 AI协作记录
> 学号:202412211401029
> 姓名:韦丰华
> AI工具与使用版本:Trae(DeepSeek-V4.1-Flash)
## 一、必做任务 A/B/C 的 AI 使用简记
> 说明:A/B/C 是必做部分,我的用法比较简单——只让 AI 帮我分析“这个任务要做什么、具体怎么做”,然后自己按 TODO 填代码、在浏览器里核对状态栏数值并概括结论。
### A · 三维复合模型矩阵
我的问题:Task A 要我用平移、绕 Y 旋转、缩放合成 Model 矩阵,并核对模型中心;A1、A2 分别要做什么?
AI 的回答:A1 按列向量约定组合 `T(tx,ty,tz)·Ry(angle)·S(scale)`,`c.chain` 从左到右相乘,效果上是右侧先执行;A2 的局部原点 `(0,0,0)` 只会被平移改写,所以预测中心就是 `(tx,ty,tz)`,再用 `c.point(model,0,0,0)` 实测对照。
我按此填入 `c.chain(c.T(x,y,z), c.R("Y",angle), c.S(scale))`,并让状态栏同时显示预测与实测。默认参数下两者都是 `(1.20, 0.30, 0.00)`;把 tx=1、ty=0、tz=0、角度=90°、比例=2 后,中心仍为 `(1.00, 0.00, 0.00)`。结论:旋转和缩放不改变局部原点,中心只由平移决定,矩阵链顺序是“先 S、再 Ry、最后 T”。
### B · 变换次序与非交换性
我的问题:同一组 T/R/S 只交换相乘顺序,`T·R·S` 和 `R·T·S` 的差别在哪里?tx=2、角度 90° 时两边中心各是多少?
AI 的回答:`T·R·S` 是先把物体缩放、旋转,再整体平移,中心在 `(tx,0,0)`;`R·T·S` 是先把物体平移到 `(tx,0,0)`,再绕世界 Y 轴旋转,平移量会被旋转带走,中心变成 `(tx·cosθ, 0, -tx·sinθ)`。
我填好 B1、B2,并按 B3 在代码里写了预测式。实测 90°:`T·R·S` 中心 `(2.00, 0.00, 0.00)`,`R·T·S` 中心 `(0.00, 0.00, -2.00)`,与预测一致;0° 时两者都是 `(2.00,0.00,0.00)`,180° 时分别是 `(2.00,0.00,0.00)` 和 `(-2.00,0.00,0.00)`。结论:矩阵乘法不可交换,只有 θ=0° 这种特例才碰巧相同。
### C · 自转与绕指定点旋转
我的问题:C1 的“绕自身中心自转”和 C2 的“绕世界点 P 公转”分别怎么写?C3 用 dt 更新角度时暂停要注意什么?
AI 的回答:自转是 `T(q)·Ry·S`,旋转轴直接穿过物体中心;公转要把 P 搬到原点再转回来,即 `T(P)·Ry·T(-P)·T(q)·S`,注意 `T(-P)` 在旋转右侧;C3 只在播放时累加 `角速度×dt`,暂停不要继续积累。
填完后实测:P=(0,0,0)、θ=90° 时,自转中心 `(2.00,0.00,0.00)`,绕点中心 `(0.00,0.00,-2.00)`;P=(0,0,1)、θ=90° 时,绕点中心 `(-1.00,0.00,-1.00)`,黄色 P 标记始终不动。先暂停再改角度取数,数值不再变化,说明暂停时没有继续累加。结论:自转只改朝向,公转才会换位置;`T(-P)` 的作用是把旋转中心临时移到原点。
## 二、协作2:Task D 父子变换详记(选做)
### 我的目标与先验预测
基座—肩—探头是两级父子链。我预测:拖基座 yaw 时,肩、臂、探头应整体跟着转;只拖 pitch 时,基座完全不动,探头随臂端划弧;肩部在 Y 轴上,所以它的 x、z 应始终是 0。
### 关键提示词
> 我要做基座→肩→探头两级父子链。基座位姿 `Mbase=T(basePos)·Ry(yaw)`,肩部 `Mshoulder=Mbase·T(0,h,0)·Rz(pitch)`,臂段 `Mshoulder·T(0,L/2,0)·S(w,L,d)`,末端 `Mtip=Mshoulder·T(0,L,0)`,探头 `Mtip·T(0,d/2,0)·S(...)`。请按顺序教我:每个矩阵在列向量下先做什么、为什么几何缩放不能进入位姿、写完后用哪两个坐标判断父子关系是否正确;不要直接给我整份代码。
### AI 的分步教学
1. 先分“位姿”和“绘制”:位姿只放平移、旋转,保证是刚体变换;缩放、半高偏移属于形状,放到最后,只影响这一件模型。
2. 肩部位姿必须 `chain(basePose, ...)`,先继承基座,再做关节高度平移和局部 Z 轴俯仰;如果从世界原点重新写 `T(0,.55,0)`,肩就与基座脱节。
3. 末端必须继承 `shoulderPose`,这样 pitch 转动时探头跟着臂端走;若用世界坐标直接定位,探头会留在原地。
4. 判断标准:肩部坐标是否恒为 `(0,-0.75,0)`;只改 yaw 时基座是否跟随,只改 pitch 时基座是否不动。
### 我的修改与测试
D1 写 `basePose = chain(T(0,-1.3,0), R("Y",yaw))`;D2 写 `shoulderPose = chain(basePose, T(0,.55,0), R("Z",pitch))`;D3 写 `tipPose = chain(shoulderPose, T(0,2.2,0))`。D4 的 `S(.38,2.2,.45)` 只留在 `armDraw`,没有并进位姿。
实测三组:
| yaw / pitch | 肩部世界坐标 | 末端世界坐标 |
|---|---|---|
| 30° / -25° | (0.00, -0.75, 0.00) | (0.81, 1.24, -0.46) |
| 90° / -25° | (0.00, -0.75, 0.00) | (0.00, 1.24, -0.93) |
| 0° / -45° | (0.00, -0.75, 0.00) | (1.56, 0.81, 0.00) |
肩部坐标三组都不变,说明它在基座 Y 轴上、不会被 yaw 甩出去;只改 yaw 时整机绕 Y 转,只改 pitch 时基座不动、末端从 `(0.81,1.24,-0.46)` 划到 `(1.56,0.81,0.00)`,父子继承正确,探头始终贴住臂端。
### 修正结论
非均匀缩放只能放在末端绘制矩阵里:它是“把臂段拉长”的形状操作,不是关节的位姿。如果把它并进 `shoulderPose` 传给探头,缩放会被子部件继承,探头会被一起拉长;同时缩放矩阵也不再是刚体变换,父子关系会失真。父运动可以带子,子运动不会反过来改父,这是层次变换和世界坐标直接定位的关键区别。
## 三、协作3:Task E 场景设计详记(选做)
### 我希望实现的对象关系
保留教师示例的医学设备主题,但要做出可说明的功能差异:左侧基座→机械臂→探头;右侧转台→样本;再加一个绕样本中心公转的标记。要求至少 3 个部件、1 组父子、2 种复合变换、2 个独立参数。
### 关键提示词
> 我已完成 T·R·S、绕指定点旋转和两级父子。请在教师示例(基座→机械臂→探头+旋转样本台)基础上,给我两个能用简单立方体在 40 分钟内完成的实质修改方案,比较部件关系、矩阵链、交互参数和验证难度;要求保留 WebGL2 框架,不引入相机拾取、光照或外部库,也不要直接生成整套代码。
### AI 的两个方案与比较
- 方案一:保留医学主题,给转台增加慢速自转,让样本成为转台的子对象再自转,并把环绕标记的轨道倾斜 25°。
- 方案二:改成行星—卫星系统,用恒星、行星、卫星做三级公转自转。
比较后选方案一:它复用现有滑块与坐标竖直装配,改动集中在矩阵链;转台和样本形成“父自转+子自转”的真实层级;倾斜轨道还能展示复合旋转的顺序。方案二虽然也能做,但和机械臂主题割裂,验证点反而更少。
### 实际矩阵链
- 基座:`Mbase = T(-2,-1.3,0)·Ry(yaw)`
- 肩:`Mshoulder = Mbase·T(0,0.55,0)·Rz(pitch)`
- 臂:`Marm = Mshoulder·T(0,1.1,0)·S(0.38,2.2,0.45)`
- 末端:`Mtip = Mshoulder·T(0,2.2,0)`
- 探头:`Mprobe = Mtip·T(0,0.32,0)·S(0.73,0.65,0.73)`
- 转台:`Mtable = T(2,-1.32,0)·Ry(20t)`,绘制 `Mtable·S(1.9,0.25,1.9)`
- 样本:`Msample = Mtable·T(0,0.84,0)·Ry(65t)`,绘制 `Msample·S(0.7,0.78,0.7)`
- 标记:`Mmark = T(2,-0.48,0)·Rz(25°)·Ry(42t)·T(1.16,0,0)·S(0.22)`
与教师示例相比的功能差异有三点:转台由静止变为 20°/s 慢速自转;样本继承转台位姿后再以 65°/s 自转,形成两级父子;标记轨道整体绕 Z 倾斜 25° 后再公转,轨道平面不再水平,角速度 42°/s 与样本不同,所以两者轨迹明显分离。
### 两组对照测试
| 参数 | 末端世界坐标 | 说明 |
|---|---|---|
| yaw=25°, pitch=-20° | (-1.32, 1.32, -0.32) | 默认装配,探头在基座右前方 |
| yaw=90°, pitch=-20° | (-2.00, 1.32, -0.75) | 只转基座,整机绕 Y 轴甩到 Z 负方向 |
| yaw=90°, pitch=-50° | (-2.00, 0.66, -1.69) | 基座不动,俯仰让探头向下前方划弧 |
另外,运行约 0.3 秒时状态栏显示“台面/样本/标记角=6°/18°/12°”,正好对应 20、65、42°/s 三个不同角速度;暂停按钮会切换成“继续动画”,恢复后状态回到“动画运行”。E 与 C 共用 `if(playing)` 累加和同一个 `c.loop`,C 已实测暂停后角度冻结,E 沿用同一套时序逻辑。画布 `toBlob` 得到 `image/png`、10873 字节,说明渲染结果不是空白;Console 无报错。
### 最终结果和反思
这次改动没有换主题,但通过“转台父位姿+样本子自转+倾斜轨道”做出了和教师示例不同的对象关系。最大的体会是:父子链的关键不是把坐标算对一次,而是每一帧都从参数重新乘矩阵;只要顺序或继承关系错一步,部件就会脱节。选做部分让我真正理解了“位姿只含刚体变换、缩放只属于绘制”这条边界。
## 四、其他 AI 使用声明
- 本文件的整理、分节、排版和文字归纳由 AI 协助完成;A/B/C 的简记是把我的提问、AI 的简要分析和实测数值压缩成短记录,D/E 则保留了完整的分步教学与修正过程。
- 代码方面,AI 按 TODO 给出最小实现和排错建议,我负责逐页运行、读取状态栏、核对预测值与实测值,并决定是否采纳。
- 文中所有坐标与测试结论均取自本机浏览器实际运行结果,没有直接抄用 AI 给出的理论值;两者不一致时会以页面实测为准。