关于Legacy动画压缩精度到3位后Unity在Rotaiton曲线中产生自动补帧的问题
本文目录 3 个章节
关于Legacy动画压缩精度到3位后Unity在Rotaiton曲线中产生自动补帧的问题
note · 我的 UWA 问答 本文收录我在 UWA 问答发表的公开回答。问题内容归原提问者;回答保留当时语境,技术结论可能受 Unity 版本、平台和项目条件限制。
问题
在对Legacy动画采用上述方法进行压缩后,发现使用下面两种插值方式的Rotaion动画都被自动填充了中间的帧

压缩前:

压缩后:

请问大家知道产生的原因吗 谢谢各位
- 提问者:Tiki
- 提问时间:2021-05-01 21:47:24
我的回答
造成 “填充中间帧” 的问题的原因是Unity对插值的处理,与降低精度的算法没有关系。可以尝试:单纯GetEditorCurve,然后SetEditorCure,不进行修改,依然会存在题主说的“填充中间帧”的问题。

要理解这个问题的原因,需要理解Unity对Rotation的处理方式。Rotation在Unity内部都是用Quaternion处理的,即使动画资源与内存中存储的是欧拉角(Eular)。官方的说法:“Unity has to convert rotation values to Quaternions eventually, since the engine only works with Quaternions.”
而AnimationClip的插值方式的三个选项,实质上是如下含义:
- Eular Angles - 欧拉角插值,AnimationClip资源中存的是欧拉角,运行时插值后转为四元数
- Quaternion - 四元数插值,AnimationClip中存四元数,运行时插值
- Eular Angles(Quaternion) - 欧拉角插值,并把插值后的角度值烘焙(Bake)成Quaternion,存到资源文件中
使用Eular Angles(Quaternion) 的方式,可以在AnimationClip文件中看到曲线的字段如下:localEulerAnglesBaked
![]()
这种情况,资源本身占用的内存会增大:

这就是使用Eular Angles(Quaternion)方式插值,中间的帧都出现的原因,引擎把插值结果烘焙到了资源中。而GetEditorCurve和SetEditorCurve后在能看到插值的效果,只是因为Get/Set之后,Unity把数据显示到了引擎当中。
参考:
https://docs.unity3d.com/Manual/animeditor-AnimationCurves.html
https://docs.unity3d.com/Manual/AnimationEulerCurveImport.html
- 回答时间:2021-05-02 08:45:20
- 最后更新:2021-05-02 10:01:45
- 采纳状态:已采纳
来源与关系
- 上位集合:我的 UWA 问答
- UWA 标签:资源管理
- 原始问题:关于Legacy动画压缩精度到3位后Unity在Rotaiton曲线中产生自动补帧的问题
- 源页最后更新:2021-05-03 01:05:00