AI 协作日志
学生 Web 实验作品平台
学号:202412211402018 · 来源:ai-log.md
# 实验四 AI协作记录 > 学号:202412211402018 > 姓名:李书瑶 > AI工具与使用版本(如适用):豆包 ## 协作1:变换次序核验(Task B) ### 我的目标与先验预测 Task‑A目标(TODO A1、A2): 完成复合变换代码,验证局部原点经过model矩阵变换之后的世界坐标。 预测:在本框架c.chain调用规则下,传入chain最右侧矩阵最先作用顶点;旋转、缩放不会改变模型中心点,中心点由平移参数决定。 测试用例:tx=1,ty=0,tz=0,angle=90度,scale=1,预测模型世界中心=(1.00, 0.00, 0.00)。 Task‑B目标(TODO B1‑B4): 验证矩阵相乘不具备交换性。 设置平移tx=2,绕Y轴旋转90度,缩放s=1。 我预测: - 先旋转后平移和先平移后旋转,得到物体位置不一样。 不能仅依靠肉眼画面,需要调用c.point()读取局部原点变换后的世界坐标做定量核验。 ### 关键提示词 > 在WebGL2的列向量约定下,局部原点为(0,0,0),平移(2,0,0),绕Y轴旋转90°。请分别分析T·R与R·T的世界中心位置和计算步骤,并建议我要打印哪些数值进行核验;不要直接重写完整程序。 ### AI建议摘要 1. 本框架c.chain(A,B,C)代表矩阵相乘,列向量规则:传入chain最右侧的矩阵会最先作用到顶点。 2. 先旋转再平移:先对局部模型做旋转,之后整体平移,平移向量不受旋转矩阵改变。 3. 先平移再旋转:先执行平移得到局部点,再执行旋转,平移向量会被旋转改变坐标。 4. 核验手段:使用c.point(model,0,0,0)获取局部原点变换后的三维世界坐标,读取页面状态栏输出作为证据。 5. 修改模型姿态只需要更新model矩阵,不需要重新上传GPU顶点缓冲区。 ### 我的判断与手算 Task‑A(TODO A2思考记录): 手算:局部原点(0,0,0)经过平移、旋转、缩放变换之后,中心点等于平移参数。旋转和缩放只会改变立方体姿态大小,不会移动中心点。 Task‑B(TODO B3、B4思考记录): 手算: - 先平移后旋转,局部原点变换得到世界坐标(2, 0, 0) - 先旋转后平移,局部原点变换得到世界坐标(0, 0, -2)。 当angle=0度,旋转相当于单位矩阵,两种情况输出结果一样,但这不代表矩阵可以交换,只是旋转没有效果。 画面视觉效果只能作为参考,坐标数值才是验证矩阵正确性的证据。 ### 我实际测试的参数与坐标 Task‑A测试参数:tx=1,ty=0,tz=0,angle=90°,scale=1; Task‑B测试参数:tx=2,angle=90°,scale=1,点击页面“一键90°测试”按钮。 ### 运行现象/数值结果 Task‑A:状态栏模型中心输出 (1.00, 0.00, 0.00);修改scale缩放,中心点坐标保持不变,符合预测。 Task‑B:状态栏输出: - T·R·S中心:(2.00, 0.00, 0.00) - R·T·S中心:(0.00, 0.00, -2.00) 两个立方体空间位置明显区分;当angle=0度两者位置重合。 ### 修正结论 4×4几何变换矩阵乘法不满足交换律。变换顺序调换,空间结果完全不同;旋转会对已经完成的平移向量产生变换。做实验不能只看画面,应当选取测试点读取变换后的世界坐标完成定量验证。 ## 协作2:程序调试(Task C、Task D) ### 错误现象与自己的初步分析 现象1:Task‑C动画转速异常飞快,物体高速旋转。页面HTML speed输入框标签写“动画速度(度/秒)”。 我的初步猜想:dt时间计算出错 / chain顺序写错 / speed参数理解错误。 现象2:Task‑D机械臂层次调试(TODO D4、D5思考): 需要思考:非均匀缩放如果传给子关节会带来什么后果;测试验证父子变换规则:父运动带动子部件,子部件变换不会影响父部件。 现象3(Challenge挑战题):三自由度机械臂部件互相断开,关节marker不在杆件接缝,部件错位分离;同时Challenge页面status状态栏一直显示“初始化中…”,关节坐标无法刷新。 初步猜想:矩阵继承逻辑错误、平移距离数值错误、JS变量作用域问题。 ### 关键提示词 > 我的三维对象能显示,但修改父关节角度后探头位置异常。请提出三个最有可能的矩阵顺序或局部坐标错误,每个错误给出一项能区分原因的测试,不要直接替我重写整份代码。 ### AI提出的可能原因 1. 位姿pose矩阵混入非均匀缩放并传给子对象,子空间被拉伸扭曲;测试:对比yaw=0度与yaw=90度关节marker坐标。 2. 矩阵chain相乘顺序颠倒;静态给定90度角度,对比理论位置和实际物体位置。 3. UI读取DOM控件语义理解错误,参数错误放大;JS变量作用域错误,内部定义变量外部无法访问;几何平移混淆半长与杆件总长度,造成机械臂杆件错位分离。 ### 我逐项完成的测试 1. Task‑C测试验证: 设置P=(0,0,0),angle=90度进行静态测试,观察自转立方体、公转立方体位置是否符合理论预期。 动画部分调试:打印读取到的speed值,发现输入框本身单位就是度每秒,我错误额外乘了60,角速度被放大,导致物体飞转。修复后使用dt做时间增量,playing变量控制暂停,角度对360取模,旋转一周回到初始位置。 2. Task‑D测试验证(D4、D5思考与测试): 思考:如果把非均匀缩放放入pose位姿矩阵并且传给子关节,子对象局部坐标系会被拉伸变形。缩放只能写在绘制矩阵,只用于渲染当前物体,不能传给子节点。 手动测试:调节yaw,基座、大臂、探头全部跟随转动;调节pitch,基座保持不动,大臂和探头运动。验证父子变换规则:父带动子,子不影响父。 3. Challenge调试: - 问题1:关节点坐标变量写在scene.frame回调内部,draw函数外部访问不到,状态栏无法更新文字。 - 问题2:几何尺寸混淆:立方体半长用于绘制摆放,杆件完整总长用于定位下一个关节;平移数值写错,杆件之间出现缝隙断开。 ### 真实原因与修复 1. Task‑C:误解speed输入框语义,额外乘以倍率,转速爆炸;修复后直接读取speed作为角速度,增加异常数值防护。暂停、旋转归位功能全部正常。 2. Task‑D:严格区分pose位姿矩阵(只存平移旋转,可以传给子)和draw绘制矩阵(带缩放,仅渲染)。手动测试现象符合层次变换预期。 3. Challenge: - 将关节点坐标计算移到scene.frame外部,解决状态栏变量访问问题。 - 修改平移距离:绘制立方体使用半长,寻找下级关节使用杆件完整总长。归零姿态杆件紧密拼接,marker落在关节接缝。 ### AI建议是否采纳及理由 部分采纳。AI给出多维度排查方向,帮助区分矩阵逻辑bug、参数语义bug、JS作用域bug、几何尺寸bug。没有直接复制完整代码,自己逐项测试定位问题,手动修改并验证每一项修复后的现象。 ## 协作3:主题场景协商(Task E) ### 我的目标与预测 需要至少3个三维部件,一组真实父子继承关系,两种复合变换机制;具备独立可调参数,动画暂停调速、截图保存PNG。 参考模板:医疗定位装置,基座‑机械臂‑探头父子层次;右侧样本台物体自转,标记绕样本中心做公转。 ### 关键提示词 > 我已实现T·R·S、绕指定点旋转和两级父子变换。请提出两个可在40分钟内用简单立方体完成的三维联动场景,并比较部件关系、矩阵链、交互参数、验证难度。请复用现有WebGL2框架,不引入相机拾取、光照或外部库,也不要直接生成整套代码。 ### AI提供的两个方案与比较 方案1:行星‑卫星系统。太阳为中心,行星继承太阳位姿,卫星继承行星位姿;行星自转,卫星公转。 优点:变换逻辑清晰;缺点:需要从零搭建全部矩阵链,各个天体坐标需要手动验证,开发工作量大。 方案2:医学定位机械臂+样本台。复用Task‑D已经调试正确的基座‑肩部‑探头两级父子;增加样本自转、标记绕样本点公转。 优点:大量复用D经过验证的层次变换代码,开发时间短;同时演示父子层次变换、绕世界指定点公转两种实验要求变换;交互参数yaw、pitch、speed,验证简单。 缺点:模型全部使用立方体,没有复杂外形。 ### 我的选择理由 选择方案2(医学定位机械臂+样本台)。 理由: 1. 同时覆盖实验硬性要求:父子继承、物体自转、绕点公转; 2. 复用Task‑D已经验证正确的位姿矩阵代码,减少引入新bug; 3. 满足条件:大于3个部件,2组独立调节参数,支持暂停调速、PNG截图。 ### 两组对照测试 测试组1:yaw=0,pitch=0。 现象:机械臂竖直向上;样本原地自转,标记围绕样本画圆;父基座不动,子探头位置正确。 测试组2:yaw=45,pitch=-30。 现象:基座整体旋转45度,机械臂俯仰向下;探头跟随基座与肩部一起运动;样本自转不受机械臂影响;标记公转轨迹不变。 ### 最终结果和反思 E6要求记录场景方案与测试结果:本场景为医疗定位装置+旋转样本台;包含父子关节、物体自转、物体绕点公转;两组对照测试如上,截图按钮可以正常导出图片。 运行结果符合预期:父对象运动会带动全部子部件,子对象局部变换不会改变父对象。样本自转、标记公转两套变换独立运行。 反思:层次变换中,pose位姿矩阵只能传递平移和旋转;非均匀缩放只能写在绘制矩阵,严禁传给子关节;每帧必须由原始参数重新构造矩阵,不能矩阵累加,防止位置漂移。 ## 附加:Challenge三自由度机械臂 ### 拓展目标 在Task‑D两自由度机械臂基础增加肘关节,实现三级父子层次:基座 →大臂 →肘关节 →小臂‑探头。 预期行为:yaw转动会驱动全部部件;pitch只驱动大臂以及下级部件;elbow只驱动小臂与探头,基座、大臂保持不动;marker标记三处关节,状态栏输出关节世界坐标。 ### 遇到的问题与调试过程 1. JS变量作用域问题:关节点坐标写在frame回调内部,外部拿不到数值,状态栏文字无法刷新。 2. 几何摆放错误:混淆立方体半长与杆件总长度,平移数值写错,各个杆件互相分离,关节marker不在接缝。 ### 测试现象 归零yaw=0、pitch=0、elbow=0,机械臂竖直完整拼接;拖动elbow,仅小臂绕肘关节marker旋转;父关节不会被子关节影响。各个marker标记正好落在杆件接缝位置,状态栏正常输出关节世界坐标。