18. 动态生成基础#
在前面的部分中,我们关注的都是静态的场景,而在本部分我们将学习如何生成动态的场景序列。与之前内容最大的不同在于,动态生成会引入一个新的维度——时间;物体状态随着时间而变化,才能够让场景“活”起来。我们在自然界中看到的绝大多数物体的运动都是连续的,即,若将物体的状态(如位置、朝向、形状等)表示成关于时间的函数,那么这个函数在我们关注的一段时间区间 \([t_l,t_r]\) 内任意一点都是有定义的。然而,任何一段时间区间都会包含无穷多个时刻,我们无法使用计算机有限的内存精确地表达场景的运动。万幸的是,人类视觉对运动的感知能力也是有限的:视觉神经网络的视觉暂留(persistence of vision)特性会导致人类无法注意到过快的视觉变化,而频闪效应(stroboscopic effect)则表明物体的影像在以足够高的频率呈现给视觉系统时,人类将会从心理上产生对运动的感知。因此,我们只需要以足够高的频率采样时间区间 \([t_l,t_r]\) 得到一些离散的时刻 \(\{t_0,t_1,\cdots,t_{N-1}\}\subset[t_l,t_r]\),并表示出这些时刻下物体的状态,即可将问题转变成有限的规模了。
jr: 视觉暂留和频闪效应,二者都来自维基百科(https://en.wikipedia.org/wiki/Persistence_of_vision & https://en.wikipedia.org/wiki/Stroboscopic_effect)。
为了得到一段视觉上连续的动画,我们需要对上述每一个时刻的场景都渲染成图像,这样的图像又称为帧(frame)。在动画或电影中,大量的帧会被快速地依次展现给观众,这个展现的速度由帧率(frame rate)定量地描述,帧率通常表示为一秒钟显示的帧数(frame per second,FPS)。我们平常观看的电影帧率大多是每秒 \(24\) 帧,在帧率不少于这个数量时,我们就会认为图像是连续的;但随着帧率的增加,我们是能够感受到画面流畅度的提升的,游戏的帧率一般要求达到每秒 \(60\) 帧才能保证玩家的体验。对于电影或动画而言,播放的场景序列是固定的,所以每一帧都可以预先花费任意长的时间制作好,称为离线(offline)计算,在播放电影时只需按顺序以特定的帧率显示即可;在这种情形下,序列的总时长一定,帧率越高则需要预计算的量就越大,所需要的制作成本也就越高。对于游戏而言,由于场景会受到玩家交互的影响,所以每一帧都是由上一帧的状态以及玩家的输入在线(online)计算而得的;这样的情形下,帧率越高对设备和算法的实时计算效率就会有更高的要求。
无论在游戏还是影视当中,场景的动态都可以主要分成两个部分:主观动态和物理动态。前者指的是场景中具有自主行动能力的角色自发产生的动态,后者指的是环境当中遵循物理定律的物体进行的运动。主观动态构成了动态生成内容最基本的框架和语义,物理动态则会让整个场景更加真实,我们将在本部分中分别对它们进行介绍。