UE4-(IK)实现人物脚贴合地面

213 篇文章 590 订阅

逆向运动学(Inverse Kinematics)(IK)提供一种从末端执行器的位置处理关节旋转的方法,而不是通过关节旋转,在实践中,提供一个执行器的位置,然后IK解决方案解决旋转,使最终的关节尽可能的与该位置重合,这可以用来让角色的脚停留在不平摊的地面上。

在UE4中,IK可以用来覆盖和增强现有动画,使角色或骨架网格体的运动看起来对其环境更具有反应性

(与官网给出的案例逻辑有一定出入)

在第三人称模板中人物上楼梯现有的状态:

最终要实现的状态:

一、新建项目或者导入第三人称模板

选择新增/添加功能或内容包,打开的选项界面中选择第三人称游戏,添加到项目。

二、打开第三人称地图,在此关卡中进行编辑,以下操作在第三人称控制蓝图中编辑。

三、解析:人物太高腿的高度 不能太夸张作为前提

  

在第三人称控制器蓝图中新建函数IKTrace在函数中编辑下面逻辑:

1.如果让角色站立在不同的台阶上,按照当前人物蓝图,模型膝盖高度在腰部位置的二分之一,在人物蓝图中拥有将囊体半高的参数,可以用此来计算膝盖所在的位置。(膝盖位置 = 人物腰部所在位置z值 - 胶囊体半高/2)

注:可以在编译的时候就获取到胶囊体半高值,可以在Construction Scrip 面板进行一个提升为变量设置。

2.计算脚底所在的高度z值(人物腰部位置z值 - 胶囊体半高),然后设置一个射线检测的距离,用脚底的z值-射线检测距离,作为射线的终点位置。使用math自定义添加表达式进行设置

注意:如果之前胶囊体半高变量(CapsuleHalfHeight),与自定义数学表达式中的变量名称一致,会导致自定义表达式中少一个参数,但是在进行计算的时候,系统会自动调用之前定义的胶囊体半高变量值来参与计算。

3.使用LineTraceForObjects 节点(将沿给定的线执行碰撞追踪并返回追踪命中的首个物体(须与特定物体类型匹配)对Object Types 属性进行类型指定)将参数start Position 与end Position分割结构体引脚

4.完成创建射线检测逻辑,要保证射线是穿过脚底骨骼向正下方发射,所以要保持射线的x、y值是脚底骨骼位置的x、y值。

如果想要看到射线,设置一下:

5.脚底所在高度值(胶囊体半高的一半)减去获取到阻挡射线物体到膝盖的距离,也就是我们所需要的偏移高度值。

注意:所得到的值可能是正数也可能是负数,无需做更改转换,如果是腿需要抬高,则获得的值是正数,如果是负值说明腿要降低高度。

使用选择浮点节点进行判断,如果检测到物体,则需要计算返回偏移量,如果没有检测到,则返回0即可。

判断条件与射线检测结果返回值连接,并将运算结果返回到函数输出

四、编辑动画蓝图

1.找到第三人称控制器中使用的动画蓝图,打开对应编辑器

2.Two Bone IK (双骨骼IK)

 

主要设置参数:

IK:

IK骨骼:要应用IK解算器的骨骼命名,此应为骨链末端的骨骼。

Effector:执行器位置空间,用来选择当执行器进行唯一的时候要以什么空间为基准

Joint Target:关节目标位置空间

3.设置参数

根据左右脚骨骼分别为foot_l、foot_r,创建两个双骨骼Ik节点细节面板设置IK骨骼为foot_l、foot_r。

设置Effector 执行器位置空间为 骨骼空间 ,设置执行器目标设置分别为foot_l、foot_r,要给他们进行设置位置偏移,需要他们在自己所在的当前坐标系中进行偏移。

 

Joint Target:关节目标位置空间,均设置为 父骨骼空间,相当于选择一个骨骼作为父骨骼,执行器骨骼会随着父骨骼的改变而产生的对应的改变。

关节目标选择 thigh_l、thigh_r (thigh股)

 

4.执行线连接,编译,预览视图会出现内八字效果。

注意:引起内八字效果的是Joint Target Location 参数错误赋值

5.需要设置双骨骼IK节点中Effector 及Joint Target 位置参数,将两组参数提升为变量。

设置Joint Target Location,选中双骨骼IK节点在细节面板设置参数,可以自己调整,下面参数只是稍微符合正常移动跑步效果

编辑数据完成后,点击右下角的应用,如果没有应用数据不会保存。

五、第三人称控制器蓝图对动画蓝图中的参数进行赋值,返回到第三人称控制器蓝图中

1.我们需要将第三人称控制器蓝图中计算的出来的返回值   FootOffset 赋值给 IKEffector 左右脚都需要进行计算赋值,需要获取到当前人物使用的动画蓝图实例

使用 Event Begin 节点 获取动画蓝图实例

获取到动画实例之后,进行类型转换,转换到当前使用的动画蓝图类型,并将转换类型的值进行提升为变量,方便之后应用

2.使用Tick节点,实时计算偏移量,并将偏移量提升为变量进行数据保存

3.对动画蓝图中的IKEffect_L及IKEffect_R进行偏移量设置,

前提:打开动画蓝图的骨架,找到foot_l及foot_r ,仔细注意它的坐标系

 foot_l  x轴为正上方

foot_r x轴为正下方

所以就要对计算到的偏移量进行赋值 到IKEffect  参数变量的x轴上,并且对于IKEffector_R变量来说坐标轴的值是取反的,所以要乘以一个-1。

IKEffect_l  IKEffect_r 是向量变量,将变量分割结构体引脚改为xyz三个变量进行赋值

使用Sequence 序列节点完成逻辑

运行:

还是没有效果,打开命令行输入show Collision 开启碰撞查看

原因:胶囊体碰撞器产生的影响,可以进入到第三人称动画蓝图将CapsuleComponent 细节面板下的胶囊体半径减少

运行:

存在问题:还是受到胶囊体影响、斜坡上脚不能贴合,脚的位置有陷入模型中。之后解决。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值