UE4 脚部IK实现

脚步IK的目的是让角色的脚能够贴合地面,而不会因为胶囊体的缘故在上下坡时处于悬空状态,要实现IK的思路如下:
在这里插入图片描述
左边是没有IK的状态,由于胶囊体与墙面的阻挡,角色的双脚处于与地面平行的状态,两只脚不会与斜坡贴合,且一条腿处在悬空状态,右边是IK后的状态,通过Two Bone IK节点对左脚抬高,使两只脚的连线能够与斜坡平行,然后将角色整体下移使身体整体能与地面贴合,然后修正双脚的角度使双脚贴合斜坡,这就是IK的过程,可以通过在动画蓝图中添加以下五个节点实现:

1.Two Bone IK节点,目标为左脚,设置如下:

在这里插入图片描述

这个节点作用是对左脚进行抬高或降低,设置如上图右方所示,创建该节点并将IKBone设为左脚骨骼后,左边的View视图中会出现两个可拖动的点:

在这里插入图片描述

左脚上的点就是左脚骨骼的位置,也就是节点中的Effector Location,另一个是关节节点,即节点中的Joint Target Location,把这个关节节点位置拖到膝盖的前上方,以保证抬腿时有正常的反馈。由于这一步只需要实现“抬脚”,因此只需要Effector Location的X方向位移,也就是脚的抬高或降低,可以将节点拆分并单独将X轴提升为变量Left Foot Offset。

2.Two Bone IK节点,目标为右脚,设置如下:

在这里插入图片描述

跟左脚设置基本类似,只是右脚X增加与左脚是相反的,可以通过修改Effector Location X后的预览发现,因此乘一个-1,调一下关节节点位置保持在膝盖前上方即可。右脚X偏移提升为变量Right Foot Offset。

3.Transform(Modify) Bone节点,目标为腰部,设置如下:

在这里插入图片描述

扫描二维码关注公众号,回复: 15549421 查看本文章

这个节点作用就是对身体的整体移动,因此选腰部骨骼为目标节点,将Translation Z单独提升为变量Mesh Offset。

4.Transform(Modify) Bone节点,目标为左脚,设置如下:

在这里插入图片描述

这个节点作用是对左脚骨骼进行旋转,使其能贴合斜坡,因此将Rotation提升为变量Left Foot Rotator。

5.Transform(Modify) Bone节点,目标为右脚,设置如下:

在这里插入图片描述

与左脚相似,作用为旋转右脚骨骼,将其旋转提升为变量Right Foot Rotator。

按顺序将五个节点连起来后,在角色蓝图中创建相应的变量,通过蓝图接口获取这些值,动画蓝图的工作就完成了。

在角色蓝图中,需要为这五个变量进行赋值。建立一个函数Calculate Foot IKParam,添加一个FName输入,为骨骼名:

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

这个函数用于计算需要的参数值。首先进行一个射线检测,射线的起始点为角色的腰部,结束点为腰部位置减去人物胶囊体半高乘Scale,Scale作为一个变量可以后续更改,简单来说就是从人物腰部往下发射射线,检测可碰撞的物体,将返回的碰撞点信息拆分,对法线向量的x与z、y与z分别求反正切,得到的值组合为向量,作为脚部骨骼的旋转量,将人物半高与射线检测到的点相减作为脚的抬高高度(使用Select Float节点保证在检测到着点时抬脚,否则这个值设为0)。

接下来再建立一个函数Set Foot IKParam,内容如下:

在这里插入图片描述

线连的有点乱,不过其中很多是FInterp To节点,用于平滑过渡的,并不影响核心逻辑。这个函数用于设置那五个变量,首先调用Calculate Foot IKParam,分别计算左脚骨骼和右脚骨骼的参数,输出的旋转向量可以直接对双脚旋转赋值。选取左右脚Offset中的较小值,也就是抬高度较低的那个值,做一个FInterp To赋给Mesh Offset,能够相对平滑的对身体高度进行调整,脚抬高了多少就让身体往下偏移多少,使脚能够贴合地面。然后由于Mesh整体有偏移,所以左脚的最终偏移值要减去整体的偏移值,然后给一个FInterp To节点进行平滑过渡,当然,如果射线检测没有检测到目标着点的话就把这个值设为0,即不对左脚进行偏移。右脚同理。

由于运动随时都在进行,因此需在角色的Tick函数中调用Set Foot IKParam函数进行实时计算。来看看最终成果:

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

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

猜你喜欢

转载自blog.csdn.net/weixin_47260762/article/details/127427230