Unity 模型抖动的原因与解决方法(Animation的浮点数压缩)


https://wangqiguang.work/zb_system/admin/index.php?act=UploadMng

在做新项目的人物动画时,由于表现需要,镜头会经常拉近,展现模型的细节。在近距离观察中,发现人物模型的脚有不正常的颤抖表现。(实际上是整个模型都有轻微抖动,但是腿的描边和与不动的地面的接触,使抖动更加明显。)


在查找原因的过程中,尝试过很多网上的解决方案:
例如:

1、针对Animation Type 为 Generic的动画的解决方案
解决方案一:
将Rotation Error置为 0, 这样应该就是对动画的旋转不进行压缩

image.png


解决方案二:

Anim.Compression 直接置为off

注:当把动画类型更改成Humanoid时,却还是会发生抖动,无论怎么设置容错率都没用,然后就发现了下面这种解决方案

2、针对Animation Type为Humanoid 的动画的解决方案:

勾选Root Transform Position(XZ)的Bake Into Pose

image.png


(以上两种情况排除了是由于UNITY动画导入器的压缩产生了抖动。)

  1. 打开或关闭humanoid模式下的foot IK 依旧没有变化

  2. 通过与美术沟通,可能是由于脚随着body的质心摆动动作一起动造成的,但是不能去除掉这个动作,因此不能成为可行的解决方案。

文中作者打开animatuon文件观察到骨骼的数字都非常小,怀疑是精度丢失造成的,并将数值*100,从而消除了抖动。


因此我也打开了我们项目的动画文件,部分如图:

其中的数值确实有非常多的小数点位数。
然后我又找到了这个工程中倒入动画的配置代码,发现有一段代码是为了压缩动画文件大小而写的将float精度保留至小数点后3位(f3)。主流的一些文章认为选择f3是因为认为对动画表现不会有肉眼可见的影响,但是在本实例中,却产生了很严重的动画抖动。

解决: 将f3 改为f4,模型抖动情况大幅度削弱,但仔细观察仍可看出有些许瑕疵,与美术检查后认为在可接受的范围,因此保留了f4的精度。 如果提高更多的精度,甚至不压缩,此种抖动几乎可以完全消除。

补充:在上文提到的文章中,以及动画文件的数值上可以看出,即使不做一个“f3”的压缩,依旧有可能产生由于浮点数精度丢失造成抖动的问题,可以从动画文件的精度入手做一些修改,避免冗长的小数点位数产生。



评论回复