UE4引擎如何在场景地图里观察碰撞,或者中BP里观察碰撞也可以?

上下坡都有效,不受胶囊体碰撞的影响

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的细节,从上到下依次解释。

  • IK:前面说过,IK Bone就是End Bone,我们要控制的骨骼,自然选择foot_l,其他不用更改。
  • 有四种,WorldSpace(世界坐标系)ComponentSpace(组件坐标系),不用多说。BoneSpace(骨骼坐标系),以你选定的骨骼为原点的坐标系。
    ParentBoneSpace(父骨骼坐标系),以你选定骨骼的父骨骼为原点的坐标系。
    这两个其实也是差不多的,假如选择ParentBoneSpace然后EffectorTarget选择了脚趾,跟BoneSpace选择脚部是一个效果,因为脚部是脚趾的父骨骼。
    (我确实没有理解这两个坐标系在哪些情况下使用会有明显差异,如果有大佬知道,希望能评论告诉我一下,十分感谢。)
    那么我们通过射线检测算出的距离等于是基于左脚坐标系的偏移量(且只有竖直方向上),所以选择BoneSpace和foot_l。
  • Jonit Target(关节目标):这个坐标系选取也是BoneSpace比较好,但骨骼其实选择大腿或者大腿的父骨骼或者其他骨骼其实都可以用,我们这里直接选择thigh_l(左大腿)。
如果你将这两个值提升为变量了,就拖不动了,只能通过修改变量值来更改
  • 最需要注意的是,更改EffectorLocation时,可以发现脚部竖直向上位移的时候,变化的是X轴,这是因为根据的坐标系是基于左右脚的,并且左右脚还是相反的。
    左脚向上位移时X值增加,右脚向上位移时X值减少。
  • JointTargetLocation其实有点难调,实在懒得调可以参考一下我的值(前提你的TwoboneIK设置必须跟我一样),然后将左右脚的EffectorLocation的X值都提升为变量,默认值0。(因为我们只需要脚在竖直方向位移)

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了(建议先用一个宽一点的台阶易于观察,跑起来腿部不自然和抖动以及其他的问题后面都会解决)

在游戏中按下~键打开控制台,输入show collision可以将碰撞框显示出来


一直在说胶囊体的问题,下面这张图就可以清晰的展示了

可以看到,胶囊体把人挡在了上一级台阶,所以左脚拉不下去了,下一篇我们会来解决这个问题。

感谢关注评论点赞收藏!有问题请评论或私信。

}

最近想要做个小功能,功能是随机检测到任意一个点,然后取出这个点的实际贴图灰度值。用来做算法。

在材质中,材质参数集只能往材质里面传参数,也就是用BP控制材质颜色没啥问题,但是如果反向,要调出某个点的灰度值,却没法调用出来。

}

我要回帖

更多关于 荣耀全场景加速引擎 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信