首先最基础的是帧速设置:单位fps,帧每秒。这个帧速代表了一种制式标准。PAL是25帧/秒。NTSC是30帧/秒。播放速度设置就不说了,作用是在帧速基准确定的基础上,快速地将帧速以某些特定的倍数改变,以影响播放体验,然而也仅仅是用来影响播放体验,不播放时,这个设置的改变不会有任何卵用。时间捕捉设置我们先不说。重中之重我们要先来理解“帧速”这个概念。
要讲清楚“帧速”这个概念,我先说“播放”这个概念。不管什么类型的数据,我将其称为图片数据的话,那么就可以笼而统之的讲:播放就是从一堆摞好的图片中,取最上面的一张贴在屏上给大家看,看了一段时间后,撤掉这张照片,从摞好的图片中再取最上面的一张贴在屏上给大家看,如此循环,直到这堆照片都被看过。那么这里就有几个问题出来了:每张照片在屏上贴多久后才贴下一张照片到屏上?每张照片在屏上贴的时间一样长么?
关于第二个问题,目前动画里我们可以明确:每张照片在屏上贴的时间一样长。
关于第一个问题,就是我的“播放速度”的概念。我可以随便定义一个数,一张照片贴1天,那么我的“播放速度”就是1张每天,或1天每张,没关系。不过,物理上来讲,速度的概念一般其单位的分母都是时间单位,所以我们的“播放速度”就定义为1张每天吧。帧速这个概念其实就是我的“播放速度”的概念。但是外国人的“一张一张”的说法在英文里是“one frame by frame”,他们把“张”叫做“Frame”。所以,按照他们的说法,我这里的播放速度就是1帧每天,可以写为1fpd(1 frame per day). 上面图里的30 fps按照我的播放速度的说法就是30张每秒。你可以想象按照这个速度我贴了图片再撕掉贴下一张得忙成啥样。这里还得注意一下,30张每秒,蕴含的一个意思是一张照片贴在屏上展示的时间是(1÷30)秒,我忽略掉了其他操作的时间,比如撕照片的动作等等。所以,在这里,如果我把“播放速度”定义为每张照片在屏上停留展示的时间,那么(1÷30)秒每张与我把“播放速度”定义为1秒播放30张是等价的。然而这些个领域的人采用的是后一种定义方式,即“播放速度”描述的是1秒播放多少张,单位就是fps。注意这些描述能正确的前提是每张照片在屏上贴的时间一样长,即匀速播放。
上面就是“帧速”的概念。
那么“播放”这个动作在播放器领域的具体实现细节,我还是没讲。其实,懂得这个小细节,才能更传神的理解“播放速度”或者“帧速”的概念。“播放”是被“时间”驱动的—就是这么个小细节。意思就是:一个时间轴,上面有个小滑块,播放器永远只展示这个小滑块所指示的那张图片,滑块不动,播放器的画面就不动!你要播放哪张图片,就把小滑块移动到哪张图片那儿。而我们见到的播放画面之所以连续,其实是因为小滑块主动运动在先,播放器探测到滑块的变动在后,然后才展示滑块指示的那张图片。当然,我刚才那句话里有个bug:时间轴上的滑块,其指示的应该是时间,而不应该是图片。而我强调说滑块指示的是图片,那就是蕴含着这么一层意思:时间轴上的时间点与一堆图片之间有个对应关系,图片分布在时间点上。这个对应关系就是“帧速”要表达的东西。30fps表达的就是:0秒刻度对应第一张图片,(1÷30)秒对应第二张图片,(2÷30)秒对应第三张图片,……,以此类推。而我的小滑块按照定时器的设置,以(1÷30)秒的时间间隔,不断跳到下一个时间点,进而被播放器捕捉到它的跳动,最后实现播放图片的更新。
我一定要说这个细节,是因为图片中最后那个“时间捕捉设置”在理解了这个播放细节后,就特别容易理解了。这里还得补充一个Motion Builder里的一个我观察到的常识:时间轴上每两帧之间被隐形的插入了99帧,即看得见的一帧如果编号为0:00的话,那么看得见的下一帧编号应该是1:00,中间被MoBu插入的隐形帧的编号分别为0:01,0:02,0:03,…,0:99。“时间捕捉设置”就是控制我们的滑块看不看得见这些隐形的帧。比如No Snap,就是代表我们的滑块看得见这些隐形的帧,其表现出来的现象就是:我们拖动时间滑块,或者播放时,滑块会在所有看得见的帧和隐形的帧上跳动,因为它看得见所有的帧嘛。Snap on Frames,就是代表我们主动拖动滑块时,我们的滑块看不见这些隐形的帧,其表现出来的现象就是:我们主动拖动滑块时,滑块只能在看得见的帧之间跳动,不会停留在隐形帧上。Play on Frames,就是代表我们点击播放按钮进行播放时,我们的滑块看不见这些隐形的帧,其表现出来的现象就是:我们点击播放按钮播放时,我们的滑块只会在看得见的帧之间跳动,不会停留在隐形帧上。Snap & Play on Frames,就是说无论是我们主动拖动小滑块,还是点击播放按钮进行播放,我们的滑块都看不见隐形的帧,其表现就不用说了。
理解这些东西,最好的方式就是在场景里放置一个方块模型,将帧速设置为1fps,S设为0,E设为5,在这6帧上都K一下,记录模型在不同帧上的不同位置、旋转和缩放信息。改变“时间捕捉设置”的选项,进行拖动滑块操作或点击播放操作,就很清晰地看到我说的这些东西了。而MoBu所谓的自动插值其实就是进行在我刚才说的这些“隐形帧”身上,这还是不太准确,更准确的是插值是在关键帧之间的所有看得见和隐形的帧身上进行的。然后,我们把帧速改为30fps,会发现K的关键帧会重新站位,原先的0,1,2,3,4,5 这6帧,会分别站到0,30,60,90,120,150这6帧。这个重新站位的规律应该是:动画时间长度保持一致,这是核心,因此帧速从1fps变成30fps时,5秒的动画的帧从0~5扩充成了0~150,关键帧的站位规律是保持时间比例的一致,即原先的key-1从1/5秒处(帧号1)保持在新的1/5秒处(帧号30)。只要保持住这几个核心的东西,MoBu的额外的插值工作等等就很容易实现了。包括建立在这些东西之上的动画曲线的调整等等,都没有任何理解难度可言了。
从这张小小的图片上,我写了这么多。会是我过度解读么?我认为并不是。正是上面这些理解,让我突然觉得MoBu操作起来也挺顺手了,没那么难以学习。
反复看了几遍,觉得“帧速”这个概念并不是太准确,用“频率”这个概念更准确些。所以,我觉得“帧频”比“帧速”要好。