AI 协作日志
学生 Web 实验作品平台
学号:202412211401013 · 来源:ai-log.md
# 实验四 AI协作记录 > 学号: 202412211401013 > 姓名: 陈妍煜 > AI工具与使用版本(如适用): 豆包 > 请用真实过程填充,保留关键提示词原文;不要只贴整段AI代码或聊天截图。 ## 协作1:变换次序核验(Task B) ### 我的目标与先验预测 目标:在 WebGL2 列向量约定下,验证 T·R·S 与 R·T·S 作用于同一组参数时,模型局部原点 (0,0,0) 落到世界坐标的位置是否不同。 先验预测:当 tx=2、θ=90°、s=1 时—— - M1 = T·R·S:先 S(原点不动)→ 再 R(原点绕Y转仍不动)→ 最后 T 平移到 (2,0,0),所以中心应为 (2,0,0)。 - M2 = R·T·S:先 S(原点不动)→ 再 T 把原点推到 (2,0,0) → 最后 R 把 (2,0,0) 绕Y转90°。按右手系绕Y轴旋转公式 x'=x·cosθ+z·sinθ,z'=-x·sinθ+z·cosθ,代入得 x'=0, z'=-2,所以中心应为 (0,0,-2)。 ### 关键提示词 > 在WebGL2的列向量约定下,局部原点为(0,0,0),平移(2,0,0),绕Y轴旋转90°。请分别分析T·R与R·T的世界中心位置和计算步骤,并建议我要打印哪些数值进行核验;不要直接重写完整程序。 ### AI建议摘要 AI确认: - T·R 中平移矩阵在最左侧(最后作用于顶点),所以原点经 R 后仍为 (0,0,0),再被 T 推到 (2,0,0)。 - R·T 中平移矩阵在右侧(先作用),原点先被 T 推到 (2,0,0),再被 Ry(90°) 映射为 (0,0,-2)。 - 建议在状态栏同时打印"手算预测值"和 `c.point(model,0,0,0)` 的实际值,逐组参数做差;并建议把 θ 设为 0°、90°、180° 三组对照。 ### 我的判断与手算 采纳 AI 的分析。手算过程与我先验预测一致: - θ=0°:cos0=1, sin0=0,M1=(2,0,0),M2=(2,0,0),两者重合。 - θ=90°:cos90=0, sin90=1,M1=(2,0,0),M2=(0,0,-2)。 - θ=180°:cos180=-1, sin180=0,M1=(2,0,0),M2=(-2,0,0)。 ### 我实际测试的参数与坐标 | 测试组 | tx | θ | 预测 M1=T·R·S | 预测 M2=R·T·S | |---|---:|---:|---|---| | 默认 | 2 | 60° | (2.00, 0.00, 0.00) | (1.00, 0.00, -1.73) | | 90°测试 | 2 | 90° | (2.00, 0.00, 0.00) | (0.00, 0.00, -2.00) | | 0°对照 | 2 | 0° | (2.00, 0.00, 0.00) | (2.00, 0.00, 0.00) | ### 运行现象/数值结果 在状态栏同时输出预测值与 `c.point()` 实际值: - θ=60°:M1 实际=(2.00, 0.00, 0.00),M2 实际=(1.00, 0.00, -1.73),与预测完全一致。 - 点"一键设置90°测试":暖色立方体停在 X 轴正方向 (2,0,0),青色立方体停在 Z 轴负方向 (0,0,-2),两个立方体明显错开。 - θ=0°:两个立方体重合在 (2,0,0),验证了"θ=0° 时两序相同"只是特例。 ### 修正结论 矩阵乘法不满足交换律。先转身再走两步 vs 先走两步再转身,终点不同;θ=0° 的重合不能作为可交换的反例。根本原因是:在 T·R·S 中平移发生在旋转之后(沿世界轴),在 R·T·S 中平移向量本身被旋转带到了新方向。 ## 协作2:程序调试(Task C或D) ### 错误现象与自己的初步分析 现象:在 Task D 中,模板初始代码里 `tipPose = c.T(0,2.2,0)` 是独立写的,没有继承 `shoulderPose`。运行后虽然探头画出来了,但拖动基座 yaw 时,探头不跟着基座转;拖动肩部 pitch 时,探头也不跟着臂走,而是固定在世界坐标 (0,2.2,0) 附近。 初步分析:我怀疑是 tipPose 没有用 `chain(shoulderPose, ...)` 继承父位姿,导致探头脱离了父子链。但不确定是否还有其他原因(比如 Rz 写成绕世界Z轴、非均匀缩放污染等)。 ### 提示词 > 我的三维对象能显示,但修改父关节角度后探头位置异常。请提出三个最有可能的矩阵顺序或局部坐标错误,每个错误给出一项能区分原因的测试,不要直接替我重写整份代码。 ### AI提出的可能原因 AI列出三个常见错误: 1. **把臂段的非均匀缩放 S(.38,2.2,.45) 放进了 tipPose**:会导致探头被拉成细长条,形状异常而不是位置异常。测试:观察探头形状是否正常。 2. **tipPose 直接用 c.T(0,2.2,0) 而没有继承 shoulderPose**:会导致探头固定在世界坐标 (0,2.2,0),不随父关节运动。测试:打印 shoulderPose 与 tipPose 作用下局部原点的世界坐标,看两者是否保持 2.2 的臂长距离。 3. **Rz(pitch) 写成绕世界Z轴而不是肩部局部Z轴**:会导致臂的俯仰方向错误(绕世界原点而不是肩部转)。测试:固定 yaw=0,拖 pitch,观察基座位置是否漂移。 ### 我逐项完成的测试 - 测试1(形状):观察探头,形状是正常的小方块,没有被拉长 → 排除原因1。 - 测试2(父子继承):在状态栏打印 `c.point(shoulderPose,0,0,0)` 和 `c.point(tipPose,0,0,0)`。发现 shoulderPose 在 yaw=30°,pitch=-25° 时是 (0,-0.75,0),而 tipPose 是 (0,2.2,0)——两者之间没有跟随关系,tipPose 不随 shoulderPose 变化 → 确认原因2。 - 测试3(旋转轴):固定 yaw=0,拖 pitch,基座位置不动 → 排除原因3。 ### 真实原因与修复 真实原因:`tipPose` 写成了独立的 `c.T(0,2.2,0)`,没有继承 `shoulderPose`,导致探头脱离父子链。 修复:改为 `tipPose = c.chain(shoulderPose, c.T(0,2.2,0))`。修复后 yaw=30°,pitch=-25° 时末端世界坐标为 (0.81,1.24,-0.46),与手算一致;拖 yaw 探头随基座整体转,拖 pitch 基座不动、探头随臂俯仰。 ### AI建议是否采纳及理由 全部采纳。AI 给出的三个测试方法(看形状、打坐标、固定一个变量)都很有效,特别是"打印两个关节位姿作用下局部原点的世界坐标"这一项,直接定位了父子链断裂的问题。AI 没有直接给我代码,而是给了诊断方法,让我自己定位,这比直接改代码更能理解矩阵继承的原理。 ## 协作3:主题场景协商(Task E) ### 我希望实现的对象关系 目标:把实验中已经掌握的三种变换机制(T·R·S 复合变换、绕指定点 P 旋转、父子层次变换)整合到一个三维场景里,至少 3 个可区分部件、1 组父子关系、2 种复合机制、2 个独立参数。 ### 关键提示词 > 我已实现T·R·S、绕指定点旋转和两级父子变换。请提出两个可在40分钟内用简单立方体完成的三维联动场景,并比较部件关系、矩阵链、交互参数、验证难度。请复用现有WebGL2框架,不引入相机拾取、光照或外部库,也不要直接生成整套代码。 ### AI提供的两个方案与比较 | 维度 | 方案A:医学设备定位+旋转样本台 | 方案B:行星—卫星系统 | |---|---|---| | 部件关系 | 左侧基座→臂→探头(父子链);右侧样本自转+标记公转 | 太阳静止、行星自转+绕太阳公转、卫星绕行星公转(三级父子) | | 矩阵链 | 2段:父子链 + 自转/公转 | 3段:太阳位姿 + 行星父子 + 卫星父子 | | 交互参数 | yaw、pitch、speed(3个) | 行星角速度、卫星角速度、轨道半径(3个) | | 验证难度 | 低:与 Task D 代码复用度高,可直接搬 | 中:需要校准三级坐标,容易出现卫星位置漂移 | | 40分钟可完成度 | 高 | 中 | ### 我的选择理由 选择方案A。理由: 1. Task D 已经写过基座—肩—探头的两层父子链,代码可以直接复用,节省时间。 2. 右侧样本自转 + 标记公转正好覆盖 Task C 的两种旋转机制(自转 + 绕点公转),与前面任务形成闭环。 3. 验证简单:拖 yaw 看探头跟随,拖 pitch 看基座不动,改 speed 看右侧旋转速度,容易出对照数据。 ### 实际矩阵链与交互参数 矩阵链: - 左侧父子链:`basePose = T(-2,-1.3,0)·Ry(yaw)` → `shoulderPose = basePose·T(0,.55,0)·Rz(pitch)` → `tipPose = shoulderPose·T(0,2.2,0)` - 右侧样本自转:`specimen = T(P)·Ry(spinAngle)·S` - 右侧标记公转:`orbitMarker = T(P)·Ry(orbitAngle)·T(1.16,.28,0)·S(.22)` 交互参数:yaw(基座偏航)、pitch(臂俯仰)、speed(样本旋转倍率)。 ### 两组对照测试 **测试1:父子继承验证** - 固定 pitch=-20°,拖 yaw 从 0° 到 90°:左侧基座、臂、探头一起绕Y轴转,右侧样本台不动。末端世界坐标从 (-1.32,1.32,-0.32) 连续变化,证明探头随基座运动。 - 固定 yaw=25°,拖 pitch 从 -60° 到 +60°:基座位置不动,臂绕肩部俯仰,探头跟着臂端走。 **测试2:自转与公转区分** - 暂停动画(speed=0 或点暂停):右侧样本和标记都静止。 - 改 speed=0.5×:样本自转和标记公转变慢;改 speed=3×:变快。 - 观察轨迹:样本绕自己中心转(中心不动),黄色标记绕样本画圆(中心在样本处),两者轨迹不同,证明不是简单复制顶点。 ### 最终结果和反思 最终场景包含 6 个部件(基座、机械臂、探头、样本台、样本、环绕标记)、2 组父子关系、3 种变换机制(父子关节继承、样本自转、标记绕点公转)、3 个独立参数(yaw/pitch/speed),全部满足实验要求。 反思:与教师示例相比,我新增了右侧样本台的独立自转和环绕标记公转,使场景同时包含"父子层次"和"绕点旋转"两种机制,而不只是 Task D 的简单复制。关键收获是:位姿矩阵(basePose/shoulderPose/tipPose)只传位置和朝向,非均匀缩放只放在绘制矩阵里;每帧从参数重建矩阵而不是累加旧矩阵,避免了漂移。