移动施法的动画分层
移动施法的动画分层
- 动画分层是指:当你希望《使命召唤》里的士兵一边奔跑一边换弹而不会跳帧时所用的技术。你可以在骨盆及以下部位播放奔跑动画,同时在上半身播放与武器相关的动画。听起来很简单,对吧?但实际操作并不总是那么容易。那如果你想把奔跑和挥剑动作结合起来呢?又或者你希望角色在奔跑和站立状态下都能使用同一套动画,又该怎么办?
- 接下来我将介绍一种方法:角色骨架、实时 IK 和嵌套混合树来解决上述问题
- 为了说明我们的问题,我们首先创建一个 Animator,并设置两个图层:一个用于腿部动画,另一个用于上半身动画。腿部图层通常包含一个用于处理多方向移动的混合树,所以我们会加入这个部分。
- 接着,我们在上半身图层添加一个 Avatar Mask,用来屏蔽腿部,然后在该图层播放一个近战攻击动画。网上有无数教程都是这么做,并且就到此为止,但问题也正是从这里开始显现的。
- 仅仅使用 Avatar Mask 会导致胸部的旋转不正确。
拉直脊柱
- 首先,躯干动画的旋转会出现错误,是因为骨骼层级中位置更高的骨盆旋转不再与技能动画匹配。由于骨盆在 Avatar Mask 中被屏蔽,只受到奔跑动画的影响,因此会影响上层的躯干。
- 为了解决这个问题,我们使用一个参考关节(proxy joint)。这个关节直接作为角色 Root 的子节点,但在 Maya(或 Blender,任选你喜欢的工具)中,它是通过约束绑定到胸部关节上的。
- 这样,在我们从 Maya 或 Blender 导出动画时,这个参考关节会接收到与胸部完全一致的位置和旋转数据,但不会受到骨盆的影响。
- 接下来,在 Unity 的上半身 Avatar Mask 中,我们确保包含这个参考关节,从而为胸部提供一个精确的参考位置。
- 然后我们使用 IK 强制让胸部对齐这个参考关节。这可以通过 Unity Animation Rigging 套件中的 Chain IK Constraint 来实现,或者使用像 FinalIK 的 CCD IK 和 Aim IK 组件。使用哪种方式取决于你,但关键是要确保胸部在每个轴上的旋转都能与参考关节匹配。
旋转臀部
- 下一个问题是,当你播放近战攻击动画时,可能会让角色的脊柱看起来像是被“扭断”了。一次挥剑攻击需要传达出力量与冲击感,但如果你在上半身施加了所需的旋转,而臀部却保持不动,就会导致一个非常不自然(对角色来说可能也很“痛苦”)的脊柱扭曲。
- 我们真正想要的效果是:下半身在不影响双脚落点的前提下,也随着上半身一起进行一定程度的扭转。那我们该怎么做呢?
想象一下:你的角色正在向前跑,同时进行一次挥砍,动作中胸部已经扭向了右侧,为了支撑这个动作,骨盆也需要向右旋转,但双脚仍然要保持向前奔跑。看起来,这个姿态可能就像是在向左侧移动,但实际上那个“左”就是角色当前的正前方(参考 GIF)。
想象一个用于侧向移动的普通二维混合树。最简单的形式下,它包含 4 个动画:向前跑、向后跑、左侧移和右侧移。
- 在所有这些动画中,角色都是面朝前的。让我们取而代之,用它们自己的混合树来替换所有这些动画,这些混合树支持在指定方向上跑动,同时可以面向所有其他方向。
- 通常,游戏里角色的动画系统是这样:一个人物可以朝任意方向跑(前、后、左、右),但他的身体和脸始终只朝一个方向(比如一直面朝屏幕前方)。
- 而现在,这个新系统正好反过来:人物只朝一个方向跑(比如一直向前移动),但他的身体和脸却可以自由地转向任何方向(可以一边向前跑,一边面朝左边、右边甚至后方)。
- 有了这个树,我们现在可以在不实际转动角色的情况下,朝所有方向跑并面向所有方向。
- 我们使用四个变量来控制混合树:
inputX,inputY,twistX, 和twistY。inputX和inputY控制角色的移动方向(例如,inputX = 0, inputY = 1表示向前跑)。twistX和twistY控制角色的面向方向(例如,twistX = 1, twistY = 0表示面向右侧)。- 主混合树(2D Blend Tree)使用 inputX 和 inputY 控制角色移动方向(如前、后、左、右)。
- 每个方向节点(如“向前跑”、“向左跑”等)不再是单一动画,而是一个嵌套的 2D 混合树。
- 为了解释清楚,这里有一些伪代码:
1 | inputX = Vector3.Dot(transform.right, velocity); |
- 这样角色可以在奔跑时不仅朝任意方向移动,还可以面向任意方向,实现完全自由的动作表现。
- 建议在计算时去除 Y 轴的影响,因为我们只关心另外两个轴上的变化。
最终结果
- 现在我们的胸部能够完全按照原始动画的动作来运动。即使角色在任意方向奔跑,双脚依然会保持正确的奔跑方向,同时骨盆也可以很好地支撑胸部的扭转旋转。
- 这个方案带来的一个额外好处是:即使在角色做旋转动作的动画中,也能边跑边旋转,因为脚步和骨盆都能灵活适应任何方向的变化。
额外可选择的方法
- 在《V Rising》中,实际上在计算嵌套混合树变量时并没有使用胸部的朝向,而是使用了另一个代理关节,类似于胸部的那个,但这次是用于骨盆的。这样做的好处是避免了过度扭转,同时让旋转更接近动画师原本的设计意图。你在这些 GIF 中看到的也是这种方式的效果。建议你亲自试试看哪种方式更适合你的项目。
- 我们还做了另一项优化,也推荐你尝试:在角色奔跑时替换掉普通的近战攻击动画,使用一个保持脊柱更直的版本。这样角色看起来会更稳定,更不容易失衡。
- 你也可以采用 Unreal 培训视频中的做法——不是使用嵌套混合树(或者在 Unreal 中叫做 Blend Spaces),而是直接旋转角色的 Root 节点。这样你就无需为每个方向重新导出带旋转的动画,普通的 strafing 动画就足够用了。但这样做也需要你思考如何在不影响代理关节的情况下对角色 Root 进行旋转。
评论




