[玩转UE4/UE5动画系统>Control Rig篇] 之 Control Rig + Fullbody IK版的足部IK实现(附项目代码)

本教程采用图文教程+视频教程的多元化形式,我会为不同的知识点选择适当的表达方式。教程内容将同步免费发布于开发游戏的老王(知乎|CSDN)的专栏《玩转UE4/UE5动画系统》。教程中使用的资源及工程将以开源项目的形式更新到GitHub:玩转UE4上。

[玩转UE4/UE5动画系统>Control Rig篇] 之 Control Rig + Fullbody IK版的足部IK实现(附项目代码)
工程文件: 玩转UE4(GitHub)
[玩转UE4/UE5动画系统>Control Rig篇] 之 Control Rig + Fullbody IK版的足部IK实现(附项目代码)

0. 效果演示

<iframe allowfullscreen="true" data-mediaembed="bilibili" id="ZynR8TNn-1632102347806" src="https://player.bilibili.com/player.html?aid=250585137"></iframe>

使用UE5 Control Rig和Fullbody IK实现足部IK校正

文章目录

1. 什么是Control Rig

Control Rig目前是虚幻引擎的一个插件(需要在Plugins中开启)

话说UE4.26 刚发布Control Rig系统的时候,老王并没太感兴趣,以为它只是一个半生不熟的K帧做动画的编辑器工具,然而随着各种教程和范例项目的问世,老王再一次被虚幻啪啪打脸,确认是格局限制了自己的想象。Control Rig不仅可以作为动画资源的制作工具,更重要的是它是可以在运行时使用的一套动态绑定(Rig)系统,这一点是最让人欣喜的。它可以看作是动画蓝图的补充,但这个看似小小的补充却增加了很多大大的优点。

优点

  • 它更加贴近Skeleton,开发者在Control Rig中可以更加直观简单地控制骨骼使代码更加简单。
  • 还可以*添加骨骼(Bones)和控制器(Controls),这一点是动画蓝图做不到的。
  • 开发者可以在Control Rig先对骨骼进行高级绑定,然后在程序中控制各种控制器,使程序的工作流程更加清晰合理。而且这种绑定是模块化的,一个角色可以在实现不同功能时使用不同的Control Rig。
  • 它可以轻松地集成到动画蓝图中,并且可以在不同的骨骼中轻松复用。
  • Control Rig专注于骨骼控制,所以未来一定会有更多实用的工具进程到里面。

总之,Control Rig未来会像动画蓝图一样,成为虚幻引擎技术体系中必知必会的重要组成部分。

当前版本的不足

目前Control Rig还在开发过程中,而且UE4.26+版本和UE5EA1版本中Control Rig的进度也不一样,本教程使用的是UE5EA1版本,它比其它版本增加了函数定义等功能。能让代码更加清晰。但是相较于其它蓝图还是有一些不足:

  • 函数中不能定义局部变量。
  • 参数不能以引用方式传递。
  • 目前实用C++开发Control Rig的功能还不完善。
  • 等等…

虽然尚不完善,但未来可期。

2. 什么是Fullbody IK

下文简称FBIK

[玩转UE4/UE5动画系统>Control Rig篇] 之 Control Rig + Fullbody IK版的足部IK实现(附项目代码)

FBIK目前是基于Control Rig的一个插件(需要在Plugins中开启),简单的讲就是一个升级版的TwoBoneIK(在Control Rig中叫Basic IK),但功能更加强大而且使用也很简单。当然,它的运算量自然也更大一些,所以在使用过程中适当注意该功能的开关。使用Basic IK也可以在Control Rig中实现足部IK,本文中使用FBIK主要是为了尝鲜。

3. Control Rig + FBIK版的足部IK实现

3.1 原理

老王在《[玩转UE4/UE5动画系统>应用篇>功能模块] 之 Foot IK系统(ALS V4实现方案详解)》中介绍过非Control Rig版足部IK的实现方法,建议有兴趣的朋友对比学习一下。

3.1.1 需要解决的问题

在介绍原理之前,我们先来了解一下要实现足部IK所要面对的问题。

[玩转UE4/UE5动画系统>Control Rig篇] 之 Control Rig + Fullbody IK版的足部IK实现(附项目代码)
如果仅仅是将一个双脚着地的姿势中的双脚定位到斜面上是很容易的,分别通过射线检测到双脚下方的地面的绝对位置,然后把双脚定位到这个绝对位置,再把上体(Pelvis)向下移就可以了。但问题并不这么简单,如果当前姿势中角色有一条腿微微抬起怎么办?这时,从抬起的脚发出的射线依然可以检测到地面的绝对位置,按照上面的思路脚还是会按到地面上。

[玩转UE4/UE5动画系统>Control Rig篇] 之 Control Rig + Fullbody IK版的足部IK实现(附项目代码)
最好的办法就是,从脚部向下发射一条射线,通过射线碰撞的位置和角色所在平面(root所在平面)计算出相对高度差(OffsetZ),然后脚部位置加上这个相对高度差(OffsetZ),最后适当的调节上体(Pelvis)位置。这样无论当前的脚是着地还是抬起就不矛盾了。

3.1.2 实现步骤

那么FootIK的实现大致可以分为如下4个步骤:
[玩转UE4/UE5动画系统>Control Rig篇] 之 Control Rig + Fullbody IK版的足部IK实现(附项目代码)
下面我们来看一下在Control Rig中具体的实现方法。

3.2 骨架定义

[玩转UE4/UE5动画系统>Control Rig篇] 之 Control Rig + Fullbody IK版的足部IK实现(附项目代码)
实现足部IK,我定义了4个骨骼,骨骼结构如上图所示,其中foot_root_ik、foot_l_ik以及foot_r_ik可以使用Mannequin中自带的ik_foot_root、ik_foot_l以及ik_foot_r代替,但个人觉得完全自定义可以更好的避免动画中信息的干扰。

注意: pelvis_ik和foot_root_ik是独立的分支,这一点非常重要,可以避免后期骨骼的循环影响!

3.2.1 关于Bone、Control和Space的补充知识

上文说过,在Control Rig中可以在骨架上添加新骨骼然后通过定义约束关系来控制整个骨架姿态,新骨骼有三种:Bone、Control和Space
[玩转UE4/UE5动画系统>Control Rig篇] 之 Control Rig + Fullbody IK版的足部IK实现(附项目代码)
从本质来讲,三者没有太大区别,都是 Transform。以下是我的理解:

  • Bone:和原始骨架上的骨骼没有什么区别,在Control Rig中添加的骨骼没有网格权重,不会直接影响网格的形变,可以充当运行时的控制器和绑定结构中的辅助骨骼。
  • Control:和bone的主要区别在于可以在编辑器中手动控制,可以自定义形状便于识别,还可以为控制器定义类型以及限制条件,它的作用更偏向于在编辑器中K动画(当然运行时也可以使用)。

[玩转UE4/UE5动画系统>Control Rig篇] 之 Control Rig + Fullbody IK版的足部IK实现(附项目代码)

  • Space:如果想在Bone上添加一个Control,它们之间必须有一个Space衔接,其它用途并不很大。

[玩转UE4/UE5动画系统>Control Rig篇] 之 Control Rig + Fullbody IK版的足部IK实现(附项目代码)

3.3 整理流程

相较于传统的纯动画蓝图的实现方法,Control Rig的足部IK实现方法更加清晰简洁。

[玩转UE4/UE5动画系统>Control Rig篇] 之 Control Rig + Fullbody IK版的足部IK实现(附项目代码)

本例中使用了Control Rig的Forwards Solve事件,即前向处理事件。
Control Rig中有三个重要的事件:

  • Setup Event : 骨架初始化事件,主要用于骨架的Reference Pose定义。
  • Forwards Solve : 前向处理事件,相当于动画蓝图中的Animation Update事件。
  • Backwards Solve:后向处理事件,它可以把动画序列反向计算成Control Rig的控制器信息,然后进行二次K帧(这个部分我没有实践过,仅供参考)。

3.3.1 Foot IK

[玩转UE4/UE5动画系统>Control Rig篇] 之 Control Rig + Fullbody IK版的足部IK实现(附项目代码)这个过程借鉴了官方的灵风女神厄科项目。从root位置发射一条射线进行预检测,上文说了FBIK的计算量相对大,不过这种检测方式也会漏掉一些小概率情景,比如:

[玩转UE4/UE5动画系统>Control Rig篇] 之 Control Rig + Fullbody IK版的足部IK实现(附项目代码)

3.3.2 控制器归位

[玩转UE4/UE5动画系统>Control Rig篇] 之 Control Rig + Fullbody IK版的足部IK实现(附项目代码)

将foot_l_ik和foot_r_k还原到动画中foot_l和foot_r的位置。foot_root_ik的局部坐标归零。

3.3.3 射线检测

[玩转UE4/UE5动画系统>Control Rig篇] 之 Control Rig + Fullbody IK版的足部IK实现(附项目代码)

[玩转UE4/UE5动画系统>Control Rig篇] 之 Control Rig + Fullbody IK版的足部IK实现(附项目代码)

还记得《[玩转UE4/UE5动画系统>应用篇>功能模块] 之 Foot IK系统(ALS V4实现方案详解)》中我们构造这个射线和计算OffsetZ的方法么?

在Control Rig中射线检测到的位置直接就是root坐标系的坐标,这个Hit Location的z值也就直接是我们要的OffsetZ了,多么的轻松简洁!

FootHeight用于调整网格模型脚部的高度,防止脚部陷到地面下。

3.3.4 设置pelvis_ik和foot_root_ik

[玩转UE4/UE5动画系统>Control Rig篇] 之 Control Rig + Fullbody IK版的足部IK实现(附项目代码)

[玩转UE4/UE5动画系统>Control Rig篇] 之 Control Rig + Fullbody IK版的足部IK实现(附项目代码)
用左右脚中最低偏移量为pelvis_ik和foot_root_ik定位。

3.3.5 foot_l_ik和 foot_r_ik定位

[玩转UE4/UE5动画系统>Control Rig篇] 之 Control Rig + Fullbody IK版的足部IK实现(附项目代码)
平滑定位 foot_l_ik和 foot_r_ik,简洁到无话可说。

3.3.6 计算脚面朝向以适应接触面

[玩转UE4/UE5动画系统>Control Rig篇] 之 Control Rig + Fullbody IK版的足部IK实现(附项目代码)

[玩转UE4/UE5动画系统>Control Rig篇] 之 Control Rig + Fullbody IK版的足部IK实现(附项目代码)
脚部朝向旋转,我尝试过先使用Normal来Lerp,然后转换成Rotation,但是出现了万向锁现象,导致脚部抖动(尤其是地面在像跷跷板一样运动时),所以采取了直接用Transform中的四元数Rotation进行Lerp,这样就平滑了。

当角色处于非移动状态时才校正脚面的朝向。

灵风女神厄科项目(见下图)中,是通过root的位移量判断角色移动的方式,但是当角色踩踏的地面本身是移动的时候,root也会有位移,从而导致判断错误,所以我直接使用动画蓝图中的Speed来判断。
[玩转UE4/UE5动画系统>Control Rig篇] 之 Control Rig + Fullbody IK版的足部IK实现(附项目代码)

3.3.7 定义IK约束

[玩转UE4/UE5动画系统>Control Rig篇] 之 Control Rig + Fullbody IK版的足部IK实现(附项目代码)

[玩转UE4/UE5动画系统>Control Rig篇] 之 Control Rig + Fullbody IK版的足部IK实现(附项目代码)

Fullbody IK的使用非常简单直观,连膝盖的极向目标都不用设置,实现效果也非常好。

[玩转UE4/UE5动画系统>Control Rig篇] 之 Control Rig + Fullbody IK版的足部IK实现(附项目代码)
唯一注意的是在Bone Settings中为两根小腿骨calf_l和calf_r设置以下旋转的优先角度,防止IK解算时出现膝关节外翻的情况。

3.4 将Control Rig集成到动画蓝图

[玩转UE4/UE5动画系统>Control Rig篇] 之 Control Rig + Fullbody IK版的足部IK实现(附项目代码)将要暴露给动画蓝图的变量开启显示。

[玩转UE4/UE5动画系统>Control Rig篇] 之 Control Rig + Fullbody IK版的足部IK实现(附项目代码)
集成到动画蓝图中,定义一个名为FootIK的曲线来控制这个Control Rig的开关。

[玩转UE4/UE5动画系统>Control Rig篇] 之 Control Rig + Fullbody IK版的足部IK实现(附项目代码)
在动画蓝图中通过Modify Curve动态修改FootIK曲线值,也可以在动画序列中静态定义它的值。

4. 小结

对比传统实现方式不难看出,Control Rig的实现更加简洁清晰,后处理功能代码更高的内聚,使用也更加灵活,居家旅行必备之佳品!

参考

本文参考了虚幻官方提供的灵风女神厄科范例项目以及Advanced Locomotion V4 。

上一篇:ES中文分词器安装以及自定义配置


下一篇:2021最新php中Elasticsearch安装ik分词器(安装篇二)