AI 协作日志
学生 Web 实验作品平台
学号:202312211503020 · 来源:ai-log.md
# 实验四 AI协作记录 > 学号: 202312211503020 > 姓名: 陶依宁 > AI工具与使用版本(如适用): deepseek > 请用真实过程填充,保留关键提示词原文;不要只贴整段AI代码或聊天截图。 ## 协作1:变换次序核验(Task B) ### 我的目标与先验预测 核验列向量约定下 T·R·S 与 R·T·S 的世界中心差异。先验预测:tx=2、θ=90°、s=1 时,M1=T·R·S 中心为 (2,0,0);M2=R·T·S 中心为 (0,0,-2)。 理由:S、R 不改变原点,T·R·S 最后平移故中心=(tx,0,0);R·T·S 先平移到(tx,0,0) 再被 Ry(90°) 旋转到 (0,0,-tx)。 ### 关键提示词 "在 WebGL2 的列向量约定下,局部原点为 (0,0,0),平移 (2,0,0),绕 Y 轴旋转 90°。请分别分析 T·R 与 R·T 的世界中心位置和计算步骤,并建议我要打印哪些数值进行核验;不要直接重写完整程序。" ### AI建议摘要 AI 指出矩阵从右往左作用:T·R 中 R 先转(原点不动),T 后平移 → 中心 (2,0,0);R·T 中 T 先把原点移到 (2,0,0),R 再绕 Y 转 90°,(x,0,z)→(0,0,-x) → 中心 (0,0,-2)。建议用 CG4.point(M,0,0,0) 打印两中心,并用"一键90°"固定参数对照。 ### 我的判断与手算 与我的先验预测一致,采纳其"打印两中心做数值核验"的建议。 手算:Ry(90°) 将 (2,0,0) 变为 (0,0,-2),故 M2 中心 (0,0,-2)。 ### 我实际测试的参数与坐标 点击"一键设置90°测试":tx=2、angle=90、scale=1、show=both。 ### 运行现象/数值结果 状态栏显示:T·R·S中心:(2.00, 0.00, 0.00) | R·T·S中心:(0.00, 0.00, -2.00);画面两立方体中心分离,与手算一致。 ### 修正结论 T 与 R 不可交换:R·T 会把平移量本身旋转,T·R 不会。θ=0° 时两者相同仅因旋转退化为单位阵,是特例,不能证明可交换;θ=90° 的不同即为反例。 ## 协作2:程序调试(Task C或D) ### 错误现象与自己的初步分析 现象:绕点旋转中物体只绕原点自转,未绕指定点 P 公转,P 改变时轨迹几乎不变。初步怀疑绕点矩阵中平移与旋转的次序/正负写错,尤其 T(-P) 的位置。 ### 提示词 "我的三维对象能显示,但修改父关节/旋转中心后探头或物体位置异常。请提出三个最有可能的矩阵顺序或局部坐标错误,每个错误给出一项能区分原因的测试,不要直接替我重写整份代码。" ### AI提出的可能原因 1. T(-P) 与 T(P) 位置颠倒,写成 T(-P)·R·T(P),退化为"绕原点转后整体平移"; 2. 漏写 T(-P) 或 T(P),只做了平移/只做了旋转; 3. P 与 q 不在同一世界坐标系(把局部偏移当成世界坐标)。 ### 我逐项完成的测试 - 测试1:把 orbitModel 临时写成 T(P)·R·T(-P)·T(q)·S,P=(0,0,0)、θ=90°,读 c.point(orbitModel,0,0,0),期望约 (0,0,-2)。 - 测试2:故意改成 T(-P)·R·T(P)·T(q)·S,观察中心是否偏移、P 是否仍固定。 - 测试3:把 P 设为 (1,0,0) 与 (0,0,1),比较轨迹是否始终绕 P。 ### 真实原因与修复 按测试2复现:写成 T(-P)·R·T(P) 时物体整体偏移、P 不再是固定中心;恢复为 T(P)·R·T(-P)·T(q)·S 后,P=(0,0,0)、θ=90° 中心约 (0,0,-2),P 固定不动,轨迹正确。 真实原因是 T(-P) 与 T(P) 位置放反(等价于"先绕原点转再平移")。 ### AI建议是否采纳及理由 采纳"位置颠倒"这一原因及其区分测试;未让 AI 直接改代码,自行修复并复测通过。 理由:该测试能同时区分三类可能,且改动可恢复、可复现。 ## 协作3:主题场景协商(Task E) ### 我希望实现的对象关系 用简单立方体在 40 分钟内做三维联动场景,必须含 ≥3 可区分部件、≥1 组真父子关系、≥2 种复合变换机制、≥2 个独立参数,复用现有 WebGL2 框架,不引入相机拾取/光照/外部库。希望同时体现"父子继承"与"绕点旋转"两类考点。 ### 关键提示词 "我已实现 T·R·S、绕指定点旋转和两级父子变换。请提出两个可在 40 分钟内用简单立方体完成的三维联动场景,并比较部件关系、矩阵链、交互参数、验证难度。请复用现有 WebGL2 框架,不引入相机拾取、光照或外部库,也不要直接生成整套代码。" ### AI提供的两个方案与比较 方案一:医学设备定位台——基座(yaw)→肩部(pitch)→探头父子链,右侧样本台自转 + 标记绕样本中心公转。矩阵链含父子关节、自转、公转三种机制。 方案二:行星—卫星系统——行星自转,卫星 T(行星)·R(公转)·T(半径),可加二级卫星。矩阵更短,但主要是"自转+公转",父子关节较弱。 比较:方案一机制更全、易验证"父动带子/子动不改父";方案二简洁但考点覆盖少。 ### 我的选择理由 采纳方案一。本实验核心是父子继承与绕点旋转,方案一两者兼有,便于用yaw/pitch 两组控制变量做继承验证;只取 AI 的结构与矩阵链思路,代码自行实现。 ### 实际矩阵链与交互参数 basePose = T(-2,-1.3,0) · Ry(yaw) shoulderPose = basePose · T(0,.55,0) · Rz(pitch) tipPose = shoulderPose · T(0,2.2,0) specimenDraw = T(samplePivot) · Ry(elapsed*65) · S(.7,.78,.7) orbitMarker = T(samplePivot) · Ry(elapsed*42) · T(1.16,.28,0) · S(.22) 交互参数:yaw、pitch 独立可调;speed 控速;暂停/继续;重置;PNG 截图。 ### 两组对照测试 第一组固定动画时间 elapsed=0,只改关节角:yaw=0、pitch=0 时各部件竖直装配,样本与标记处于初始角度;把 yaw 调到 90°、pitch 仍为 0,基座带着机械臂和探头整体绕 Y 轴转 90°,右侧样本区保持不动;再固定 yaw、把 pitch 调到 -40°,基座静止,机械臂与探头摆动且探头始终接在臂端——这组验证了"父运动带动子、子运动不改变父"的层次继承关系。 第二组测试动画与交互:暂停 2 秒画面保持,继续后无突跳;把 speed 从 1× 调到 2×,样本自转(65°/s)与标记公转(42°/s)同时加快,但两者轨迹仍明显不同,证明是矩阵机制而非直接改顶点;最后保存 PNG,打开非空白且尺寸与 Canvas 内部尺寸一致——这组验证了动画控制、速度参数与截图功能均符合要求。 ### 最终结果和反思 六项必需条件全部满足;样本自转(65°/s)与标记公转(42°/s)轨迹不同,证明用的是矩阵机制而非改顶点。调试中发现 E5 曾把 R 写在半径平移右侧,导致只自转不公转,改为 T(center)·R·T(radius) 后正确——再次印证"右侧先作用、绕点须先平移到中心再旋转"。 AI 的价值在于提供结构与排查清单,实际矩阵与验证仍须自己动手跑。 **思考:** 为什么M=T·R·S在列向量约定下最先执行S?改变模型位置是否需要重新上传GPU顶点数据? 列向量约定下顶点变换为 v' = M·v = (T·R·S)·v = T·(R·(S·v)),括号决定最内层 S·v 最先发生,故矩阵乘法从右往左作用,S 先执行;改变模型位置也不需要重传顶点数据,因为几何顶点(局部坐标)在缓冲区中一次上传后固定不变,位置信息由每帧重新计算的 Model 矩阵以 uniform 形式传入,顶点着色器用 P·V·M·position 对同一批顶点做变换,移动物体只是换了矩阵而非改顶点,这正是“几何数据与位姿分离、不应改写原始顶点、不逐帧重传几何”的原因。 **思考:** theta=0°时两种结果可能相同,是否能够据此证明矩阵乘法可交换? 不能。θ=0° 时旋转矩阵是单位阵,M1=T·I·S 与 M2=I·T·S 都退化为 T·S,结果相同只说明"在旋转为零这一特例下恰好相等",并不能证明一般情形下 T 与 R 可交换;可交换的定义要求对任意矩阵都满足 AB=BA,而只要举出一个反例即可否定——Task B 中 θ=90°、tx=2 时 M1 中心为 (2,0,0)、M2 中心为 (0,0,-2),结果不同,就证明 T 与 R 不可交换(R·T 会把平移量本身旋转,T·R 不会)。所以 θ=0° 的相同只是退化特例,不能作为可交换的证据。 **思考:** 为什么要先把P移到原点、旋转后再移回去?如果T(-P)与T(P)位置放错会怎样? Ry(θ) 只能绕世界原点转,要绕任意点 P 转,就用 T(-P) 把 P 移到原点,旋转即等价于绕 P 转,再用 T(P) 移回,即 T(P)·R·T(-P)。 写成 T(-P)·R·T(P) 就变成"绕原点转后再整体平移 -P",物体轨迹偏移、P 不再是固定中心,验收的 (0,0,-2) 对不上;漏掉或错位平移则退化为绕原点公转或只平移不转。 **思考:** 若直接把臂段的纵向缩放传给探头,会出现什么异常?怎样区分“父关节位姿”和“部件绘制矩阵”? 臂段是非均匀缩放 S(.38,2.2,.45),探头继承后会被沿 Y 拉长、X/Z 压扁,形状扭曲,且缩放沿父子链累积,连接位置也算错。缩放只能留在部件自己的绘制矩阵里。 父关节位姿只含平移+旋转(如 Mshoulder=Mbase·T(0,h,0)·Rz(pitch)),描述关节在哪、朝哪,传给子级继承;部件绘制矩阵是位姿再乘局部平移和缩放(如 Marm=Mshoulder·T(0,L/2,0)·S(w,L,d)),只用于画该部件,不外传。