FBX导入UE后小数帧插值会抖动

附件中的 anim_shaking.fbx 是一段带有root motion的动画,制作时在3ds Max 里使用30fps,在整数帧添加关键帧。导出动画使用Max2022 默认导出,FBX version为2014/2015,没有修改DCC导出管线。导入UE后脚步在整数帧之间有多处抖动 (比如第1帧到第2帧角色的右脚在地上来回滑动),多见于战斗动画,普通走跑跳没有这样的问题。

也尝试使用命令“Interchange.FeatureFlags.Import.FBX 0” 关掉Interchange导入,开启preserve local transform之后,抖动依然存在。

当前解决办法为在DCC里增大fps至90以上,bake每帧之后再输出,能基本解决这个问题,但这样会增加数据量。

我们也怀疑是fbx格式自己的问题,想知道UE这边有没有其他的解决方案。

重现步骤
附件为:1. 有问题的anim_shaking.fbx 动画fbx文件 2. 版本为3ds max 2022的anim_shaking.max

复现步骤:

将anim_shaking.fbx拖入UE5.5, 生成动画的第一帧到第二帧之间会产生抖动。

因为系统的关系目前我看不了附件,不过可以猜测一下,这应该是个普遍现象。在max做动画的时候应该用的IK,或者root空间定住了脚,因此插值不会有问题。但导出后转成FK并且都是parent space下的骨骼动画,当咬关键帧播放不会有问题,但插值的时候空间或算法都变了,无法保证中间帧脚能定在地面上。这种飘逸还会发生在多个动画混合的时候。解决方法是在动画蓝图里用IK来实时修正。比如Foot_IK骨骼导出的时候是Root空间的,这应该就不会飘逸了,然后在动画蓝图里用IK约束Foot骨骼到Foot_IK。UE也支持直接在编辑器里基于Foot骨骼创建虚拟骨骼(替代Foot_IK)来做同样的事情,即改变动画的坐标空间(通常Root空间)并复制Foot动画,然后作为IK约束的Target来纠正Foot骨骼

脚步我们最终在动画蓝图里确实也有加ik。但有的时候会出现在挂武器的骨骼上,比如一把刀飞出来插在地上,这个武器的挂点骨骼会出现抖动,这种情况下如果有必要我们也会在动画蓝图里添加约束来进行修正。另外有的时候受限于手机不同机型的性能,会出现不得不关掉ik的情况,这种时候就难以避免看到这些抖动了……

飞刀的情况应该和脚一样,从max里世界空间转到了父级骨骼(比如手)空间,导致插值滑动,尤其两帧之间位置变化很大时明显。除非挂点导出时也是基于root,否则解法也是在UE里转到root空间,然后IK匹配。我认为IK是最方便直观的解法

为解决这种问题的IK通常效能影响不大的。IK的开销一个是需要解算的骨骼数量,还有角色同屏计算数量,可能还需要配合一些其他相应射线开销(比如脚匹配斜坡)。这种防止骨骼插值滑动的应用不需要射线;IK影响骨骼两节(two bone iK)应该就可以了;至于同屏角色看你们是否有这么多同时有这种需求的?

另外还有个想法供参考:对于飞刀定在地上的应用和脚还有些不同,理论上只要定在地上的前后几帧让武器绑定在IK骨骼(叫IK骨骼可能容易误解,其实就是一根基于Root空间的飞刀骨骼)上即可,完了以后再回到原来的挂点(挂回到手部基于父级空间的骨骼)。不需要IK解算,仅需要IK骨骼的数据即可(上面提到了可以用Virtual bone在引擎内创建)。因为飞刀的挂点和手部之间如果没有直接几何体连接,飞刀的位置不需要反向去影响手部的位置,也就不需要IK反算,仅需要IK骨骼临时变换下父级即可。不一开始就把刀挂在IK骨骼上是因为飞刀握手里时动画插值会可能呈现和手轻微分离(滑动)。这其实就是这个问题的反向;总之要相对于什么不滑动,这跟骨骼就得基于它做父级来动画

补充:是否有慢镜头等插值需求,否则把有问题的几个动画序列插值设置成step​也行

有的,对于出了问题的慢镜头或者技能动画,我们把帧速率切成60/90/144fps,逐帧bake,引擎里设成step,这样可以解决并且能不使用ik