IK(Inverse Kinematics),反向运动学,是指在一个相互连结的动力链中,移动某一个节点时(特别是当最末节点移动时),其他节点的参数会自动计算以达到期望的位置。
简而言之,IK 是给某个骨骼直接设置一个目标位置,让系统计算其它骨骼的旋转和位置。比如抬腿时,可以将脚的位置向上偏移,然后控制好膝盖弯曲的方向(向内侧或者外侧),系统则会计算出膝盖应该处在什么位置。
(FK(Forward Kinematics),正向运动学,则是按顺序设置每个骨骼的位置与旋转)
图中虚线是人物左腿本来的位置,实线是实现IK后左腿应该所处的位置,绿色圆圈是膝盖位置,红色线段是脚抬高的距离。
也就是说,我们只要让左脚移动红色线段的位移,就可以实现IK了。那么我们需要用到射线检测来计算出这段位移。
图中蓝色即为我们检测用的射线,从人物半高位置竖直打向左脚。
红色部分则为射线的击中点,绿色圆圈的高度是地面的高度,也就是人物Mesh组件的高度(Mesh的坐标点在脚下)。红黑长度可以由射线检测得到,绿黑长度即为人物半高(你也可以设置为其他定值)。
那么脚的偏移量红绿长度=绿黑-红黑便可以求得了,膝盖的位置就交给IK系统处理了。
(关于人物胶囊体碰撞框导致脚部接触不到地面的问题,下一篇会讲)
这里先提一句,foot的骨骼即为膝盖连接到脚踝的这一根骨头,因为控制的是foot所以命名为foot,同理calf是大腿根连接到膝盖的骨头,thigh是胯部连接到大腿根部的骨头。
Bone的location)三点可以确定一个平面,而大腿小腿的长度是固定的,那么calf也就是膝盖的位置就确定了。(ue4提供了骨骼拉伸的功能只需勾选Allow Stretching,有兴趣可以尝试)
3.以左脚为例,我们设置第一个TwoBoneIK的细节,从上到下依次解释。
5.打开人物蓝图,在BeginPlay事件中获取到动画蓝图并提升为变量,将胶囊体的半高也提升为变量存起来,方便后面使用。
6.新增一个射线检测函数IK_LineTrace,先看下射线路径图再写蓝图
通过脚部的XY轴值和Mesh的Z轴值获得了蓝点,蓝点加上半高就得到射线的起点,蓝点减去TraceDistance就得到射线的终点。
(为什么不用脚部的Z轴值?因为我们修改的EffectionLocation是给脚部的偏移量,而初始位置都是在地面的高度也就是Mesh的Z轴值。当脚已经实现IK抬起时,脚部的Z轴值就已经不是在地面位置了,就会出现计算出的位移量错误。)
蓝图跟上面路径图保持完全一致,函数需要两个输入,BoneName(骨骼名)和TraceDistance(射线在地面下方的长度)
现在处理射线检测的结果
用半高(上图中红色)- HitDistance(射线起点到击中位置的距离,上图中紫色)= 脚部所需位移距离(也就是脚踩的箱子高度)
(SelectFloat节点:如果输入的Bool类型为True,则输出A,反之输出B。这里射线没检测到物体时,自然返回0)
先检测左脚(注意BoneName一定不要填错),然后返回值赋给AnimBP的Effector LocationXLeft,右脚同理,只不过需要求相反数,因为之前提到过,两只脚的X轴方向是相反的。
为了先去掉胶囊体碰撞的干扰,我们先把胶囊体的CapsuleRadius(半径)调小调到10
现在进入游戏,当人物站在楼梯上不动时,已经实现了IK了(建议先用一个宽一点的台阶易于观察,跑起来腿部不自然和抖动以及其他的问题后面都会解决)
一直在说胶囊体的问题,下面这张图就可以清晰的展示了
可以看到,胶囊体把人挡在了上一级台阶,所以左脚拉不下去了,下一篇我们会来解决这个问题。
最近想要做个小功能,功能是随机检测到任意一个点,然后取出这个点的实际贴图灰度值。用来做算法。
在材质中,材质参数集只能往材质里面传参数,也就是用BP控制材质颜色没啥问题,但是如果反向,要调出某个点的灰度值,却没法调用出来。
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。