学习进度
0/9 已勾只保存在这台浏览器;勾满 9 项即视为本题完成。
先把题目说成人话
角色伸手去抓门把:门把够得着时,手掌虽然碰到了,肘部却可能折进身体;门把超过手臂总长时,手腕本应停在极限位置,若骨头反而像橡皮筋一样变长,还多了一个伸展或缩放问题。让骨链从末端目标反推各关节姿势的方法叫反向动力学(IK);自动脚本要分清长度、弯曲方向、原动画和骨架,不能只追求“手碰到了”。
这是虚构教学故事,不是个人项目经历。
场景:先让问题变得看得见
角色的右手要握住武器。上臂长 0.32 米,前臂长 0.28 米:握把在肩外 0.55 米时,手够得到,肘部却翻进胸口;把握把拖到 0.70 米时,标准定长手臂只能伸到 0.60 米,手应停在极限位置并留下 0.10 米空隙。若画面反而把骨头拉长,说明项目还启用了额外伸展、写入了缩放,或骨架本身已经异常,不能把它算成标准求解器的自然行为。
这两个现象不是同一个故障。前者先查肘该向哪边弯、关节允许转多少和骨头朝向;后者先承认目标超出长度。自动脚本的职责是把两类证据分开,而不是让一个“更强的权重”同时掩盖它们。
(右脑)画面: 右臂像两根首尾相接、长度不会变化的木条。肩膀钉在墙上,手腕要去碰门把;肘旁放着一块小磁铁,轻轻把弯起的肘尖引向身体外侧。门把近时,两根木条可以折成自然的手臂;门把太远时,它们只能拉成一条直线,手腕与门把之间仍留着一小段空隙。若木条反而被拉长,眼前发生的就不再是正常弯曲。
(左脑)对表: 先把两根木条落到肩、肘、腕三个变换节点,并在同一参考空间测量上臂、前臂和肩到目标的距离。肘旁的小磁铁在 Unity Animation Rigging 的 Two Bone IK Constraint 中叫提示点(Hint;通用 IK 语境也常叫 pole vector 或 Pole Target),只决定弯曲平面;原动画先提供起始姿态,反向动力学(IK)再按权重混合。两段长度给出的环形范围只是“忽略关节限制时可能够到”的初步必要条件,随后还必须检查肘角、骨轴和旋转限制。关闭求解器、单独移动 Hint、检查末端残差和绑定姿态,才能分别证明问题来自原动画、配置、坐标还是骨架。
小明:先形成一个完整猜测
小明把 IK 权重调到 1,希望末端贴得更牢。手确实贴住了握把,肘部仍然翻折,而且原动画的预备动作被完全覆盖。
这次失败留下了有用证据:混合权重决定 IK 影响多少原动画,却不决定肘部朝哪,也不会扩大骨链的可达范围。继续调权重不能解释故障来源。
小红:把猜测放回现实检查
小红按动画管线逐层隔离:
- 关闭 IK,检查同一帧原动画。肘部正常,先排除该帧动画本身。
- 保持目标不变,只移动 Hint。肘部平面随它翻转,说明可达目标下的主要问题是弯曲提示方向。
- 把目标从 0.55 米移到 0.70 米。Unity Animation Rigging 的标准 Two Bone IK 没有“迭代次数”参数,它只能旋转定长骨链并留下末端残差;即使换成 CCD、FABRIK 或自定义迭代求解器,增加迭代次数也只能帮助可达解收敛,不能突破 0.60 米上限。若此时骨骼缩放改变,就沿自定义 stretch、Scale Constraint、动画曲线或父级缩放继续追。
- 把目标、极向量和骨骼都换算到同一参考空间;再检查骨骼局部轴、父级非均匀缩放、导入 bind pose 和 twist bone。坐标或骨架一旦异常,就停止自动写回资产。
转折来自检查结果:能通过一个受控参数恢复的,是求解器配置;关闭 IK 后仍然扭曲的,才继续向动画和骨架上游追。
我:用检查结果修正模型
我让校正脚本先做诊断,再决定是否动手。对两段骨链,先计算目标距离 d,并检查 |a-b|≤d≤a+b;超过外侧上限时钳到 a+b,落入内侧不可达区时钳到 |a-b|,两者都显示几何残差而不是缩放骨骼。通过这道长度检查只说明“几何上可能存在解”,脚本还要应用关节角、骨轴和姿势约束;约束后的目标仍可能不可达。只有两层检查都通过,才设置经过验证的 Hint 与混合权重,并记录改前值以便撤销。
安全的自动处理包括:统一坐标空间、限制目标到合法范围、补齐项目规定的极向量、报告未收敛误差。必须停手的情况包括:骨骼层级或 bind pose 错误、非有限数值、未知非均匀缩放、导演有意设计的夸张姿态,以及没有项目规则可判断的 twist 分配。脚本应报出原因和对象路径,让动画师或绑定师决定,而不是永久改坏源资产。
(右脑)画面修正: 小明只是把“让手贴住门把”的力量拧到最大,手掌贴住了,肘尖却仍扎进胸口。小红移动肘旁的小磁铁,近处的门把很快就能以自然姿势握住;换成更远的门把后,两根木条加起来只有 0.60 米,无论怎样反复调整,也碰不到 0.70 米外的目标。这样一看,一个问题是手肘朝错了方向,另一个问题是门把根本够不着;若关闭这套控制后手臂仍然扭曲,就该回头检查木条本身是否装错了。
(左脑)严格对表: 脚本先把骨点、目标和 Hint 变换到同一参考空间,验证有限数、层级、缩放与骨长,再计算 d=|target-shoulder|。若 d>a+b,沿肩到目标的方向把诊断目标钳到 a+b,几何残差为 d-(a+b);若 d<|a-b|,钳到 |a-b|,几何残差为 |a-b|-d。d≈0 时肩到目标的方向退化,脚本只能使用项目已验证的 bind pose 轴或上一合法方向;两者都不存在就停止自动校正并报告。通过长度范围后再应用 Hint、角限制与权重;标准 Two Bone IK 报约束后的几何残差,只有 CCD、FABRIK 或自定义迭代器才另外报告未收敛。关闭 IK 的基线正常、末端误差和关节角均合格、Undo 可恢复且未触发资产异常时,才允许写回。
老师解惑
- IK 只承诺求末端约束,不自动保证整条肢体姿势好看。
- 极向量决定两关节链弯曲平面;关节限制决定哪些解在角色结构上合法。
- CCD、FABRIK 等迭代法受迭代次数和容差影响,但“不可达”不是多迭代几次就会消失。
- 自动校正首先是一套验证器:它应区分无解、未收敛、坐标错误和资产错误。
工具分工
- Unity Animation Rigging:验证约束、权重、目标与多段动画的兼容性。
- Gizmos 调试层:显示可达球、极向量平面、末端误差和被钳制的目标。
- 导入与骨架检查脚本:检查层级、局部轴、缩放和 bind pose;异常时阻止自动写回。
- bezier-ik Lab:观察目标距离、极向量和迭代误差怎样改变解。
记忆钩子
先关 IK 看原姿态,再查极向量和坐标;够不到就报差多少,不要靠拉长骨头假装修好。
这是教学场景,不是目标项目的真实捕获或个人经历。
下一步:验证这条因果
target、Pole、骨轴、关节限位、求解空间、迭代残差与蒙皮层怎样逐项排除。
教学边界:二维教学投影不能替代真实 Animator、三维骨架、SkinnedMeshRenderer、重定向或动画压缩回归。