计算机图形学基础-16-计算机动画

《Fundamentals of Computer Graphics》5th(计算机图形学基础/虎书),中文翻译。

第 16 章 Computer Animation 计算机动画

动画源自拉丁语“anima”,意为赋予生命、兴趣、精神、运动或活动的行为、过程或结果。运动是生命的定义性属性,而真正的动画艺术很大程度上关乎如何通过运动来讲述故事、展示情感,甚至表达人物细节。计算机是实现这些目标的辅助工具——它是一种熟练动画师可以利用的工具,可以帮助他更快地获得想要的结果,而不必专注于他不感兴趣的技术细节。没有计算机的动画现在经常被称为“传统”动画,它有着自己悠久而丰富的历史,由数百名仍在从事这项艺术的人们不断地书写。与任何已确立的领域一样,一些经得起时间考验的规则已经被凝结出来,给出了高层次的一般指导,告诉我们应该如何做某些事情以及应该避免什么。这些传统动画原则同样适用于计算机动画,我们将在本章中讨论其中的一些。

然而,计算机不仅仅是一种工具。除了使动画师的主要任务变得不那么乏味外,计算机还增加了一些真正独特的能力,在此之前这些能力是不存在或极难获得的。现代建模工具可以相对轻松地创建详细的三维模型,渲染算法可以产生从完全逼真到高度风格化的各种外观,强大的数值模拟算法可以帮助制作特别难以动画化的物体所需的基于物理的运动,而运动捕捉系统则赋予了记录和使用真实运动的能力。这些发展导致计算机动画技术在电影和商业广告、汽车设计和建筑、医学和科学研究等许多领域中得到了爆炸性的应用。也出现了全新的领域和应用,包括完全由计算机动画制作的特色电影、虚拟/增强现实系统以及当然还有计算机游戏。

本书的其他章节更直接地涵盖了上述许多发展(例如几何建模和渲染)。在这里,我们将仅提供用于创建和操纵运动的技术和算法的概述。特别是,我们将松散地将计算机动画分为四个主要方法,并简要描述它们。

  • 关键帧技术 (Keyframing) 为动画师提供了最直接的控制,他们在一些时间点提供必要的数据,计算机则填充其余部分。
  • 过程动画 (Procedural) 涉及特别设计的、经常是经验性的数学函数和程序,其输出类似于某个特定的运动。
  • 基于物理的技术 (Physics-based) 解决了运动微分方程。
  • 动作捕捉 (Motion capture) 使用特殊的设备或技术记录现实世界的运动,然后将这种运动转换为计算机模型的运动。

我们在这里并不涉及该领域的艺术方面。总的来说,在创建计算机动画方面,我们根本无法做得比划破表面更多。我们希望真正对该主题感兴趣的读者可以在超出本章材料的范围内继续他们的旅程。

16.1 动画原则

在他 1987 年的 SIGGRAPH 论文(Lasseter, 1987)中,约翰·拉赛特引入了自 20 世纪 30 年代以来沃尔特·迪士尼工作室传统动画师所开发的关键原则,向当时刚刚起步的计算机动画社区介绍了这些原则。提到了 12 种原则:

  1. 压缩和伸展 (squash and stretch)
  2. 时间 (timing)
  3. 预期 (anticipation)
  4. 跟随和重叠动作 (follow through and overlapping action)
  5. 快进和快出 (slow-in and slow-out)
  6. 舞台设置 (staging)
  7. 弧线 (arcs)
  8. 次要动作 (secondary action)
  9. 直接绘制和姿态到姿态的动作 (straight-ahead and pose-to-pose action)
  10. 夸张 (exaggeration)
  11. 实体绘制技能 (solid drawing skill)
  12. 吸引力 (appeal)

将这些经过时间考验的规则应用到动画中,可以使其与机械化和乏味的动画有所区别,更加自然和有趣。此外,对于计算机动画来说,非常重要的是平衡动画师获得的控制和灵活性与计算机能力的充分利用之间的关系。尽管这些原则广为人知,但实际上有许多因素影响了这些规则在实践中受到的关注程度。虽然电影角色动画师可能会花费很多时间尝试遵循这些建议(例如,微调时间以达到恰当的效果),但许多游戏设计师往往认为他们的时间在其他方面更有价值。

16.1.1 时间控制

时间控制,或动作的速度,在任何动画中都是核心。事情发生的快慢影响着动作的意义、情感状态,甚至会影响到所涉及的物体的感知重量。根据其速度,同样的动作 —— 例如一个角色的头从左转向右 —— 可以表示从被重物击中的反应到慢慢地寻找书架上的书或伸展颈部肌肉等任何不同的含义。设置适合特定动作的时间非常重要。动作应该占用足够长的时间来引起注意,同时避免过于缓慢和可能令人无聊的运动。对于涉及录制声音的计算机动画项目,声音提供了自然的时间锚点。事实上,在大多数制作中,演员的声音先被录制下来,然后将完整的动画与这个录音同步。由于大而重的物体倾向于比小而轻的物体移动得更慢(更准确地说是加速度更小),时间可以用来为物体的重量提供重要信息。

16.1.2 动作布局

在动画的任何时刻,观众都应该清楚地知道正在呈现什么样的想法(动作、情绪、表情)。良好的舞台设计或动作的高级规划应该引导观众的目光看到当前重要的动作所在位置,有效地告诉他“看这个,现在看这个”,而不使用任何文字。对人类感知的一些了解可以帮助我们完成这项艰巨的任务。由于人类视觉系统主要对相对变化而非绝对值的刺激做出反应,静态环境中的突然运动或繁忙场景中某些部分的缺乏运动自然吸引注意力。同样的动作如果以物体的轮廓线在改变的方式展示,则通常比正面排列(见图 16.1(左下方))更加引人注目。

fig11_1.jpg

图 16.1 动作布局。左:适当地进行舞台设计对于吸引观众的注意力非常重要。举手之类的动作在上面会更加突出,但在下面则更难注意到。相反,鼻子长度的变化在第一种情况下可能完全不可见。注意,这可能是有意隐藏的,例如,以便稍后突然揭示。如果两个动作都需要关注,则两种排列方式都不是特别好的选择。中间:预期的程度可以说明接下来的动作。即将发生的动作(投掷球)非常短暂,但很清楚即将发生什么。角色预备越充分,后续动作被感知为越快。右:后续阶段对于次要附属部件(头发)的运动尤其重要,因为它们的运动跟随主导部分(头部)。头部的运动非常简单,但却带来了头发本身非常复杂的后续行为。在这种情况下,没有后续阶段和重叠动作就不可能创建自然的动画。图片由 Peter Shirley 和 Christina Villarruel 提供。

在稍低的层次上,每个动作可以分为三个部分:预期(准备动作)、动作本身和后续(动作终止)。在许多情况下,动作本身是最短暂且在某种意义上最不有趣的部分。例如,踢足球可能需要踢球者广泛准备,并长时间“视觉跟踪”离开的球,有充足的机会展示这一时刻的压力、踢球者的情感状态,甚至是对动作预期结果的反应。在这种情况下,动作本身(踢球的腿部动作)相当简单,只需占用一小部分时间。

预期的目标是为即将发生的事情做好准备。如果动作本身非常快、非常重要或极其困难,则创建更广泛的预期可以强调这些属性,在快速事件的情况下确保不会错过动作(参见图 16.1(中下方))。

在现实生活中,主要动作通常会引起一个或多个其他重叠的动作。物体的不同附属部件或松散部分通常会拖在主导部分的后面,在主要动作的后续部分仍然保持运动,如图 16.1(右下方)所示。此外,下一个动作通常会在前一个完全结束之前开始。一个玩家可能在他还在追踪他刚踢的球时就开始奔跑。忽略这种自然流动通常被认为就像在动作之间有暂停一样,并可能导致机器人般的机械运动。虽然重叠是保持运动自然所必需的,但动画师经常添加次要动作使运动更有趣并实现动画的现实复杂性。重要的是不要让次要动作支配主要动作。

16.1.3 动画技术

有几种特定的技术可用于使运动看起来更自然。最重要的可能是挤压和拉伸,它建议在物体移动时以特定方式改变其形状。一般会在物体运动方向上拉伸,当力施加到物体上时挤压,如图 16.2 所示的经典弹跳球动画。在此过程中保持总体积非常重要,以避免产生物体增大或缩小的幻觉。运动速度(或力量)越大,拉伸(或挤压)的应用越多。这种变形有几个原因。对于非常快的运动,物体可以在两个连续帧之间移动得太快,以至于在当前帧和前一帧的时间点上,物体之间没有重叠,这可能导致闪烁(一种走样的变体)。在物体沿运动方向延长可以确保更好的重叠,并帮助眼睛对抗这种不愉快的效果。拉伸/挤压也可以用于显示物体的柔韧性,对于更易塑性的材料,可以应用更多的变形。如果物体旨在显得坚硬,则在其运动时其形状通常保持不变。

fig11_1.jpg

图 16.2:应用压缩和拉伸原理的典型示例。请注意,弹跳球的体积在整个动画期间应保持大致相同。

自然运动很少沿着直线发生,因此在动画中通常应避免这种情况,而应使用弧线。同样,没有任何真实的运动可以瞬间改变其速度 —— 这需要施加无限多的力量到物体上。在动画中也应避免这种情况。特别是,运动应逐渐开始和结束(缓慢进入和退出)。虽然手绘动画有时通过直接作用完成,即动画师从第一帧开始,按顺序一帧接一帧地绘制,直到结束,但姿势到姿势的动作,也称为关键帧,对于计算机动画更为合适。在这种技术中,动画通过一系列相对稀疏的关键帧进行精心规划,关键帧设置后只填充其余动画(中间帧)。这允许更精确的时间安排,并允许计算机利用下一节中介绍的算法接管最繁琐的部分 —— 创建中间帧。

fig11_1.jpg

图 16.3 关键帧(上)鼓励详细的动作规划,而直接操作(下)会导致更自发的结果。

几乎任何上述技术都可以在一定程度上夸张使用,以实现更大的艺术效果或强调动作或角色的某些特定属性。最终目标是实现观众想看的东西,即吸引人的东西。过于复杂或对称的角色或动作往往不那么吸引人。为了获得良好的结果,传统动画师需要坚实的绘画技巧。类似地,计算机动画师应当理解计算机图形学,并且具有所使用工具的扎实知识。

16.1.4 人工控制与自动方法

在传统动画中,动画师完全掌握制作过程的所有方面,没有任何事物阻止最终产品在每个细节上都按计划完成。这种灵活性付出的代价是每一帧都是手工制作的,导致这项工作非常耗时和费力。在计算机动画中,存在明显的权衡,在一方面给动画师更直接的控制权,但要求他做出更多的工作,在另一方面则依赖于更自动的技术,这些技术可能只需要设置少量输入参数,但对结果的某些属性几乎没有或根本没有控制。一个好的算法应该提供足够的灵活性,同时只询问动画师直观、易于提供的信息,并且他自己感觉必要以实现所需的效果。虽然在实践中完全遵守这个要求不太可能,因为这可能需要接近一种读心机器,但我们鼓励读者从提供这种平衡的角度评估任何计算机动画技术。

16.2 关键帧动画

当应用于 3D 计算机动画时,关键帧动画这个术语可能会产生误导,因为通常不涉及实际完成的帧(即图像)。在任何给定时刻,一个被动画化的 3D 场景由一组数字指定:所有对象的中心位置、它们的 RGB 颜色、每个对象在每个轴上应用的缩放量、复杂对象不同部分之间的建模变换、摄像机位置和方向、光源强度等。为了动画化场景,其中一些值必须随时间改变。当然,可以直接在每一帧设置这些值,但这并不是特别有效率。因此,在动画时间线上为每个参数选择一些重要的时刻(关键帧 tkt_k),并仅为这些选定的帧设置该参数的值(关键值 fkf_k)是更好的方法。我们将关键帧和关键值 (tk,fk)(t_k, f_k) 的组合简称为“关键”。不同参数的关键帧不必相同,但同时设置某些参数的关键帧往往是逻辑的。例如,对于特定对象的 xxyyzz 坐标选择的关键帧可能恰好在形成单个位置向量关键帧 (tk,pk)(t_k, p_k) 的相同帧上设置。然而,这些关键帧可能与用于该对象方向或颜色的关键帧完全不同。关键帧之间越接近,动画师对结果就有更多的控制;但是,需要评估设置更多的关键帧所需的成本。因此,在相对简单的部分之间通常有较大的关键帧间隔,而在复杂动作发生的间隔中集中它们,如图 16.4 所示。

fig11_1.jpg

图 16.4。可以同时为同一场景使用不同的关键帧设置模式(上方的黑色圆圈)。假设在此部分之前以及之后有更多的帧。

动画师设置关键帧 (tk,fk)(t_k, f_k) 后,系统必须计算所有其他帧的 ff 值。虽然我们最终只关心一组离散值,但将其视为经典的插值问题,即通过提供的数据点拟合连续的动画曲线 f(t)f(t)(如图 16.5 所示),是比较方便的。曲线拟合算法的广泛讨论可以在第 15 章中找到,这里不再赘述。由于动画师最初只提供了关键帧而没有导数(切线),因此从关键帧直接计算所有必要信息的方法更适合用于动画。沿着曲线的参数变化速度由曲线相对于时间的导数 df/dtdf/dt 给出。因此,为避免速度突然跳变,通常需要 C1C^1 连续性。从动画曲线来看,通常不需要更高程度的连续性,因为二阶导数,即加速度或施加力,可能在现实世界的情况下经历非常突然的变化(球撞击固体墙),而更高阶导数并不直接对应任何物理运动的参数。这些考虑使得 Catmull-Rom 样条成为最佳选择之一,用于初始动画曲线的创建。

fig11_1.jpg

图 16.5。尽管只关心帧位置的值,但通过动画师提供的关键帧拟合出一条连续的曲线 f(t)。该函数的导数给出参数变化的速度,最初由拟合过程自动确定。

大多数动画系统都允许动画师对初步曲线进行交互式微调,包括插入更多关键帧、调整现有关键帧或修改自动计算的切线等。另一个有用的技术是 TCB 控制(TCB 代表张力、连续性和偏移)。其思想是引入三个新的参数,可以通过协调调整此点处的入射和出射切线来修改关键帧附近的曲线形状。对于时间间隔为 ΔtΔt 的均匀间隔的关键帧,内部关键帧 (tk,fk)(t_k, f_k) 处的标准 Catmull-Rom 表达式的入射 TiinT_i^{in} 和出射 TioutT_i^{out} 切线可以重新编写为

Tkin=Tkout=12Δt(fk+1fk)+12Δt(fkfk1)T_{k}^{i n}=T_{k}^{o u t}=\frac{1}{2 \Delta t}\left(f_{k+1}-f_{k}\right)+\frac{1}{2 \Delta t}\left(f_{k}-f_{k-1}\right) \text {. }

TCB 样条的修改切线为

Tkin=(1t)(1c)(1+b)2Δt(fk+1fk)+(1t)(1+c)(1b)2Δt(fkfk1)Tkout=(1t)(1+c)(1+b)2Δt(fk+1fk)+(1t)(1c)(1b)2Δt(fkfk1)\begin{aligned} T_{k}^{i n} & =\frac{(1-t)(1-c)(1+b)}{2 \Delta t}\left(f_{k+1}-f_{k}\right)+\frac{(1-t)(1+c)(1-b)}{2 \Delta t}\left(f_{k}-f_{k-1}\right) \\ T_{k}^{o u t} & =\frac{(1-t)(1+c)(1+b)}{2 \Delta t}\left(f_{k+1}-f_{k}\right)+\frac{(1-t)(1-c)(1-b)}{2 \Delta t}\left(f_{k}-f_{k-1}\right) \end{aligned}

张力参数 tt 通过缩放入射和出射切线来控制关键帧附近曲线的锐度。更大的切线(较低的张力)会导致关键帧附近的曲线形状更平坦。偏移 bb 允许动画师有选择地增加关键帧邻居的权重,从而使曲线在该点处更接近连接关键帧和左侧(bb 接近 11,“超调”行动)或右侧(bb 接近 1-1,“欠调”行动)邻居的直线。连续性 c 的非零值使得入射和出射切线不同,动画师可以在关键帧值处创建曲线上的折痕。实用的 TCB 参数通常限制在区间 [1;1][- 1; 1] 内,默认情况下,t=c=b=0t = c = b = 0 对应于初始的 Catmull-Rom 样条。图 16.6 显示了可能的曲线形状调整示例。

fig11_1.jpg

图 16.6。使用 TCB 控制编辑默认的插值样条(中间列)。请注意,所有关键帧保持在相同的位置。

16.2.1 运动控制

到目前为止,我们已经描述了如何通过关键帧定位和微调切线值来控制动画曲线的形状。然而,当我们想要同时控制物体移动的路径(即其轨迹)和沿此路径移动的速度时,这通常是不够的。给定一组空间位置作为关键帧,自动曲线拟合技术可以通过它们拟合出一条曲线,但由此产生的运动仅受强制性地将物体在对应的关键帧 tkt_k 上到达指定关键位置 pk\bold p_k 的限制,并且没有直接说明关键帧之间的运动速度。这可能会引起问题。例如,如果一个物体沿着 xx 轴以每秒 11 米的速度移动 1 秒钟,然后以每秒 1 米的速度移动 9 秒钟,它将在 10 秒钟后到达位置 x=20x = 20,从而满足动画师设置的关键帧 (0,0)(0,0)(10,20)(10,20)。这种抖动的运动实际上很少是所期望的,而速度为每秒 2 米的匀速运动可能更接近于动画师在设置这些关键帧时想要的。尽管通常不会显示出这种极端行为,由标准拟合过程产生的多项式曲线确实表现出关键帧之间的非匀速运动,如图 16.7 所示。虽然这对于人类视觉系统在判断变化率的不均匀性方面不太好的一些参数(例如颜色甚至旋转速率)可能是可以容忍的(在一定范围内),但对于物体位置 p\bold p 来说,我们必须做得更好,其中速度直接对应于日常体验。

fig11_1.jpg

图 16.7。所有三种运动沿着相同的二维路径,并满足黑色三角形顶部的关键帧集。白色三角形的顶点显示了 Δt=1Δt = 1 间隔处的物体位置。关键帧之间的匀速运动(顶部)可能更接近于动画师所期望的,但自动拟合过程可能导致其他两种运动中的任何一种。

首先,我们将在拟合过程中使用的曲线参数化与在动画中使用的曲线参数化进行区分。当通过位置关键帧拟合曲线时,我们将其结果写成某个参数 uu 的函数 p(u)\bold p(u)。这将描述空间中曲线的几何形状。弧长 ss 是曲线的物理长度。动画师控制沿现有曲线的运动的自然方法是指定一个额外函数 s(t)s(t),它对应于物体在任何给定时间应该沿着曲线前进的距离。为了得到实际的空间位置,我们需要另一个辅助函数 u(s)u(s),它为给定的弧长 ss 计算一个参数值 uu。计算给定时间 tt 的物体位置的完整过程由这些函数的组合给出(见图 16.8):

p(t)=p(u(s(t)))\bold p(t)=\bold p(u(s(t)))

fig11_1.jpg

图 16.8。为了在给定时间 tt 获得空间位置,首先利用用户指定的运动控制来获得沿曲线的距离 s(t)s(t),然后计算相应的曲线参数值 u(s(t))u(s(t))。现在可以使用之前拟合的曲线 P(u)\bold P(u) 来找到位置 P(u(s(t)))\bold P(u(s(t)))

可以使用几种标准函数作为距离-时间函数 s(t)s(t)。其中最简单的是对应于恒定速度的线性函数:s(t)=vts(t) = vt,其中 v=constv = const。另一个常见的例子是具有恒定加速度 aa(和初始速度 v0v_0)的运动,其由抛物线 s(t)=v0t+at2/2s(t) = v_0t + at^2/2 描述。由于这里速度逐渐变化,因此该函数可以帮助模拟理想的缓入和缓出行为。更一般地,s(t)s(t) 的斜率给出了沿曲线运动的速度,负斜率对应于反向运动沿曲线移动。为了实现最大灵活性,动画系统通常会提供交互式编辑 s(t)s(t) 的功能。距离-时间函数并不是控制运动的唯一方式。在某些情况下,对于用户来说,指定速度-时间函数 v(t)v(t) 甚至加速度-时间函数 a(t)a(t) 可能更方便。由于它们分别是 s(t)s(t) 的一阶和二阶导数,为了使用这些类型的控件,系统首先通过积分用户输入(a(t)a(t) 的情况下需要积分两次)恢复距离-时间函数。

曲线参数 uu 与弧长 ss 之间的关系由系统自动建立。在实践中,系统首先确定参数 uu 对弧长 ss 的依赖关系(即逆函数 s(u)s(u))。使用此函数,对于任何给定的 SS,可以解方程 s(u)S=0s(u) − S = 0 并获得未知 uuu(S)u(S)。对于大多数曲线,函数 s(u)s(u) 无法以闭合解析形式表示,需要进行数值积分(见第 14 章)。然后可以直接使用标准的数值根查找程序(例如 Newton-Raphson 方法)来求解方程 s(u)S=0s(u) − S = 0 以获得 uu

另一种技术是将曲线本身近似为一组在线性参数值 uiu_i 计算的点 pip_i 之间的线段集。然后创建一个近似弧长的表

s(ui)j=1ipjpj1=s(ui1)+pipi1.s\left(u_{i}\right) \approx \sum_{j=1}^{i}\left\|\mathbf{p}_{\mathbf{j}}-\mathbf{p}_{\mathbf{j}-\mathbf{1}}\right\|=s\left(u_{i-1}\right)+\left\|\mathbf{p}_{\mathbf{i}}-\mathbf{p}_{\mathbf{i}-\mathbf{1}}\right\| .

由于 s(u)s(u)uu 的非降函数,因此可以通过简单搜索表格(见图 16.9)来找到包含值 SS 的区间。然后对区间的 uu 端点进行线性插值,最终找到 u(S)u(S)。如果需要更高的精度,可以以此值为起始点应用几步 Newton-Raphson 算法。

fig11_1.jpg

图 16.9。为了创建 s(u)s(u) 的表格版本,可以通过在等参数增量处放置曲线上的点连接一些线段来近似曲线。搜索表格以查找给定 SSuu 区间。例如,对于上图中的曲线,与位置 S=6.5S = 6.5 相对应的 uu 值位于 u=0.6u = 0.6u=0.8u = 0.8 之间。

16.2.2 插值旋转

上面介绍的技术可用于插值大多数描述场景的参数设置。三维旋转是一种重要的运动,对于其更专业的插值方法和表示方式很常见。原因是将标准技术应用于 3D 旋转通常会导致严重的实际问题。旋转(物体方向的改变)是唯一一个使物体形状保持不变的除平移之外的运动。因此,在动画刚体物体时,它扮演着特殊的角色。

有几种方法可以指定物体的方向。首先,可以使用第 6 章中描述的变换矩阵。不幸的是,对于旋转矩阵的朴素(逐元素)插值不会产生正确的结果。例如,处于 2D 顺时针和逆时针 90 度旋转之间的“中间”矩阵是空矩阵:

12[0110]+12[0110]=[0000]\frac{1}{2}\left[\begin{array}{cc} 0 & 1 \\ -1 & 0 \end{array}\right]+\frac{1}{2}\left[\begin{array}{cc} 0 & -1 \\ 1 & 0 \end{array}\right]=\left[\begin{array}{ll} 0 & 0 \\ 0 & 0 \end{array}\right]

当然,正确的结果是对应于没有旋转的单位矩阵。其次,可以将任意方向指定为围绕选定特定顺序的坐标轴的三个旋转。这些轴可以固定在空间中(固定角度表示)或嵌入到物体中,因此在每次旋转后会发生变化(欧拉角表示如图 16.10 所示)。这三个旋转角度可以直接通过标准关键帧设置进行动画,但会出现一个称为万向节锁定的微妙问题。如果在旋转过程中有三个旋转轴之一由于偶然而与另一个轴对齐,则会减少可用自由度数量,如图 16.11 所示的物理装置。这种效应比人们想象的要常见得多-向右(或向左)旋转 90 度可能会将物体潜在地放入万向节锁定状态。最后,可以通过选择适当的空间轴和绕该轴旋转的旋转角度来指定任何方向。虽然在此表示中进行动画相对简单,但是组合两个旋转即找到相应于由轴和角度表示的两个旋转的顺序的轴和角度是非平凡的。已开发了一种特殊的数学工具,四元数,使该表示方法适合将多个旋转组合成一个旋转,并用于动画。

fig11_1.jpg

图 16.10。通过围绕嵌入到物体中的坐标轴的三次旋转(轴 Y 始终指向圆锥的尖端)序列,可以使用三个欧拉角来指定任意物体方向。请注意,每个旋转都在新坐标系中给出。固定角度表示非常相似,但是它使用的坐标轴固定在空间中,不会随着物体旋转而旋转。

fig11_1.jpg

图 16.11。在此示例中,当沿 ZZ 轴旋转 9090 度时会发生万向节锁定。现在,XXYY 旋转都围绕相同的轴进行,从而导致失去一个自由度。

给定 3D 向量 v=(xyz)v = (x,y,z) 和标量 s,可以通过将两者结合成为一个四元数 q=[sxyz]=[s;v]q = [s x y z] = [s; v]。然后为四元数定义了几个新操作。四元数加法仅分别求和标量部分和向量部分:

q1+q2[s1+s2;v1+v2]q_{1}+q_{2} \equiv\left[s_{1}+s_{2} ; \mathbf{v}_{\mathbf{1}}+\mathbf{v}_{\mathbf{2}}\right]

乘以标量 aa 会产生一个新的四元数

aq[as;av]a q \equiv[a s ; a \mathbf{v}]

更复杂的四元数乘法定义为

q1q2[s1s2v1v2;s1v2+s2v1+v1×v2]q_{1} \cdot q_{2} \equiv\left[s_{1} s_{2}-\mathbf{v}_{1} \mathbf{v}_{2} ; s_{1} \mathbf{v}_{2}+s_{2} \mathbf{v}_{\mathbf{1}}+\mathbf{v}_{\mathbf{1}} \times \mathbf{v}_{2}\right]

其中 ×× 表示向量叉积。很容易看出,类似于矩阵,四元数乘法是可结合的但不是交换的。我们主要关心归一化的四元数-其四元数范数 q=s2+v2|q|= \sqrt{s^2 + \bold v^2} 等于 11。我们需要的最后一个定义是逆四元数:

q1=(1/q)[s;v]q^{-1}=(1 /|q|)[s ;-\mathbf{v}]

为了表示通过从原点穿过以规范化向量 nn 给出方向的轴旋转角度 φφ,形成归一化四元数

q=[cos(ϕ/2);sin(ϕ/2)n]q=[\cos (\phi / 2) ; \sin (\phi / 2) \mathbf{n}]

将点 p\bold p 旋转时,将其转换为四元数 qp=[0;p]qp = [0; \bold p] 并计算四元数乘积

qp=qqpq1q_{p}^{\prime}=q \cdot q_{p} \cdot q^{-1}

它保证具有零标量部分和旋转点作为其向量部分。组合旋转仅由表示各个单独旋转步骤的四元数的乘积给出。要使用四元数进行动画,可以将它们视为四维空间中的点,并直接在该空间中设置关键帧。严格来说,为了保持四元数的归一化,应将插值程序限制为该 4D 空间中的一个单位球(3D 对象)。但是,即使是线性插值的球形版本(通常称为 slerp)也会导致相当不愉快的数学问题。在实践中,简单的 4D 线性插值,然后投影到单位球上(如图 16.12 所示)要简单得多,并且通常足够。可以通过重复应用使用 de Casteljau 算法的线性插值过程来获得更平滑的结果。

fig11_1.jpg

图 16.12。插值四元数应在 4D 空间中嵌入的 3D 单位球面上执行。然而,沿着 4D 直线(开放圆圈)进行简单插值,然后重新将结果投影到球面上(黑色圆圈),通常是足够的。

16.3 变形

锥形扭曲虽然对象变形的技术可能更适合作为建模工具来处理,但它们传统上与动画方法一起讨论。可能最简单的改变物体形状的操作是非均匀缩放。更普遍地,可以应用某些函数到指定物体的所有点的局部坐标(即三角网格的顶点或样条曲面的控制多边形),重新定位这些点并创建新形状:p=f(p,γ)\bold p' = f (\bold p,γ),其中 γγ 是由变形函数使用的参数向量。选择不同的 ff(并通过依次应用一个函数组合它们)可帮助创建非常有趣的变形。有用的简单函数示例包括弯曲、扭曲和锥形,如图 16.13 所示。在这种情况下,通过关键帧设置变形函数的参数,形状变化的动画非常容易实现。该技术的缺点包括难以为某些非标准变形选择数学函数以及所得变形是全局的,也就是说整个对象,而不仅仅是其中的一部分重新塑形。

fig11_1.jpg

图 16.13。全局变形的常见示例。弯曲和扭转角度以及锥形程度都可以进行动画处理,以实现动态形状变化。

为了在提供更直接的控制结果的同时局部变形对象,可以选择单个顶点,将其移动到新位置并调整某些邻域内的顶点以跟随种子顶点。由变形函数计算在物体表面上(通常)通过距离递减来控制受变形影响的区域和不同部分的特定位移量到种子顶点。种子顶点运动可以设置关键帧来产生动画形状变化。

一种更普遍的变形技术称为自由形变(FFD)(Sederberg&Parry,1986)。首先建立一个本地(在大多数情况下是直线)坐标网格来封装要变形的对象部分,并相对于这个网格计算出所有相关点的坐标 (s,t,u)(s,t,u)。然后用户自由重塑格点 Pijk\bold P_{ijk} 的网格成为一个新的扭曲格点 Pijk\bold P_{ijk}'(如图 16.14 所示)。使用在三元 Bézier 插值器(请参阅第 15 章)中计算出的原始未扭曲网格中的坐标重新构建对象,其中扭曲格点 Pijk\bold P_{ijk}' 在此表达式中作为控制点:

P(s,u,t)=i=0L(iL)(1s)Lisij=0M(jM)(1t)Mjtjk=0N(kN)(1u)NkukPijkP(s, u, t)=\sum_{i=0}^{L}\left(\begin{array}{c} i \\ L \end{array}\right)(1-s)^{L-i} s^{i} \sum_{j=0}^{M}\left(\begin{array}{c} j \\ M \end{array}\right)(1-t)^{M-j} t^{j} \sum_{k=0}^{N}\left(\begin{array}{c} k \\ N \end{array}\right)(1-u)^{N-k} u^{k} \mathbf{P}_{\mathbf{i j k}}^{\prime}

fig11_1.jpg

图 16.14。调整 FFD 格点会导致对象的变形。

其中 L,M,NL,M,N 是每个维度中网格点的最大索引。实际上,该格点在变形目的下充当物体的低分辨率版本,通过相对较少的直观调整实现任意复杂对象的平滑形状变化。FFD 格点本身可以被系统视为常规对象,并且可以进行变换、动画和甚至进一步变形(如果必要),导致与所附加到的对象相应的更改。例如,将表示凸起的原始格点和扭曲格点组成的变形工具沿物体移动会导致凸起沿物体移动。

16.4 角色动画

关节式人物的动画通常是通过关键帧和专用变形技术的组合来完成的。用于动画的角色模型通常包括至少两个主要层,如图 16.15 所示。外壳或皮肤的高度详细表面的运动是最终产品中观众将要看到的。它下面的骨架是一个关节的分层结构(树),提供了一个人物的运动模型,仅用于动画。在某些情况下,在骨架和皮肤之间插入额外的中间层(粗略地对应于肌肉)。

fig11_1.jpg

图 16.15。 (左)关节的分层结构,骨架,作为角色的运动抽象;(中)重新定位骨架会变形附加到其上的单独皮肤对象;(右)树数据结构用于表示骨架。为了紧凑,隐藏了几个节点的内部结构(它们与相应的兄弟节点相同)。

骨架的每个关节都充当下面层次结构的父级。根表示整个角色,并直接定位在世界坐标系中。如果有将一个关节与其父级在层次结构中相关的本地变换矩阵,则可以通过沿着从根到关节的路径连接变换来获取将任何关节的局部空间与世界系统(即根系统)相关联的变换。为了评估整个骨架(即找到所有关节的位置和方向),执行完整关节树的深度优先遍历。变换堆栈是帮助完成此任务的自然数据结构。在向下遍历树时,当前组合矩阵被推入堆栈中,并创建一个新的矩阵,方法是将当前矩阵乘以存储在关节处的矩阵。在返回到父节点之前,应该撤销这个额外的变换,然后再访问另一个分支;这很容易通过简单地弹出栈来完成。尽管此用于评估层次结构的通用且简单的技术在计算机图形学中得到广泛使用,但在动画(和机器人学)中它被赋予了特殊名称-正向运动学(FK)。虽然可以使用所有变换的通用表示,但通常使用专门的参数集,例如链接长度或关节角度,来指定骨架。为了使用正向运动学进行动画,直接操纵所有关节的旋转参数。该技术还允许动画师改变关节之间的距离(链接长度),但应该注意,这对应于肢体伸展,经常看起来相当不自然。

正向运动学要求用户设置涉及运动的所有关节的参数(图 16.16(上))。然而,大多数这些关节都属于层次结构的内部节点,它们的运动通常不是动画师想要担心的事情。在大多数情况下,动画师只想让它们自然地“自己移动”,并且更感兴趣的是指定关节链的端点的行为,这通常对应于执行特定操作的东西,例如脚踝或手指尖。动画师更希望系统自动从终端执行器的运动确定所有内部关节的参数。逆向运动学(IK)正是允许我们做到这一点(见图 16.16(下))。

fig11_1.jpg

图 16.16。正向运动学(上)要求动画师将所有关节放置在正确的位置。在逆向运动学(下)中,一些内部关节的参数是基于所需的终端执行器运动计算出来的。

x\bold x 为终端执行器的位置,αα 为需要指定从根到最终关节的所有内部关节的向量参数。有时最终关节的方向也直接由动画师设置,在这种情况下,我们假设相应的变量包含在向量 x\bold x 中。然而,为了简单起见,我们将为向量编写所有特定表达式:

x=(x1,x2,x3)T\mathbf{x}=\left(x_{1}, x_{2}, x_{3}\right)^{T}

由于 x\bold x 中的每个变量都是 αα 的函数,因此它可以被写成向量方程 x=F(α)\bold x = \bold F(α)。如果我们稍微改变内部关节参数 δαδα,终端执行器位置的变化 δxδ\bold x 可以近似地写成

δx=Fαδα(16.1)\delta \mathbf{x}=\frac{\partial \mathbf{F}}{\partial \alpha} \delta \alpha \tag{16.1}

其中 Fα∂F \over ∂α 是称为雅可比矩阵的偏导数矩阵:

Fα=[f1α1f1α2f1αnf2α1f2α2f2αnf3α1f3α2f3αn].\frac{\partial \mathbf{F}}{\partial \alpha}=\left[\begin{array}{llll} \frac{\partial f_{1}}{\partial \alpha_{1}} & \frac{\partial f_{1}}{\partial \alpha_{2}} & \cdots & \frac{\partial f_{1}}{\partial \alpha_{n}} \\ \frac{\partial f_{2}}{\partial \alpha_{1}} & \frac{\partial f_{2}}{\partial \alpha_{2}} & \ldots & \frac{\partial f_{2}}{\partial \alpha_{n}} \\ \frac{\partial f_{3}}{\partial \alpha_{1}} & \frac{\partial f_{3}}{\partial \alpha_{2}} & \cdots & \frac{\partial f_{3}}{\partial \alpha_{n}} \end{array}\right] .

在每个时刻,我们知道终端执行器的所需位置(由动画师设置),当然,也知道执行器的当前位置。将两者相减,我们将得到所需的调整 δxδ\bold x。雅可比矩阵的元素与改变一个特定内部参数而其他参数保持不变时终端执行器坐标的变化有关(见图 16.17)。可以使用几何关系计算任何给定骨架配置的这些元素。方程组(16.1)中唯一未知的是内部参数α的变化。一旦我们解决了它们,我们更新 α=α+δαα = α + δα,这为 FK 过程提供了重新定位骨架所需的所有必要信息。

fig11_1.jpg

图 16.17。偏导数 x/αknee∂x/∂α_{knee} 是由 Δx/ΔαkneeΔx/Δα_{knee} 的极限给出的。在保持除膝盖外的所有关节固定的情况下计算执行器的位移。

不幸的是,系统(16.1)通常不能以解析方式求解,并且在大多数情况下它是欠约束的,即向量 x 中未知的内部关节参数α的数量超过了变量的数量。这意味着骨架的不同运动可能会导致终端执行器的相同运动。一些示例如图 16.18 所示。有许多方法可以获得此类系统的特定解决方案,包括考虑某些现实生活中所需的自然约束条件的方法(例如仅向一个方向弯曲膝盖)。还应记住,计算出的雅可比矩阵仅适用于一个特定的配置,并且必须随着骨架的移动而更新。完整的 IK 框架显示在图 16.19 中。当然,IK 的根关节不必是整个层次结构的根,并且可以将多个 IK 求解器应用于骨架的独立部分。例如,可以使用单独的求解器来处理右脚和左脚,另一个用于帮助使用右手抓握动画,每个求解器都有自己的根。

fig11_1.jpg

图 16.18。多个内部关节的配置可能导致相同的执行器位置。(顶部)不连续的“翻转”解决方案;(底部)一系列连续的解决方案。

fig11_1.jpg

图 16.19。逆向运动学算法的图表。

通常使用 FK 和 IK 方法的组合来为骨架添加动画。许多常见的运动(行走或奔跑循环、抓握、伸手等)展现出已知的关节运动模式,使得能够快速创建自然的运动甚至使用此类“剪辑”的库。然后,动画师根据角色的物理参数调整这个通用结果,同时也为其增添更多的个性。

当骨架改变其位置时,它作为应用于角色皮肤的一种特殊类型的形变器。将运动通过将每个皮肤顶点分配给一个(刚性绑定)或多个(平滑绑定)驱动关节来传递到该表面(参见图 16.20)。在第一种情况下,皮肤顶点被简单地冻结到相应关节的局部空间中,该关节可以是最近的空间中的关节或直接由用户选择的关节。皮肤顶点然后重复该关节经历的任何运动,并且其在世界坐标中的位置由标准 FK 过程确定。尽管它很简单,但是在接近关节的区域或者对于类似呼吸或肌肉作用等更微妙的效果而言,刚性绑定使得很难获得足够平滑的皮肤形变。为此可以使用称为屈曲器的附加专门形变器。在平滑绑定中,多个关节可以按照动画师分配的一些权重影响一个皮肤顶点,从而提供更详细的结果控制。由不同驱动关节建议的位移向量 di\bold d_i(每个再次使用标准 FK 计算)根据它们的权重 wiw_i 进行平均以计算顶点的最终位移 d=widi\mathbf{d}=\sum w_{i} \mathbf{d}_{\mathbf{i}}。归一化权重 (wi=1)(\sum w_i = 1) 最常见,但并非根本必要。设置平滑绑定权重以实现所需效果并不容易,需要动画师具备相应的技能。

fig11_1.jpg

图 16.20。顶部:刚性绑定将皮肤顶点分配给特定的关节。显示了属于肘关节的皮肤顶点(黑色);底部:软绑定可以混合多个关节的影响。显示了肘关节的权重(较浅表示更大的权重)。注意靠近关节的内部皮肤的平滑形变。

16.4.1 面部动画

骨架非常适合创建人物身体的大多数动作,但对于逼真的面部动画来说并不是很方便。原因在于人脸的皮肤由直接附着在其上的肌肉驱动,而其他身体部位的肌肉的主要目标是移动骨骼,任何皮肤形变都是次要结果。这种面部解剖结构的结果是一组非常丰富的动态面部表情,人类将其用作沟通的主要工具之一。我们都经过了很好的训练,能够识别这些面部变化,并且可以轻易地注意到任何不自然的外观。这不仅对动画师提出了特殊要求,而且还需要面部几何模型的高分辨率以及如果需要照片级别逼真,则需要准确的皮肤反射属性和纹理。

虽然可能通过逐顶点设置面部关键姿势并在它们之间进行插值或直接使用基于物理的技术模拟底层肌肉结构的行为(见第 16.5 节),但还存在更专业的高级方法。特定面部的静态形状可以通过一组相对较小的所谓的构象参数(总体尺度、从眼睛到额头的距离、鼻子的长度、下颌的宽度等)来表征,这些参数用于将通用面部模型变形为具有个性特征的模型。还可以使用一组表现参数来描述面部的动态形状以进行动画处理。例如,头部的刚性旋转,眼睛张开的程度,某些特征点从其静态位置移动的运动等。选择这些参数是为了能够通过某些参数调整的组合获得大多数有趣的表情效果,从而允许使用标准关键帧动画处理面部。为了实现更高级别的控制,可以使用表达参数创建一组对应于常见情感的表情(中性、悲伤、快乐、愤怒、惊讶等),然后混合这些关键姿势以获得“略带悲伤”或“生气地惊讶”的面部表情。类似的技术可用于执行唇同步动画,但在这种情况下,关键姿势对应于不同的音素。FACS(Eckman&Friesen,1978)将动态面部表情直接分解为称为动作单元(AUs)的基本运动的总和,而不是使用一系列静态表情来描述动态表情。AU 集合基于广泛的心理研究,包括如提起内眉毛、皱鼻、舒展嘴唇等运动。可以结合 AUs 来合成所需的表情。

16.4.2 动作捕捉

即使使用上面描述的技术,从头开始创建逼真的角色动画仍然是一项艰巨的任务。因此,自然而然地,人们将注意力集中在记录演员在现实世界中的运动,然后将其应用于计算机生成的角色的技术上。存在两类主要的动作捕捉(MC)技术:电磁和光学。

在电磁运动捕捉中,电磁传感器直接测量其在三维中的位置(可能也包括方向),通常以实时提供捕获结果。该技术的缺点包括设备成本高昂,可能受到附近金属物体的干扰,以及传感器和电池的可见尺寸,这可能会影响执行高振幅运动。在光学运动捕捉中,使用小型彩色标记代替有源传感器,使过程更少侵入性。图 16.21 展示了这样一个系统的操作。在最基本的安排中,通过两个校准的视频摄像机记录运动,并使用简单的三角测量来提取标记的 3D 位置。用于从视频中准确跟踪多个标记的更高级别的计算机视觉算法具有很高的计算成本,因此在大多数情况下,此类处理是离线完成的。光学跟踪通常比电磁跟踪不太稳健。某些帧中给定标记的遮挡、标记可能的错误识别以及图像中的噪点只是必须解决的一些常见问题。引入更多从不同方向观察运动的摄像机可以提高精度和稳健性,但此方法更昂贵,并且处理此类数据需要更长时间。随着可用计算能力的增加和开发更好的计算机视觉算法,光学 MC 变得更具吸引力。由于标记的低影响性质,光学方法非常适合进行细微的面部动作捕捉,并且也可以与人类之外的对象一起使用-例如,动物甚至是风中的树枝。

fig11_1.jpg

图 16.21。光学运动捕捉:附加在表演者身体上的标记使得骨骼运动可以被提取。图像由 Motion Analysis Corp 提供。

将几个传感器或标记附加到表演者的身体上,可以记录一组时间相关的某些集合点的 3D 位置。这些跟踪位置通常选择在关节附近,但是它们仍位于皮肤表面而不是实际骨头相遇点。因此,需要一些额外的注意和稍微的额外处理来将记录的位置转换为物理骨骼关节的位置。例如,在肘部或踝关节的对侧放置两个标记可以通过平均两个标记的位置来获得更好的关节位置。如果没有这种额外的注意,由于偏移关节位置以及固有噪声和不足的测量精度,非常明显的伪影可能会出现。由于运动中的物理不准确性,例如角色肢体在行走或抓握时可能与其应该触摸的对象失去接触,所以骨架的脚滑(溜冰)等问题可能会出现。大多数这些问题可以通过使用逆运动学技术进行校正来弥补,以明确强制四肢末端所需的行为。

恢复的关节位置现在可以直接应用于计算机生成角色的骨架。该过程假定角色的物理尺寸与表演者相同。将记录的运动重新定位到不同的角色,并更一般地编辑 MC 数据,需要显着的注意力以满足必要的约束条件(例如保持脚在地面上或不允许肘部向后弯曲),并保留修改后运动的总体自然外观。通常,希望从原始运动中获得的变化越大,就越难以保持结果的质量。解决问题的有趣方法是记录一组大量的运动,并将这个库中的短片拼接在一起以获得所需的运动。虽然这个话题目前是一个非常活跃的研究领域,但调整记录的运动以适应动画师的需求的能力仍然是运动捕捉技术的主要缺点之一。

16.5 基于物理的动画

我们周围的世界受到物理定律的支配,其中许多可以被形式化为偏微分或在一些更简单的情况下是常微分方程组。计算机最初的应用之一是(并仍然是)解决这样的方程。因此,尝试使用过去几十年开发的数值技术来获得计算机动画的逼真运动是非常自然的。

由于其相对复杂性和显着成本,基于物理的动画最常用于其他技术不可用或无法产生足够逼真结果的情况下。主要例子包括流体动画(其中包括许多通过相同方程描述的气态现象-烟、云、火等),布料模拟(如图 16.22 所示),刚体运动和弹性物体的精确变形。在每种情况下,控制方程和常用的数值方法的细节是不同的,但许多基本思想和困难仍然适用于各种应用程序。存在许多数值求解 ODE 和 PDE 的方法,但详细讨论它们远远超出了本书的范围。为了给读者介绍基于物理的技术和涉及的一些问题,我们在此简要提到有限差分方法 —— 一个概念上最简单和最流行的算法族之一,已应用于动画中遇到的大多数(如果不是全部)微分方程。

fig11_1.jpg

图 16.22。逼真的布料模拟通常使用基于物理的方法进行。在这个例子中,力是由碰撞和重力引起的。

该方法的关键思想是将微分方程替换为其离散模拟 —— 差分方程。为此,感兴趣的连续域由一组有限点表示,其中将计算解决方案。在最简单的情况下,这些点在均匀矩形网格上定义,如图 16.23 所示。然后,原始 ODE 或 PDE 中的每个导数都被其在网格点处的函数值的近似值所替代。做到这一点的一种方法是从给定点的函数值中减去其在网格上相邻点的函数值:

fig11_1.jpg

图 16.23。包含导数 f/x∂f/∂xf/t∂f/∂t 的方程的两种可能的差分方案。 (左)显式方案仅通过当前(橙色圆圈)和可能的过去(蓝色圆圈)时间的已知值来表达未知值(空心圆圈);(右)隐式方案将已知值和未知值混合在一个方程中,因此必须将所有这样的方程作为系统求解。对于两种方案,需要有关右边界值的信息以关闭过程。

df(t)dtΔfΔt=f(t+Δt)f(t)Δt or f(x,t)xΔfΔx=f(x+Δx,t)f(x,t)Δx(16.2)\frac{d f(t)}{d t} \approx \frac{\Delta f}{\Delta t}=\frac{f(t+\Delta t)-f(t)}{\Delta t} \text { or } \frac{\partial f(x, t)}{\partial x} \approx \frac{\Delta f}{\Delta x}=\frac{f(x+\Delta x, t)-f(x, t)}{\Delta x} \tag {16.2}

当然,这些表达式不是唯一的。例如,可以在上述公式中使用 f(tΔt)f(t-Δt),并除以 2Δt2Δt。对于包含时间导数的方程,现在可以通过解决差分方程系统(每个空间位置一个)来以 ΔtΔt 大小步骤的序列向前传播未知函数的值 f(t+Δt)f(t+Δt)。必须有一些初始条件,即在 t=0t=0 时未知函数的值,才能开始该过程。根据具体问题,可能还需要其他信息,如域边界上的值。

当所有存在的其他值都在当前时间被取出且相应的差分方程中唯一未知的 f(t+Δt)f(t + Δt) 通过这些已知值来表示时,即只考虑当前时间点的值时,可以轻松地计算 f(t+Δt)f(t+Δt) 被称为显式方案。隐式方案混合当前和将来的时间,并可能使用:

f(x+Δx,t+Δt)f(x,t+Δt)Δx\frac{f(x+\Delta x, t+\Delta t)-f(x, t+\Delta t)}{\Delta x}

作为 fx∂f \over ∂x 的近似值选择这种方法,需要在每个步骤中求解一个代数方程组。

差分方案的选择可能会极大地影响算法的所有方面。其中最明显的是精确度。在 Δt0Δt → 0Δx0Δx → 0 的极限情况下,类似于公式(16.2)中的表达式是精确的,但对于有限的步长,某些方案比其他方案更好地近似了导数。差分方案的稳定性与数值误差的增长速度有关,而这些误差始终存在于实践中。对于稳定的方案,这种增长是有界的,而对于不稳定的方案,它是指数级的,并且可能会快速地压倒所寻求的解(见图 16.24)。重要的是要认识到,虽然解的某些不准确是可以容忍的(事实上,物理学和工程学所需的精度很少需要动画),但不稳定的结果完全没有意义,应避免使用不稳定的方案。通常,显式方案要么不稳定,要么在更大的步长时可能会变得不稳定,而隐式方案是无条件稳定的。隐式方案允许更大的步长(因此,较少的步骤),这就是为什么它们尽管需要在每个步骤中求解一个代数方程组,但仍受欢迎的原因。如果满足其稳定性条件,则显式方案因其简单性而具有吸引力。开发适用于特定问题的良好差分方案和相应的算法并不容易,对于大多数标准情况,最好使用现有方法。有丰富的文献讨论这些技术的细节。

fig11_1.jpg

图 16.24。一个不稳定的解最初可能会遵循精确解,但随着时间的推移可能会任意远离它。即使是稳定的解的准确度对于特定应用仍可能不足够。

应该记住,在许多情况下,仅计算方程中的所有必要项就是一项困难且耗时的任务。例如,在刚体或布料模拟中,系统上大多数作用力是由物体之间的碰撞引起的。因此,在动画过程中的每个步骤中,必须解决一个纯几何但非常复杂的碰撞检测问题。在这种条件下,需要较少评估这些力的方案可能会提供显着的计算节省。

尽管求解适当的时间相关方程的结果给出了非常逼真的运动,但这种方法也有其局限性。首先,很难控制基于物理的动画的结果。这些方程的基本数学属性表明,一旦设置了初始条件,解就唯一定义了。这并不留下太多空间供动画师输入,如果结果由于某种原因不令人满意,则只有几个选项可供选择。它们主要局限于调整使用的初始条件,改变系统的物理属性,甚至通过引入旨在“驱动”解决方案朝着动画师想要的方向前进的人工项来修改方程本身。进行此类更改需要相当的技能以及对基础物理和理想情况下数值方法的理解。如果没有这些知识,则基于物理的动画提供的逼真度可能会被破坏或严重的数值问题可能会出现。

16.6 过程技术

想象一下,如果我们可以编写(并在计算机上实现)一个数学函数,它在给定动画师指导下精确地输出所需的运动。上面概述的基于物理的技术可以视为这种方法的一种特殊情况,其中涉及的“函数”是求解特定微分方程的过程,“指导”是初始和边界条件,额外的方程项等。

然而,如果我们只关心最终结果,我们就不必遵循基于物理的方法。例如,湖面上的简单恒定振幅波可以直接通过应用函数 f(x,t)=Acos(ωtkx+ϕ)f(\mathbf{x}, t)=A \cos (\omega t-\mathbf{k} \mathbf{x}+\phi) 来创建,其中 AωkA,ω,kϕϕ 是常数,并且得到 2D 点 xx 在时间 tt 处的位移。使用具有随机相位和适当选择的振幅,频率和波矢的多个这样的波形集合,可以在不显式求解任何流体动力学方程的情况下,产生非常逼真的水面动画。事实证明,其他相当简单的数学函数也可以创建非常有趣的图案或对象。第 11.5 节中描述了几个这样的函数,大多数基于格子噪声。向这些函数添加时间依赖性使我们能够更轻松,更便宜地动画某些复杂现象,同时保持结果的非常高的视觉质量。如果 noise(x)noise(x) 是底层的生成图案函数,则可以通过将参数位置移动到格子中来创建其时间依赖变体。最简单的情况是具有恒定速度的运动:timenoise(x,t)=noise(x+vt)timenoise(x,t)= noise(x + vt),但当然也可能出现更复杂的运动形式。其中之一是螺旋形路径,如图 16.25 所示。另一种方法是动画化用于生成噪声函数的参数。如果外观随时间显着变化(例如云朵变得更加湍流),则特别适用。通过使用生成静态噪声的函数,可以动画化云朵形成的动态过程。

fig11_1.jpg

图 16.25。通过定义程序噪声的立方体路径来遍历,以动画化生成的图案。

对于某些过程技术,时间依赖性是更为重要的组成部分。最简单的元胞自动机在二维矩形网格上运行,在每个位置(单元格)存储二进制值。为创建一个随时间变化的图案,需要反复应用一些用户提供的规则来修改这些值。规则通常涉及当前值和单元格邻居的值之间的一些条件集。例如,1970 年由英国数学家约翰·康威发明的流行的 2D 生命游戏元胞自动机的规则如下:

  • 一个死亡的单元格(即给定位置处的二进制值为 0),如果恰好有三个活着的邻居,则变成一个活着的单元格(即它的值设置为 1)。
  • 如果一个活着的单元格有两个或三个活着的邻居,则继续保持活着状态。
  • 在所有其他情况下,一个单元格死亡或保持死亡状态。

一旦规则应用于所有网格位置,则创建一个新的图案,并可以开始新的演化周期。图 16.26 显示了不同时间点上活单元格分布的三个示例快照。更复杂的自动机同时在若干个可能是浮点值的三维网格上操作,并可用于建模云和其他气体现象或生物系统,这些装置最初是为此而发明的(请注意术语)。仅凭少数经过精心选择的规则就可以产生出令人惊讶的图案复杂性,但如何编写这样的规则以创建所需的行为通常并不明显。这是过程技术的常见问题:在如何创建新程序甚至调整现有程序的参数方面,只有有限的指导。因此,通常需要进行大量微调和通过试错学习(“通过经验”)来发掘过程方法的全部潜力。

fig11_1.jpg

图 16.26。生命游戏的元胞自动机演变的几个(非连续的)阶段。活着的单元格显示为黑色。稳定物体,振荡器,行进的图案以及许多其他有趣的构造都可以从应用非常简单的规则中得出。图像是使用 Alan Hensel 编写的程序创建的。

另一种有趣的方法也最初是为描述生物对象而开发的技术称为 L-系统(以其原始发明者 Astrid Lindenmayer 的名字命名)。这种方法基于文法或递归规则集来重写符号串。有两种类型的符号:终端符号代表我们想要用文法表示的元素。根据它们的含义,文法可以描述树木和灌木的结构、建筑物和整个城市的结构,或编程和自然语言。在动画中,L-系统最流行的是表示植物,相应的终端是对几何建模系统的指令:在当前位置放置一个叶子(或分支)—— 我们将使用符号 @@ 并画一个圆,将当前位置向前移动若干单位(符号 ff),将当前方向围绕世界 ZZ 轴旋转 6060 度(符号 ++),弹出(符号 [[)或推入(符号 ]])当前位置/方向等。辅助的非终端符号(用大写字母表示)只有语义而没有任何直接含义。它们旨在最终通过终端进行重写。我们从特殊的非终端起始符号 SS 开始,同时将文法规则应用于当前字符串,即替换所有当前存在的非终端以获取新字符串,直到我们得到一个仅包含终端的字符串,因此不再可能进行任何替换。这个建模指令串然后用于输出实际的几何形状。例如,一组规则(产生式)

SAA[+B]fAABBfBBf@\begin{array}{l} S \rightarrow A \\ A \rightarrow[+B] f A \\ A \rightarrow B \\ B \rightarrow f B \\ B \rightarrow f @ \end{array}

可能导致如下的重写步骤序列,如图 16.27 所示:

SA[+B]fA[+fB]f[+B]fA[+ff@]f[+fB]fB[+ff@]f[+ff@]ff@.\begin{array}{c} S \longmapsto A \longmapsto[+B] f A \longmapsto[+f B] f[+B] f A \longmapsto \\ {[+f f @] f[+f B] f B \longmapsto[+f f @] f[+f f @] f f @ .} \end{array}

fig11_1.jpg

图 16.27。使用简单 L-系统的连续推导步骤。大写字母表示非终端符号,并说明对应的非终端将展开的位置。它们不是实际输出的一部分。

如上所示,通常有许多不同的产生式用于相同的非终端符号,从而允许使用相同的文法生成许多不同的对象。选择要应用的规则可能取决于被替换的符号旁边的符号(上下文敏感性),也可以随机进行,并为每个规则分配概率(随机 L-系统)。更复杂的规则可以模拟与环境的交互,例如将其形状修剪到特定形状,并且可以与符号相关联的参数来控制发出的几何命令。

L-系统已经捕获了植物拓扑随时间的变化:在重写过程中获得的每个中间字符串都可以解释为该植物的“年轻”版本(见图 16.27)。对于更显着的变化,不同的产生式可以在不同的时间起作用,允许植物的结构在生长过程中发生显着变化。例如,一个年轻的树会产生很多新枝条,而一个老树只会适度地分枝。

使用 L-系统已经创建了非常逼真的植物模型。然而,与大多数过程技术一样,需要一些经验才能有意义地应用现有的 L-系统,并编写新的文法以捕获所需的效果肯定不容易。

16.7 对象组

为了对多个对象进行动画处理,当然可以将本章迄今为止描述的标准技术分别应用于每个对象。这对于中等数量的预先知道其所需运动的独立对象来说效果还不错。但是,在许多情况下,需要在动态环境中进行某种协调行动。如果只涉及少量对象,则动画制作者可以使用基于人工智能(AI)的系统自动确定每个对象的即时任务,该任务基于某些高级目标,计划必要的运动并执行计划。许多现代游戏使用这种自治对象来创建智能怪物或玩家的合作伙伴。

有趣的是,随着组中对象数量从只有几个增加到数十个、数百个和成千上万个,组成员的个体“智能”必须非常有限,以便整个组呈现出看起来像是协调的目标驱动运动。事实证明,这种群集模仿是会出现的行为,这是由于群组成员与其最近邻居中的少数人的有限交互而产生的(Reynolds,1987)。对于观察过一群鸟或一群鱼的迷人同步运动的任何人来说,该技术应该是熟悉的。该技术还可用于控制在地形上移动的动物群体甚至人类群众。

在任何给定的时刻,一个群体成员(通常称为 boid)的运动是平衡几种常常矛盾的趋势的结果,每种趋势都提出了自己的速度向量(见图 16.28)。首先,有作用在 boid 上的外部物理力 F,例如重力或风力。由于这些力产生的新速度可以直接通过牛顿定律计算得出,具体公式为:

fig11_1.jpg

图 16.28。 (左)单个群体成员(boid)可能会经历不同重要性的几个冲动(由线条粗细表示),这些冲动必须协商成一个单一的速度向量。 boid 仅意识到其有限的邻域(圆)。 (右)Boid 控制通常实现为三个独立模块。

其次,boid 应对全局环境和其他组成员的行为做出反应。避免碰撞是这种交互的主要结果之一。对于群集来说,每个组成员只能看到有限的视野,因此只知道其当前位置附近发生的事情是至关重要的。为了避免环境中的对象,最简单但并不完美的策略是在每个这样的对象周围建立有限范围的斥力场。这将创建一个第二个所需的速度向量 Vnewcol_avoid\mathbf{V}_{n e w}^{c o l \_a v o i d},也由牛顿定律给出。与其他组成员的相互作用可以通过同时应用不同的驾驶行为来建模,从而产生几个额外的所需速度向量 vnew steer \mathbf{v}_{\text {new }}^{\text {steer }}。远离邻居以避免拥挤,朝向群体伙伴以确保群体凝聚力,以及调整 boid 的速度以与邻居的平均方向对齐是最常见的。最后,通常会应用一些额外的所需速度向量 vnew goal \mathbf{v}_{\text {new }}^{\text {goal }},以实现所需的全局目标。这些可以是沿空间某个路径的向量,遵循群体中某个特定指定的领导者,或者只代表群体成员的迁移冲动。

确定所有 vnew\bold v_{new} 之后,基于它们之间的优先级来协商最终所需的向量。避免碰撞和速度匹配通常具有更高的优先级。而不是简单地计算所需速度向量的平均值,这可能会导致冲动被抵消并产生不自然的“无处可去”的行为,使用加速度分配策略。固定数量的总加速度可用于 boid,并按照优先级的顺序分配给每个冲动的一部分。如果可用的总加速度用完,则较低优先级的冲动将对运动产生较小的影响或完全被忽略。希望一旦当前最重要的任务(在大多数情况下是避免碰撞)得到完成,其他任务就能在不久的将来得到解决。还重要的是尊重一些真实对象的物理限制,例如将加速度或速度夹紧到某些真实值。根据群体成员的内部复杂性,动画的最后阶段可能是将协商的速度向量转化为一组特定参数(鸟的翅膀位置,在空间中的飞机模型的方向,腿骨架骨头配置等),用于控制 boid 的运动。实现 flocking 的系统图如图 16.28(右)所示。

fig11_1.jpg

图 16.29。在被定向源发射后,粒子与物体碰撞,然后一旦它们清除障碍物,则被当地风场吹下。

粒子系统(Reeves,1983)实现了一种更简单但仍非常有用的群体控制版本。系统中的粒子数量通常比鸟群中的数量大得多,可以达到数万甚至更多。而且,在动画过程中,粒子的确切数量可以波动,每一步都会产生新的粒子,并破坏旧的一些粒子。粒子通常彼此完全独立,忽略相邻的粒子,并仅通过经历外部力和物体碰撞与环境进行交互,而不是通过避免碰撞来进行交互,就像对于鸟群一样。在动画的每个步骤中,该系统首先创建具有某些初始参数的新粒子,终止旧粒子,然后根据牛顿定律计算必要的力并更新剩余粒子的速度和位置。

粒子系统的所有参数(粒子数量,粒子寿命,初始速度和位置等)通常都在动画制作者的直接控制下。粒子系统的主要应用包括建模烟花,爆炸,液体喷洒,烟雾和火灾,或其他没有明显边界的模糊对象和现象。为了实现逼真的外观,重要的是为所有参数引入一些随机性,例如在每个步骤中产生(和销毁)粒子的随机数量,并根据某些分布生成它们的速度。除了设置适当的初始参数之外,通常通过在空间中创建特定的力模式来控制粒子系统的运动-例如,在到达某个特定位置后将粒子吹向新方向或添加吸引力中心。应记住的是,尽管具有优点,实施简单且易于控制是主要优点,但粒子系统通常不提供与同一现象的真正基于物理的模拟相似的逼真水平。

注释

本章我们集中讨论了在 3D 动画制作中使用的技术。还存在着一系列算法,可以帮助 2D 动画制作和计算机图形渲染系统创建的图像的后期处理。其中包括清理扫描艺术家绘画的技术、特征提取、自动 2D 插值、彩色化、图像变形、增强和合成等等。

在计算机动画领域,最重要的进展之一是越来越强大和普及的复杂动画系统。虽然在其具体功能集、内部结构、用户界面细节和价格方面有所不同,但大多数此类系统均提供广泛的支持,不仅用于动画,还用于建模和渲染,从而使它们成为完整的生产平台。通常使用这些系统创建静止图像也很常见。例如,本节中的许多图像都是使用 Alias 慷慨捐赠的 Maya 软件生成的。

大规模动画制作是一个极其复杂的过程,通常需要数十名具有不同背景的人员共同努力,分布在许多部门甚至企业中。为了更好地协调这项活动,建立了一定的生产流程,从故事和角色素描开始,继而录制必要的声音,建立模型,并为动画设置构造。一旦实际动画开始,通常会返回并修改原始设计、模型和构造,以解决发现的任何运动和外观问题。接下来是设置照明和材质属性,之后可以开始渲染。在大多数足够复杂的项目中,广泛的后期处理和合成阶段将不同来源的图像汇集在一起,并最终完成产品。

最后提醒读者,在计算机动画领域,任何技术上的先进都不如好故事、表现力强的角色和其他艺术因素重要,其中大多数很难或根本无法量化。可以肯定的是,“白雪公主和七个小矮人”永远会和绿色的怪物和驴子一起分享屏幕,而大多数观众更关心角色和故事,而不是计算机是否有助于创建它们(如果有的话,以什么方式)。