由两段固定长度组成的手臂,末端不能够到平面上的任意点。先判断目标距离,再计算可能的肘部位置,可以把可达性和选择弯曲方向分开处理。
先把规则写清楚
根部在原点,长度分别为L1与L2,目标距离为d。只有两长度差的绝对值不大于d且d不大于两长度之和时可达。目标方向上肘部投影距离a为(L1平方减L2平方加d平方)除以2d,垂直偏移h为L1平方减a平方的平方根。
本例输入与推演结果
七组独立骨骼长度与目标位置。原点重合、边界重合和一般两解情况分别记录。
长度、目标 | 状态 | 肘部坐标 {'lengths': [2, 2], 'target': [0, 0]} | 无限多个 | [] {'lengths': [6, 3], 'target': [9, 0]} | 边界重合 | [[6.0, 0.0], [6.0, 0.0]] {'lengths': [8, 2], 'target': [6, 0]} | 边界重合 | [[8.0, 0.0], [8.0, 0.0]] {'lengths': [6, 8], 'target': [5, 6]} | 两个候选 | [[-2.961696, 5.21808], [5.666614, -1.972178]] {'lengths': [2, 8], 'target': [-11, -5]} | 不可达 | [] {'lengths': [3, 7], 'target': [-7, 12]} | 不可达 | [] {'lengths': [5, 4], 'target': [-2, 9]} | 不可达 | []这里的编号只用来辨认本例中的对象,不能当成另一份记录里的固定身份。阅读表格时先找到输入,再顺着运算顺序对照输出;空列表、零值和不存在的结果有不同含义,不能混用。表中分数保留精确值,小数显示仅为阅读方便。
怎样自己复核
肘部为目标单位方向乘a,再加或减垂直单位方向乘h。逐个检查根部到肘部距离等于第一段长度、肘部到目标距离等于第二段长度。完全伸直或折叠到边界时,两候选可能重合。
选择正侧或负侧弯曲应保持明确的约定,而不是每帧随机选一个。无解目标可以另行设计投影到可达范围的策略,但投影后的末端已经不在原目标处,必须区分近似展示与真正满足原长度条件的解。
适用范围
目标与根部重合且两段等长时有无穷多个肘部位置,本例单独报告这种退化情况;两段不等长时原点不可达。本例没有关节角限制、障碍、三维扭转或动画平滑,也不自动拉伸骨骼。
本例是一套可复现的游戏机制练习,不依赖具体品牌或某个软件的默认设置。修改任何边界约定、输入参数或操作顺序后,应重新推演并保存中间状态。发现差异时先定位第一处不一致,再判断是规则不同还是计算错误,不要只把最终答案调整到看起来相同。
