最开始,角色能够被手脚目标带着向上移动,我觉得已经走通了第一步。但测试后才发现,让其他手脚留在原来的位置,还需要单独解决。这篇记录了三个版本的约束方案,以及每次是什么问题让我继续往下改。
1. 身体动起来了,已经抓住的手却也被带走了
在 v1 中,我只用 Full Body IK,就能让手脚目标带动身体移动。但测试时我发现,为了让一只手靠近新落点,求解也可能把本该留在原位的另一只手带走。
这对我们的攀爬来说是个问题。玩家已经选好了其他支撑点,不能只顾正在移动的那只手。这是我在当时这套设置中观察到的现象;Full Body IK 的约束处理不能简单归结为固定的先后顺序。
2. 给四肢加上约束,再检查抓握过渡
因此在 v2 中,我为四肢分别加入 Basic IK,在 Full Body IK 求解后,把手脚拉回各自的目标位置。这样,我就能更直接地控制每一个接触点。
但新问题又出现了。从 Candidate 进入确认抓握的过程中,权重发生变化,肢体可能被突然拉过去,产生不自然的“瞬移感”。手脚有了约束之后,身体的位置也需要一个明确的限制:它到底还能离这些锁点多远?
3. 再给骨盆的位置加一层限制
所以我想,一只手或脚真要被身体拽走,也会牵涉到肩或髋的位置。既然会经过骨盆这一关,只要对骨盆的位置进行限制,就可以曲线救国,给已经建立的接触再加一层保护。
到了 v3,我加入 ConstrainBodyToLockedLimb。对每条受到约束的肢体,比较肩或髋到锁定目标的距离,以及这条肢体实际能够到达的长度。距离超出上限时,就按超出的部分,把骨盆向锁点拉近;已经选定的接触点保持不变。
交互原理演示
锁点不动,身体继续移动。
拖动肩部,观察身体如何被限制在可达范围内。
肩部将超出肢体的可达范围。此时向锁点方向修正身体,让接触点保持在原位。
这是单条肢体可达范围约束的简化示意,并非 Unreal Engine 中的实时求解。
四肢的 IK 把手脚带回目标,身体修正则限制肩或髋能离锁点多远。也就是说,在四肢限制之外,我又给骨盆上了一层保险。