AI 协作日志
学生 Web 实验作品平台
学号:202412211401010 · 来源:ai-log.md
# 实验四 AI协作记录
> 学号:202412211401010
> 姓名: 黄诗涵
> AI工具与使用版本(如适用):
> 请用真实过程填充,保留关键提示词原文;不要只贴整段AI代码或聊天截图。
## 协作1:变换次序核验(Task B)
### 我的目标与先验预测
保持相同三维模型、相同T/R/S参数,只改变矩阵相乘次序
### 关键提示词
局部原点(0,0,0),平移 (2,0,0),绕 Y 轴旋转 90°。分别分析 T·R 与 R·T 作用于该原点后的世界坐标,说明打印哪些数值核验;不要直接重写完整程序
### AI建议摘要
chain(A,B,C)=A×B×C,point(model,0,0,0) 等价于 model·(0,0,0,1)。对原点而言 S 与 R 都不移动 0,故 T·R 的结果只由最左侧 T 决定,为 (2,0,0);R·T 先平移再旋转,为 (0,0,-2)。建议用状态栏 centerTRS/centerRTS 读数核验,并对照 θ=0/90/180。
### 我的判断与手算
AI 推导和我的预测一致。关键在对原点作用时旋转不移动原点,差别只来自 T 与 R 先后。
### 我实际测试的参数与坐标
tx θ s 状态栏 M₁ 中心 状态栏 M₂ 中心
2 90° 1 (2.00, 0.00, 0.00) (0.00, 0.00, -2.00)
2 0° 1 (2.00, 0.00, 0.00) (2.00, 0.00, 0.00)
2 180° 1 (2.00, 0.00, 0.00) (0.00, 0.00, 2.00)
### 运行现象/数值结果
点击“一键设置 90°测试”后,暖色立方体(M₁)在 +X 侧,青色立方体(M₂)在 -Z 侧,与状态栏读数一致,画面位置差异明显。
### 修正结论
确认 T·R ≠ R·T
## 协作2:程序调试(Task C或D)
### 错误现象与自己的初步分析
打开 task-c.html 后画面全白,网格、坐标轴都不显示,状态栏停在初始化中
### 提示词
我的 WebGL2 页面白屏,canvas 全白、连网格都不画,状态栏没更新。文件路径和 WebGL2 支持已确认正常。请列出三个最可能的 JS 侧原因(尤其语法/作用域/括号配对),每个给一项能快速区分的测试,不要直接重写整份代码。
### AI提出的可能原因
语法错误:c.loop(function(dt){...}, draw) 括号/花括号未配平,脚本解析失败,全部不执行。测试:Console 看有无 SyntaxError。
加载顺序错:task-c.js 先于 engine.js 加载 → CG4 is not defined。测试:Console 输入 typeof CG4。
DOM 选择器为空:c.num("speed") 返回 null 报错。测试:document.getElementById('speed')。
### 我逐项完成的测试
Console 报 Uncaught SyntaxError: Unexpected token '}',指向 c.loop 结尾 → 命中原因 1。
typeof CG4 返回 "object" → 加载顺序正常,排除 2。
document.getElementById('speed') 返回 input 元素 → 排除 3。
### 真实原因与修复
c.loop 的 update 回调内,if (playing){...} 的 } 后直接跟 c.el(...),后又出现 }, draw);,造成函数体多一个 }
### AI建议是否采纳及理由
采纳“语法错误”,未采纳直接重写代码,而是自己按括号层级逐层核对
## 协作3:主题场景协商(Task E)
### 我希望实现的对象关系
在示例的“医学设备定位装置+旋转样本台”基础上做实质修改:左侧保留基座→机械臂→探头的父子层次,右侧样本台改为行星—卫星式运动——样本模型绕自身中心自转,指示标记绕样本中心公转,形成两种独立的复合变换机制。
### 关键提示词
实现了 T·R·S、绕指定点旋转和两级父子变换,现在提出两个可在 40 分钟内用简单立方体完成的联动场景,比较部件关系、矩阵链、交互参数、验证难度;复用现有 WebGL2 框架,不引入相机、光照或外部库,也不要生成整套代码。
### AI提供的两个方案与比较
维度 方案一:保留医学装置 + 行星式样本台 方案二:纯行星—卫星系统
部件 基座、机械臂、探头、样本、标记 恒星、行星、卫星、轨道基座
父子关系 基座→机械臂→探头 基座→行星→卫星
复合机制 关节继承 + 自转 + 绕点公转 自转 + 公转
参数 yaw、pitch、speed 公转速度、自转速度
验证难度 中(多级继承 + 公转) 低(中心坐标易算)
### 我的选择理由
选方案一。它复用教师示例的层次结构(基座→机械臂→探头),只需在右侧样本台补全 E4 自转和 E5 公转,改动量小
### 实际矩阵链与交互参数
左侧(层次关节):
基座位姿: basePose = T(-2,-1.3,0)·Ry(yaw)
肩部位姿: shoulderPose = basePose·T(0,.55,0)·Rz(pitch)
末端位姿: tipPose = shoulderPose·T(0,2.2,0)
臂段绘制: armDraw = shoulderPose·T(0,1.10,0)·S(.38,2.2,.45)
探头绘制: probeDraw = tipPose·T(0,.32,0)·S(.73,.65,.73)
右侧(样本台):
样本自转: specimenDraw = T(P)·Ry(spinAngle)·S(.7,.78,.7)
标记公转: orbitMarker = T(P)·Ry(orbitAngle)·T(1.16,.28,0)·S(.22)
其中 P=(2,-.48,0),spinAngle=elapsed*65,orbitAngle=elapsed*42
### 两组对照测试
状态 操作 预期 实际
对照1 固定 yaw=25°,改 pitch 从 -20° 到 20° 基座静止,臂与探头跟随 基座世界坐标不变,探头跟随 ✓
对照2 固定 pitch,改 yaw 从 0° 到 60° 全部子部件随基座整体旋转 肩部、末端坐标同步旋转 ✓
对照3 暂停 2 秒后继续 spinAngle/orbitAngle 不跳变 无跳变 ✓
对照4 speed 改 2×,观察标记轨迹 标记公转加快,样本自转加快,两者轨迹半径不变 符合 ✓
### 最终结果和反思
可以运行,左侧基座偏航带动机械臂与探头,肩部俯仰只影响臂与探头;右侧样本自转与标记公转轨迹不同,暂停/继续无突跳,截图非空
反思:①一开始 E5 公转误写成 T(P)·Ry·T(r,0,0) 漏了半径平移的先后,标记绕原点而非样本转,靠对照1 中标记中心坐标发现;
②自转与公转必须用各自独立的角度变量,如果共用一个 elapsed 系数两运动会耦合;
③父子继承只传位姿 shoulderPose,不传 armDraw,否则探头会被臂段拉伸变形
**思考A:** 为什么M=T·R·S在列向量约定下最先执行S?改变模型位置是否需要重新上传GPU顶点数据?
从右边开始计算A
不用重新上传
**思考B:** theta=0°时两种结果可能相同,是否能够据此证明矩阵乘法可交换?
不能,=0时R=I,任何矩阵都可以交换
**思考C:** 为什么要先把P移到原点、旋转后再移回去?如果T(-P)与T(P)位置放错会怎样?
Ry只会绕原点转
位置互换就会绕-P旋转