学习UE4动画蓝图:配置脚部IK

10 篇文章 18 订阅

目标

设想,当角色所在的地面平坦时,双脚和地面贴合的高度,正是胶囊体与地面接触的高度,此时没有视觉上的问题。然而,当角色所在的地面不平坦时,双脚各自所在的位置,和胶囊体与地面接触的高度是不一样的,此时就会出现“脚部陷入地下”或者“脚部悬空”的视觉问题。

先不谈“脚部悬空”的问题。对于“脚部陷入地下”,IK是解决这个问题的一个途径。
在上一篇博客中《学习UE4动画蓝图:配置手部IK》中,我已经体验了IK功能并将其配置到手部,使得角色挥拳的时候拳头会被“墙”阻挡而不至于穿墙。对于现在脚部的处理,思路上很相似:都是使用射线检测计算骨骼期望到达的位置,然后以此启用IK。但是不同的是射线的方式不同:

  • 对于上一篇的“手部IK”:射线将从肘部射到手部靠前的位置。
  • 而对于这一篇的“脚部IK”:射线将在脚部的垂直线上,高度上从角色胶囊体与地面接触的高度到角色胶囊体半身的高度。

(本篇主要参考了官方的“内容示例”:)
在这里插入图片描述

1. 找到启用IK的骨骼名,添加插槽

在这里插入图片描述
左/右脚的骨骼分别为foot_l/foot_r
有一点需要注意,在foot_l这个骨骼的坐标系中,X轴(红色的)是向上的:
在这里插入图片描述
而在foot_r的坐标系中,X轴(红色的)是向下的:
在这里插入图片描述
记住这个差别。

随后,分别添加插槽LeftFootIKSocketRightFootIKSocket
在这里插入图片描述
要注意的是:插槽的位置并不是(0,0,0),而是更靠下正好到脚底板的高度。我调成了:
在这里插入图片描述
在这里插入图片描述

2. 角色蓝图中做射线操作

在之前配置手部IK时,射线操作被放到了动画蓝图的事件图表中,而现在希望能放到角色蓝图中。其实并没有严格规定必须放在哪里,可能需要根据二者的环境谁更方便来决定。在这里,由于我想访问角色胶囊体,因此我觉得在角色蓝图中访问更方便。

2.1 在构造函数中设定射线距离

创建一个新的变量IKFootTraceDistance。由于它是固定的,因此在构造函数中计算赋值:
在这里插入图片描述
逻辑是:直接使用胶囊体组件中胶囊体的半身距离。

2.2 IK Foot Trace 函数

新建一个函数IK Foot Trace
在这里插入图片描述
它将用来做左右脚的射线计算,输入是“射线距离”与“插槽的名字”,输出的是射线交点相对于骨骼的偏移:
在这里插入图片描述
逻辑是(图中注释框的标题描述不准确):
在这里插入图片描述

  • 插槽的位置决定了射线的X、Y值
  • 高度上(Z值):GetActorLocation得到的是胶囊体中心点,此高度是中心距离,而它减去的TraceDistance正好是胶囊体的半身,因此得到的高度是不考虑IK时脚应该所在的高度。
2.3 在Tick中更新脚部期望的偏移

首先,添加变量记录左右脚期望偏移的长度IKoffsetLeftFootIKoffsetRightFoot,随后在Tick中调用刚才的IK Foot Trace函数计算(注意要填写各自的插槽名)。
在这里插入图片描述

3. 动画蓝图的 AnimGraph 中添加IK节点

和之前设置手部IK节点一样,为了调节Joint Target Location,可以先连一个简单的,进行预览观察:
在这里插入图片描述
不过需要注意的是它的参数:
在这里插入图片描述

  • IKBone是末端的骨骼foot_r,和之前没有区别
  • Effector Location Space选择为了Bone Space,并且Effector Targetfoor_r,这样之后输入的Vector应该是相对于这个骨骼的偏移。
  • Joint Target Location Space选择为了Parent Bone Space,并且Joint Target选择为了thigh_r。关于Bone SpaceParent Bone Space的区别有待后续研究,但这里应该不是世界空间组件空间,因为用于确定“大腿-膝盖-脚”这三点平面的Joint Target Location应该需要和“大腿的旋转”相关的。

随后,确定一下Joint Target Location的值。

然后正式连接节点:
在这里插入图片描述
其中的RightFootEffectorLocationLeftFootEffectorLocation是新的变量,将在事件图表中传入。

4. 动画蓝图的 事件图表

这里的逻辑比较简单,就是根据角色蓝图中射线计算的高度偏移,去构造骨骼期望位置的Vector。
在这里插入图片描述
需要注意的是,正如在 【1. 找到启用IK的骨骼名,添加插槽】 提到的,右脚骨骼坐标系中,朝上的方向是(-1,0,0),而左脚坐标系中,朝上的方向是(1,0,0)

效果

将角色面向模式变为向前,然后在一个斜坡上,旋转。可以看到随着脚部的高度变化,膝盖的旋转也会相应调整到期望的状态。
在这里插入图片描述

脚部悬空问题的讨论

正如一开始讨论的,脚部贴合地面的问题包括“脚部陷入地下”和“脚部悬空”。由于射线的高度是从(脚部之上)的位置到(脚部),因此只能解决“脚部陷入地下”的问题。“脚部悬空”还是会有:
在这里插入图片描述
《[UE4蓝图]虚幻4中完整实现脚部IK(二)(完结) - 知乎》中提到一个解决方法:
将人物的根骨骼朝下移动,距离刚好使那只离地面更近的脚能触及地面。
待后续实践。

  • 8
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值