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


工程文件: 玩转UE4(GitHub)

0. 效果演示

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

文章目录

  • 0. 效果演示
  • 1. 什么是Control Rig
    • 优点
    • 当前版本的不足
  • 2. 什么是Fullbody IK
  • 3. Control Rig + FBIK版的足部IK实现
    • 3.1 原理
      • 3.1.1 需要解决的问题
      • 3.1.2 实现步骤
    • 3.2 骨架定义
      • 3.2.1 关于Bone、Control和Space的补充知识
    • 3.3 整理流程
      • 3.3.1 Foot IK
      • 3.3.2 控制器归位
      • 3.3.3 射线检测
      • 3.3.4 设置pelvis_ik和foot_root_ik
      • 3.3.5 foot_l_ik和 foot_r_ik定位
      • 3.3.6 计算脚面朝向以适应接触面
      • 3.3.7 定义IK约束
    • 3.4 将Control Rig集成到动画蓝图
  • 4. 小结
  • 参考

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

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所要面对的问题。


如果仅仅是将一个双脚着地的姿势中的双脚定位到斜面上是很容易的,分别通过射线检测到双脚下方的地面的绝对位置,然后把双脚定位到这个绝对位置,再把上体(Pelvis)向下移就可以了。但问题并不这么简单,如果当前姿势中角色有一条腿微微抬起怎么办?这时,从抬起的脚发出的射线依然可以检测到地面的绝对位置,按照上面的思路脚还是会按到地面上。


最好的办法就是,从脚部向下发射一条射线,通过射线碰撞的位置和角色所在平面(root所在平面)计算出相对高度差(OffsetZ),然后脚部位置加上这个相对高度差(OffsetZ),最后适当的调节上体(Pelvis)位置。这样无论当前的脚是着地还是抬起就不矛盾了。

3.1.2 实现步骤

那么FootIK的实现大致可以分为如下4个步骤:

下面我们来看一下在Control Rig中具体的实现方法。

3.2 骨架定义


实现足部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

从本质来讲,三者没有太大区别,都是 Transform。以下是我的理解:

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

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

3.3 整理流程

相较于传统的纯动画蓝图的实现方法,Control Rig的足部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

这个过程借鉴了官方的灵风女神厄科项目。从root位置发射一条射线进行预检测,上文说了FBIK的计算量相对大,不过这种检测方式也会漏掉一些小概率情景,比如:

3.3.2 控制器归位

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

3.3.3 射线检测

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

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

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

3.3.4 设置pelvis_ik和foot_root_ik


用左右脚中最低偏移量为pelvis_ik和foot_root_ik定位。

3.3.5 foot_l_ik和 foot_r_ik定位


平滑定位 foot_l_ik和 foot_r_ik,简洁到无话可说。

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


脚部朝向旋转,我尝试过先使用Normal来Lerp,然后转换成Rotation,但是出现了万向锁现象,导致脚部抖动(尤其是地面在像跷跷板一样运动时),所以采取了直接用Transform中的四元数Rotation进行Lerp,这样就平滑了。

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

灵风女神厄科项目(见下图)中,是通过root的位移量判断角色移动的方式,但是当角色踩踏的地面本身是移动的时候,root也会有位移,从而导致判断错误,所以我直接使用动画蓝图中的Speed来判断。

3.3.7 定义IK约束

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


唯一注意的是在Bone Settings中为两根小腿骨calf_l和calf_r设置以下旋转的优先角度,防止IK解算时出现膝关节外翻的情况。

3.4 将Control Rig集成到动画蓝图

将要暴露给动画蓝图的变量开启显示。


集成到动画蓝图中,定义一个名为FootIK的曲线来控制这个Control Rig的开关。


在动画蓝图中通过Modify Curve动态修改FootIK曲线值,也可以在动画序列中静态定义它的值。

4. 小结

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

参考

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

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

  1. [玩转UE4/UE5动画系统>应用篇>功能模块] 之 ALS V4地面站立动作状态机详解

    本教程采用图文教程+视频教程的多元化形式,我会为不同的知识点选择适当的表达方式.教程内容将同步免费发布于 开发游戏的老王(知乎|CSDN)的专栏<玩转UE4/UE5动画系统>.教程中使用的 ...

  2. [玩转UE4/UE5动画系统>应用篇>功能模块] 之 ALS V4 主状态机详解

    本教程采用图文教程+视频教程的多元化形式,我会为不同的知识点选择适当的表达方式.教程内容将同步免费发布于 开发游戏的老王(知乎|CSDN)的专栏<玩转UE4/UE5动画系统>.教程中使用的 ...

  3. [玩转UE4/UE5动画系统>应用篇>功能模块] 之 Foot IK系统(ALS V4实现方案详解)

    本教程采用图文教程+视频教程的多元化形式,我会为不同的知识点选择适当的表达方式. 教程内容将同步免费发布于 开发游戏的老王(知乎|CSDN)的专栏<玩转UE4/UE5动画系统>. 教程中使 ...

  4. [玩转UE4/UE5动画系统>应用篇>功能模块] 之 布娃娃系统(ALS V4实现方案详解)

    本教程采用图文教程+视频教程的多元化形式,我会为不同的知识点选择适当的表达方式. 教程内容将同步免费发布于 开发游戏的老王(知乎|CSDN)的专栏<玩转UE4/UE5动画系统>. 教程中使 ...

  5. [玩转UE4/UE5动画系统>Control Rig篇] 之 使用Control Rig实现目标偏移(Aim Offset)(附项目代码)

    本教程采用图文教程+视频教程的多元化形式,我会为不同的知识点选择适当的表达方式.教程内容将同步免费发布于开发游戏的老王(知乎|CSDN)的专栏<玩转UE4/UE5动画系统>.教程中使用的资 ...

  6. UE4/UE5 虚幻引擎,材质篇(一)

    1.自发光材质 2.闪烁灯光.呼吸灯 3.流动的材质 (比如流水灯) ●有颜色贴图的 ●没有颜色贴图,只有黑白贴图的,可以自己设置一个颜色. 4.物体燃烧的材质 4.1 .材质Blend Mode 混 ...

  7. [玩转UE4动画系统]教程的大纲及设计思路

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

  8. UE4骨架网格体动画系统(1)

    参考 https://docs.unrealengine.com/4.27/zh-CN/AnimatingObjects/SkeletalMeshAnimation/ 虚幻引擎4(UE4)动画系统由多 ...

  9. unity3d学习笔记——老版动画系统的使用

    新的动画系统mechanim相对老版的动画系统,功能强大了不少,但是消耗也不小--需要计算的东西就更多了,所以学习新的动画系统的同时,掌握并使用老版动画系统也是很必要的,虽然老版动画系统相对简单得多, ...

最新文章

  1. 杭州码农哀叹:新买的房子装修到一半没钱了,靠着贷款平台借钱才勉强推进。这套房子价格高达1000多万,有钱买却没钱装修!...
  2. legacy引导gpt分区_windows分区模式和启动模式(UEFI+GPT或Legacy+MBR组合)
  3. 小程序首页获取数据给数组赋值,实现加载更多,以及遇到的坑
  4. 【Android 逆向】Android 进程简介 ( Android 应用启动流程 )
  5. PAT甲级1086 Tree Traversals Again:[C++题解]二叉树中序序列、栈、求后序遍历
  6. Android中的日期控件DatePicker和DatePickerDialog
  7. 机器视觉 · 工业镜头
  8. 我在河南安阳拍摄的一个山村小孩儿
  9. [Android] TextView 分页功能的实现
  10. pythontuple([1、2、3)_Python 语句\nprint(tuple([1,2,3]))\n的运行结果是
  11. 今天用pro安装nginx+php+mysql出现故障的解决方法
  12. cocos2dx进阶学习之CCAction
  13. 应用:文件夹copy器(多进程版)
  14. 自主创新战略下的技术创新之道
  15. Visio 2003 开发入门
  16. .Net C# Newtonsoft.Json JsonSerializerSettings配置
  17. python字符串去掉最后的逗号_拼接字符串时去掉最后一个多余逗号
  18. 俄勒冈之旅_以您记得的方式玩俄勒冈之路
  19. 图和两种遍历,Saving James Bond
  20. Qt编写的项目作品30-录音播放控件(雨田哥作品)

热门文章

  1. 支持向量机专题——线性可分支持向量机
  2. n! 结果尾数中零的数量
  3. perl中正则匹配中文字符
  4. TTSR:用Transformer来实现端到端的超分辨率任务 | CVPR2020
  5. RTP/RTCP协议解析
  6. 谭浩强c程序设计试题汇编第三版 第四章解析
  7. Excel如何批量在空白单元格录入相同内容
  8. 单点登录系统(SSO)的开发思路
  9. 第32篇 网络(二)HTTP
  10. matlab 错误使用*