[toc]

什么是帧

在传统的动画中,帧代表的是一秒内播放的图片的数量,其中每个图片代表一帧 在游戏开发中,帧同样也是同样的东西,即每隔渲染 (计算) 的结果是一帧

# 前置概念

# 骨骼动画 / 普通动画

骨骼动画是用来模拟 3D 动画的一种技术,
通过对虚拟骨骼进行插值来计算出每帧下模型的顶点数据 普通动画,比如 2D 动画,实际上是有很直观的帧数据的。

但通常,基于插值的动画数据是会和时间绑定起来的,这个时候,就需要抽象出时间轴上的帧这一概念

# 时间轴上的帧

通过插值计算出来的动画,通常是基于数学公式作为黑盒,时间作为输入,动画数据作为输出而存在的。 所以可以得出这样一个结论,实际的基于插值的动画中,若抽象出帧的概念, 就需要知道每帧在整个动画时间段内的时间点 这样其实就可以用下述代码简单的描述基于时间轴的帧概念

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private void UpdateAnimation()
{
AnimationClip clip = GetCurrentAnimationClip();
int frameIndex = frameSelectIndex;
if (clip == null frameIndex < 0)
{
return;
}

float time = frameIndex * setting.frameRate;

var state = currentState;

Animator animator = GetAnimator();
clip.SampleAnimation(animator.gameObject, time);
}

(编辑器来自 https://github.com/PxGame/XMLib.AM)

  1. 可以从编辑器里看出,Animation 被抽象成了数个帧,其中每个帧到上一个帧的时间间隔是 0.033s

  2. 可以从代码中看出,通过帧的下标 (第几帧) 可以计算出当前帧在时间轴上的时间点是多少

  3. 将时间点传给 Animation, 可以得到对应的动画数据

这样一来,就可以完成 时间 -> 帧 的转换