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

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

在这里插入图片描述
工程文件: 玩转UE4(GitHub)
在这里插入图片描述

0. 效果演示

[玩转UE4/UE5动画系统>应用篇>功能模块] 之 足部IK系统演示视频

1. 概述与原理

目前在UE4项目中实现Foot IK,最简单的办法就是使用免费插件PowerIK,详见老王的另一篇博文《虚幻引擎插件:使用Power IK轻松愉快地实现脚底板位置矫正》,但是Foot IK毕竟是游戏开发中的一个经典技术,所以我还是决定出一篇ALS V4中Foot IK系统详解教程分享给大家。

Foot IK的基本原理非常简单,像下图这样把脚部和骨盆摆好位置,定义好膝盖弯曲的方向(极向),其它交给TwoBoneIK就可以了。

在这里插入图片描述
Foot IK是个装饰性的功能,所以这个功能可以完全用动画蓝图实现。

2. 动画蓝图事件图

注意: 事件蓝图只负责计算出左右脚的目标偏移量以及骨盆的目标偏移量,实际的移动是在动画蓝图的动画图中通过Transform(Modify)Bone以及Two Bone IK等节点实现。

2.1 Update Foot IK

Update Foot IK方法也体现了Foot IK的工作过程,Update Foot IK在动画蓝图中被Update Animation事件调用,即每一帧都会调用。具体某个动画是否需要开启Foot IK,则由动画曲线来控制,在ALS V4中左右脚的IK分别由Enable_FootIK_LEnable_FootIK_R两条曲线分别控制。

在这里插入图片描述
注释

分别计算左右脚偏移量,然后计算骨盆偏移量。

注意:其中Set Foot Offsets的参数都是以引用的形式传递。

2.2 Set Foot Offsets

在解释具体计算方法之前,我们先来了解一下和计算相关的骨头。尤其要注意的是绿色的ik_foot_root,ik_foot_l( r ),它们构成了root的一支子树。从拓扑结构来讲ik_foot_I( r )foot_I( r )之间并没有什么关系,换句话说它们的 transform是相对独立的ik_foot_I( r )本身不会跟着foot_I( r ) 运动,反之亦然(这点请大家先记住,后面会用到)。

在这里插入图片描述

另外,还要了解的是 rootfoot_l( r ) 的物理位置

在这里插入图片描述

fool_l到地面的高度就是FootHeight(项目中默认是15)。

在这里插入图片描述
以下是Set Foot Offsets的蓝图代码
在这里插入图片描述

注释

Step 1和Step 1.1

在这里插入图片描述

R点是骨架的root位置,F点是骨架的foot位置,取R点的z值以及F点的x,y值获得P点,P点其实就是FR所在水平面(地面)上的投影点。从P的正上方AP的正下方B进行射线检测,I点就是碰撞点,I加上一个沿碰撞法线方向上的常量(足部的高度)获得T点,P点也加上垂直向上的常量(足部的高度)获得O点。那么向量OT就是偏移向量了。

注意: 可能你已近发现,上面求得的结果OT只和脚部的XY坐标有关,而与脚部的Z坐标无关。这只是一个偏移量,在使用Transform(Modify)Bone节点移动脚部时,我们会把Transform Mode设为Add to Exisiting,这样就可以在偏移量的基础上叠加当前的动画数据了。

Step 1.2

计算旋转偏移量

Step 2

把Current Location Target平滑赋值给Current Location Offset,并根据目标位置和当前位置的关系设置过渡速度。

这一步的意义主要作者想把平滑做到极致,其实不过分追求平滑的话直接把Current Location Target赋值给Current Location Offset就可以了。

Step 3

将Current Rotation Target平滑赋值给Current Rotation Offset

在这里插入图片描述
注释

  1. 取Enable_FootIK_L和Enable_FootIK_R的平均值作为Pelvis Alpha。
  2. 取Foot Offset Target中位置最低的那个作为Pelvis Target。
  3. 平滑插值。

3. 动画蓝图动画图

下图是ALS V4原版中,Foot IK Layer所处的位置
在这里插入图片描述
在本例中我直接把它放到了接近Output Pose的地方

在这里插入图片描述
在这里插入图片描述

注意: 上文已经提到过对脚部和骨盆使用的Transform(Modify)BoneTransform Mode都是Add to Exisiting即在原有动画的基础上添加这个偏移量。骨盆和即向目标的Rotation Mode都是Ignore

在这里插入图片描述

4. 曲线控制

理论上讲动画曲线应该添加到动画资源中,但是如果你查看一下ALS V4工程中诸如走和跑等很多应该有Foot IK的动画序列,却看不到它们有Enable_FootIK_LEnable_FootIK_R曲线。这是因为原作者使用了可以动态定义动画曲线值的Modify Curve节点,下图是原版中Modify Curve节点的位置,地面运动全部需要Foot IK,于是直接全部定义为1了,这样做很省事啊!

在这里插入图片描述

我是用横向卷轴模板做的案例,所以就仿照原版把Modify Curve节点如下图所示放置了。

在这里插入图片描述

5. 动画资源约定

按照ALS V4的方案, ik_foot_l( r )foot_l( r ) 在世界坐标系的transform,在动画运行时必须时刻保持一致!

换句话说,在制作动画时,应该使用IK控制器制作腿部动画,并且烘焙和导出动画时,要保留 ik_foot_l®的数据。如果动画是动补设备获取的,那么要想办法给 ik_foot_l®上复制一份foot_l®的信息,或者采用动态约束手段。

注意:

直接使用UE4自带的跑步动画套用到ALS V4上是不行的,我们看到它的ik_foot_l( r ) 上没有动画数据

在这里插入图片描述

而ALS V4的跑步动画里ik_foot_l( r )是有动画数据的
在这里插入图片描述

注意: 必须在骨架的重定向设置中将下面的骨骼全部设为Animation

在这里插入图片描述

下面以左脚为例解释一下虚拟骨骼的创建方法及其意义

VB ik_foot_l_Offsetik_foot_lik_foot_l,脚部的IK控制器。
VB ik_knee_target_lik_foot_lcalf_l,膝盖极向目标。

补充

  1. 关于Foot IK骨骼绑定的相关内容,大家可以暂且看一下老王的另外一篇博文《高效绑定的艺术》笔记:脚部反向动力(FOOT IK) 。

  2. 感谢@Zero 大佬给出的建议,我把他的原话也放在这里分享出来

看了下Footik文章,有几点小建议。Step2插值是防止在落差大的地形上下瞬移。5.其实ikfoot没必要带位移,他的用处主要是作为一个临时变量存取数值给最后ik用(因为动画蓝图没输出)。可以直接用copybone来获取数据。用虚拟骨骼代替也是可以的。

  • 7
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

开发游戏的老王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值