Skip to content

Latest commit

 

History

History
192 lines (186 loc) · 56.6 KB

第16章 计算机动画.md

File metadata and controls

192 lines (186 loc) · 56.6 KB

边学边翻译,督促自己不能落下,同时也留点记忆

第十六章 计算机动画


    动画源自拉丁语anima,意为赋予生命、兴趣、精神、运动或活动的行为、过程或结果。动作是生命的定义属性,而真正的动画艺术大多是关于如何通过动作来讲述故事、展示情感,甚至是表达人类性格的微妙细节。计算机是实现这些目标的辅助工具——熟练的动画师可以使用它更快地得到他想要的结果,而不必专注于他不感兴趣的技术细节。没有电脑的动画,现在通常被称为“传统”动画,有自己悠久而丰富的历史,仍然活跃在这门艺术中的数以百计的人不断地写着它。就像在任何既定的领域中一样,一些经过时间考验的规则已经具体化,这些规则为应该如何做某些事情和应该避免什么事情提供了一般的高级指导。这些传统动画的原则同样适用于计算机动画,我们将在本章讨论其中一些。     然而,计算机不仅仅是一个工具。除了让动画师的主要任务不那么乏味之外,计算机还添加了一些以前根本无法获得或极其难以获得的真正独特的能力。现代建模工具允许相对容易地创建详细的三维模型,渲染算法可以产生令人印象深刻的外观范围,从完全逼真的到高度程式化的,强大的数值模拟算法可以帮助生成基于物理的运动,特别是难以动画的对象,和运动捕获系统记录和使用真实的动作。这些发展导致了计算机动画技术在电影和商业广告、汽车设计和建筑、医学和科学研究等许多领域的爆炸式应用。全新的领域和应用也出现了,包括全电脑动画电影、虚拟/增强现实系统,当然还有电脑游戏。     本书的其他章节涵盖了上面提到的许多发展(例如,几何建模和渲染)更直接。在这里,我们将只提供直接用于创建和操作运动的技术和算法的概述。特别地,我们将大致区分并简要描述四种主要的计算机动画方法:

  • 关键帧给了动画师最直接的控制,动画师在某个时刻提供必要的数据,然后由计算机填充
  • 程序动画涉及特别设计的,通常是经验的,数学函数和程序,其输出类似于某些特定的运动
  • 基于物理的技术解决了运动微分方程
  • 运动捕捉使用特殊的设备或技术来记录真实世界的运动,然后将这种运动转换成计算机模型

    我们在这里根本不涉及这个领域的艺术方面。总的来说,我们不能在这里做更多的事情,而只是对用计算机创造运动这一迷人主题的皮毛进行了粗略的了解。我们希望真正感兴趣的读者将继续他们的旅程远远超出本章的材料。


动画的基本原则

    在他的开创性的1987年SIGGRAPH论文(拉塞特,1987)中,约翰·拉塞特提出了早在20世纪30年代由沃尔特的传统动画师开发的关键原则迪士尼工作室引起了当时刚起步的电脑动画社区的注意。其中提到了12个原则:挤压和拉伸、时机、预期、跟随和重叠动作、慢进慢出、分段、弧线、次要动作、直接动作和姿势动作、夸张、扎实的绘画技巧和吸引力。近20年过去了,这些经过时间考验的规则可以在自然的和自然的之间产生差异,此外,对于计算机动画来说,平衡控制和灵活性是非常重要的动画师充分利用了计算机的能力。尽管这些原则广为人知,但在实践中有许多因素影响着人们对这些规则的重视程度。虽然制作故事片的角色动画师可能会花很多时间来遵循这些建议(例如,调整他的时间,使其恰到好处),但许多游戏设计师倾向于认为他们的时间花在其他地方更好。

16.1.1 时间

    时间,或者说动作的速度,是任何动画的核心。事情发生的速度会影响到行动的意义、情绪状态,甚至是所涉及对象的感知重量。根据动作速度的不同,同样的动作,比如角色的头从左向右转,可能意味着被重物击中的反应,也可能意味着在书架上慢慢寻找一本书,或者是颈部肌肉的伸展。为手头的具体行动设定合适的时间是非常重要的。动作应该占据足够的时间让人注意到,同时避免太慢和可能无聊的动作。对于包含录制声音的计算机动画项目,声音提供了一个自然的时间锚。事实上,在大多数作品中,演员的声音是先录制的,然后完整的动画是同步到这个录音。由于大而重的物体往往比小而轻的物体移动得慢(更准确地说,加速度更小),计时可以用来提供关于物体重量的重要信息

16.1.2动作分布

    在动画制作过程中的任何时刻,观众都应该清楚呈现的是什么想法(动作、情绪、表情)。优秀的舞台设计或高水平的行动计划,应该引导观众的眼睛看到重要的行动目前集中在哪里,有效地告诉他“看这个,现在,看这个”,而无需使用任何语言。对人类感知的一些熟悉可以帮助我们完成这项艰巨的任务。由于人类的视觉系统主要对刺激物的相对变化而不是绝对值作出反应,在静止的环境中突然的运动或在繁忙的场景中某个部分缺乏运动自然会引起注意。同样的动作使得物体的轮廓在变化,这往往比正面排列更明显(见图16.1(左下))。     在稍低的层次上,每个动作可以被分为三个部分:预期(行动的准备)、行动本身和后续行动(行动的终止)。在许多情况下,动作本身在某种意义上是最短的部分最有趣的。例如,踢足球可能涉及踢球者的大量准备工作,并对离开的球进行长时间的“视觉跟踪”,以充分的机会展示当时的压力、踢球者的情绪状态,甚至是对该动作预期结果的反应。动作本身(用腿踢球的动作)相当简单,在这种情况下只需要不到一秒的时间。     期待的目的是让观众为即将发生的事情做好准备。如果动作本身非常快,这一点就显得尤为重要重要的,极其困难的为这些操作创建更广泛的预期可以强调这些属性,并且在快速事件的情况下,确保操作不会错过(参见图16.1(底部中心))。     在现实生活中,主要动作通常会导致一个或多个其他重叠动作。物体的不同附件或松散部分通常拖在主要引导部分的后面,并在主要动作的后续部分保持移动一段时间,如图16.1(右下)所示。此外,下一个行动往往在上一个行动完全结束之前就开始了。一个球员可能在他还在追踪他刚刚踢过的球时就开始跑了。忽视这种自然流动通常会被认为好像动作之间有停顿,并可能导致类似机器人的机械运动。虽然重叠是保持动作自然的必要条件,但动画师通常会添加辅助动作,使动作更有趣,实现动画的真实复杂性。重要的是不要让次要行动主导主要行动。

16.1.3动画技术

    有几种特殊的技巧可以让动作看起来更自然。最重要的可能是挤压和拉伸,这意味着在移动时以特定的方式改变移动物体的形状。人们通常会沿着运动的方向拉伸一个物体,并在施加力时压扁它,如图16.2所示,这是一个经典的弹跳球动画。重要的是要保持总容积,因为这恰好避免了物体增大或缩小的错觉。运动的速度(或力)越大,施加的拉伸(或挤压)就越多。使用这种变形有几个原因。对于非常快速的运动,一个物体可以在两个连续帧之间快速移动,以至于当前帧的物体和前一帧的物体之间没有重叠,这可能导致频闪(一种别名)。在运动方向上拉长物体可以确保更好的重叠,帮助眼睛对抗这种不愉快的效果。     拉伸/挤压也可以用来显示物体的灵活性,更多的变形应用于更柔韧的材料。如果物体看起来是刚性的,那么当它移动时,它的形状就会故意保持不变。自然运动很少发生在直线上,所以在动画中应该避免这种情况,而应该使用弧线。同样,在现实世界中,没有任何运动可以瞬间改变速度——这需要对物体施加无穷大的力。在动画中避免这种情况也是可取的。特别是,动作的开始和结束应该是逐渐的(缓慢的进和出)。而手绘动画有时是通过直接的动作完成的.动画师从第一帧开始,按顺序画一帧接着一帧,直到最后,姿势对姿势的动作,也被称为关键帧,更适合计算机动画。在这种技术中,动画是通过一系列相对间隔稀疏的关键帧精心规划的,剩下的动画(帧之间的动画)只有在设置好关键帧之后才填充(图16.3)。这允许更精确的计时,并允许计算机接管过程中最繁琐的部分——使用下一节介绍的算法创建中间帧。     几乎所有上述技巧都可以通过适当的夸张来达到更大的艺术效果或强调动作或角色的某些特定属性。最终目标是实现观众想要看到的东西,有吸引力的东西。角色或动作的极端复杂性或过于对称往往会降低吸引力。为了创造良好的效果,传统动画师需要扎实的绘画技能。类似地,计算机动画师当然应该了解计算机图形学,并对所使用的工具有扎实的知识。

16.1.4动画控制vs.自动方法

    在传统动画中,动画师对制作过程的所有方面都有完全的控制,没有什么能阻止最终产品在每个细节上都按照计划进行。这种灵活性所付出的代价是,每一帧都是手工制作的,这导致了一个非常耗费时间和劳动力的企业。在计算机动画中,有一个明显的权衡,一方面,给动画师对结果更直接的控制,但要求他贡献更多的工作,另一方面,依赖更自动化的技术,可能只需要设置一些输入参数,但提供很少或没有控制的结果的一些属性。一个好的算法应该提供足够的灵活性,同时只要求动画师提供直观的、容易提供的信息,以及他自己认为达到预期效果所必需的信息。虽然在实践中完全符合这一要求是不可能的,因为它可能需要一个接近读心术的机器,但我们确实鼓励读者从提供这种平衡的角度来评估任何计算机动画技术。

16.2 关键帧

    当应用于3D计算机动画时,关键帧这个术语可能会产生误导,因为通常不涉及实际完成的帧(即图像)。在任何给定的时刻,一个被动画化的3D场景由一组数字指定:所有对象的中心位置、它们的RGB颜色、每个轴上应用到每个对象的缩放量、复杂对象不同部分之间的建模转换、相机位置和方向、光源强度等。为了使场景动画化,这些值的一部分必须随时间改变。当然,我们可以在每一帧直接设置这些值,但这不是特别有效。除此之外,可以沿着动画的时间轴选择一些重要的时刻(关键帧tk),每个参数和这个参数的值(关键值fk)只为这些选定的帧设置。我们将把关键帧和关键值的组合(tk, fk)称为键。对于不同的参数,关键帧不一定是相同的,但至少同时为其中一些参数设置关键帧通常是合乎逻辑的。例如,为特定对象的r-, y-和2-坐标选择的关键帧可能被设置在完全相同的帧上,形成一个单一的位置矢量键(tk, Pk)。然而,这些关键帧可能与为对象的方向或颜色所选择的帧完全不同。关键帧之间的距离越近,动画师对结果的控制能力就越强;但是,必须评估进行更多设置密钥工作的成本。因此,在相对简单的动画部分中,键之间的间隔较大,将它们集中在复杂动作发生的间隔中,如图16.4所示。     一旦动画师设置了键(ti, fi),系统必须为所有其他帧计算f的值。尽管我们最终只对一个离散的值集感兴趣,但将其作为一个经典的插值问题来处理是很方便的,它通过一组数据点拟合一个连续动画曲线f(t)(图16.5)。曲线拟合算法的广泛讨论可以在第1章中找到15,这里就不再重复了。由于动画师最初只提供键而不是导数(切线),直接从键计算所有必要信息的方法更适合于动画。参数沿曲线变化的速度由曲线对时间的导数df/dt给出。因此,为了避免速度的突然跳跃,Cl的连续性通常是必要的。动画曲线通常不需要更高程度的连续性,因为对应于加速度或施加的力的二阶导数可以在现实情况下经历非常突然的变化(球撞击固体墙),而更高的导数并不直接对应于物理运动的任何参数。这些考虑使Catmull-Rom样条曲线成为初始动画曲线创建的最佳选择之一。     大多数动画系统为动画师提供了对初始曲线进行交互式精细编辑的能力,包括插入更多的键,调整现有的键,或修改自动计算的切线。另一种有助于调整曲线形状的有用技术叫做TCB控制(TCB代表张力、连续性和偏置)。这个想法是引入三个新的参数,通过在这个点上协调调整输入和输出切线来修改键附近的曲线形状。对于以At为间隔的键,在内部键(tk, fk)处输入T和输出Tout切线的标准Catmull-Rom表达式可以重写为 $$ T_k^{in}=T_k^{out}=\frac{1}{2\Delta t}(f_{k+1}-f_k)+\frac{1}{2\Delta t}(f_{k}-f_{k-1}) $$     TCB样条的修正切线为 $$ T_k^{in} = \frac{(1-t)(1-c)(1+b)}{2\Delta t}(f_{k+1}-f_k)+\frac{(1-t)(1+c)(1-b)}{2\Delta t}(f_k-f_{k-1}),\ T_k^{out} = \frac{(1-t)(1+c)(1+b)}{2\Delta t}(f_{k+1}-f_k)+\frac{(1-t)(1-c)(1-b)}{2\Delta t}(f_k-f_{k-1}). $$     张力参数t通过缩放输入和输出切线来控制键附近曲线的锐度。更大的切线(更低的张力)导致一个更平坦的曲线形状附近的关键。偏置b允许动画师有选择地增加键邻居的权重,将曲线拉向连接键的左邻居(b接近1,“超出”动作)或右邻居(b接近-1,“低于”动作)的直线。连续性c的非零值使传入和传出的切线不同,允许动画师在键值处创建曲线的扭结。TCB参数的实际有用值通常限于区间-1;1],默认t = c= b = 0对应原始的Catmull-Rom样条。可能的曲线形状调整示例如图16.6所示。

16.2.1 运动控制

    到目前为止,我们已经描述了如何通过键定位和微调键上的切线值来控制动画曲线的形状。然而,当一个人想要同时控制物体移动的位置(即它的路径)和它沿着这条路径移动的速度时,这通常是不够的。给定空间中的一组位置作为键,自动曲线拟合技术可以通过它们来拟合曲线,但产生的运动只是通过强迫对象在相应的关键帧t到达指定的键位置pk,而没有直接说到键之间的运动速度。这可能会产生问题。例如,如果一个物体沿着r轴以每秒11米的速度移动I秒,然后以每秒I米的速度移动9秒,它将在10秒后到达z = 20的位置,从而满足动画师的按键(0,0)和(10,20)。这种不稳定的运动不太可能是真正想要的,2米/秒的匀速运动可能更接近动画师在设置这些键时想要的。虽然通常不会显示这种极端的行为,由标准拟合程序产生的多项式曲线确实表现出键之间的不均匀运动速度,如图16.7所示。虽然这对于某些参数是可以容忍的(在限度内),人类的视觉系统不太擅长确定变化率中的不均匀性(如颜色或甚至旋转率),但我们必须更好地处理物体的p位置,因为它的速度直接对应于日常经验。     我们将首先区分拟合过程中使用的曲线参数化与动画中使用的曲线参数化。当一条曲线通过位置键进行拟合时,我们将把结果写成某个参数u的函数p(u)。这将描述曲线在空间中的几何形状。s是曲线的物理长度。对于动画师来说,沿着现有曲线控制运动的一种自然方法是指定一个额外的函数s(t),它对应于物体在任何给定时间内沿曲线应该走多远。为了得到空间中的实际位置,我们还需要一个辅助函数u(s),它计算给定长度s下的参数值u。然后通过组合这些函数给出给定时间t下计算对象位置的完整过程(见图16.8): $$ P(t)=P(u(s(t))) $$     可以用几个标准函数作为距离-时间函数s(t)。其中最简单的是对应恒定速度的线性函数:(t) = ut with v = const。另一个常见的例子是具有恒定加速度a(和初始速度to)的运动,用抛物线(t) = tot + at2/2来描述。由于速度在这里是逐渐变化的,这个函数可以帮助模拟理想的松入和松出行为。更一般地说,s(t)的斜率给出了运动速度,其斜率为负,对应于沿曲线向后运动的速度。要达到最大的灵活性,就要有能力交互编辑s(t)通常由动画系统提供给动画师。距离-时间函数并不是控制运动的唯一方法。在某些情况下,用户指定速度-时间函数(t)甚至加速度-时间函数(a(t))可能更方便。由于这些对应的是s(t)的一阶和二阶导数,为了使用这些类型的控件,系统首先通过对用户输入进行积分来恢复距离-时间函数(在a(t)的情况下是两次)。     曲线参数u与长度s的关系由系统自动建立。在实践中,系统首先确定长度依赖于参数u(即逆函数s(u))。利用这个函数,对于任何给定的S,都有可能解出S (u) - S = 0的方程,而u未知,得到u(S)。对于大多数曲线,函数s(u)不能用封闭解析形式表示,必须进行数值积分(见第14章)。标准的数值求根程序(例如Newton-Raphson方法)可以直接用于求解u的方程s(u) - s = 0。     另一种方法是将曲线本身近似为点p之间的一组线性段,在一组足够密集的间隔参数值ui处计算。然后创建一个近似弧长表 $$ s(u_i) \approx \int_{j=0}^i||p_j-p_{j-1}||=s(u_{i-1})+||p_i-p_{i-1}||. $$     由于s(u)是u的非递减函数,我们可以通过简单地搜索表(见图16.9)找到包含值s的区间。然后对区间的u端值进行线性插值,最终得到u(S)。如果需要更高的精度,可以应用以这个值为起点的Newton-Raphson算法的几个步骤。

16.2.2插值旋转

    上述技术可用于插值用于描述场景的大多数参数的键集。三维旋转是一种重要的运动,通常有专门的插值方法和表示。原因是,将标准技术应用到3D旋转常常会导致严重的实际问题。旋转(物体方向的改变)是除了平移之外唯一能保持物体形状不变的运动。因此,它在动画刚体中扮演着特殊的角色。     有几种方法可以指定对象的方向。首先,可以使用第6章中描述的变换矩阵。不幸的是,天真的旋转矩阵的(逐元素)插补不能得到正确的结果。例如,在2D顺时针和逆时针90度旋转之间的“中间”矩阵是零矩阵: $$ \frac{1}{2}\begin{bmatrix}0 &1\ -1 &0 \end{bmatrix}+ \frac{1}{2}\begin{bmatrix}0 &-1\ 1 &0 \end{bmatrix} = \begin{bmatrix}0 &0\ 0 &0 \end{bmatrix}. $$     有几种方法可以指定对象的方向。首先,可以使用第6章中描述的变换矩阵。不正确的结果当然是,单位矩阵对应于没有旋转。其次,可以将任意方向指定为围绕特定顺序选定的坐标轴旋转三次的序列。这些轴可以在空间中固定(固定角度表示),也可以嵌入到物体中,因此在每次旋转后改变(欧拉角度表示,如图16.10所示)。这三个角度的旋转可以直接通过标准的关键帧动画,但一个微妙的问题称为万向节锁定出现。如果在旋转过程中,三个旋转轴中的一个意外地与另一个对准,从而减少一个可用的自由度,如图16.11所示。这种效应比人们想象的要普遍得多——向右(或向左)旋转90度就可能使物体进入万向架锁。最后,任何方向都可以通过在空间中选择一个合适的轴和绕该轴旋转的角度来指定。虽然在这种表示中制作动画相对简单,但结合两个旋转,即找到对应于由轴和角度表示的两个旋转序列的轴和角度,是不平凡的。四元数是一种特殊的数学装置,它被开发出来使这种表示既适合将几个旋转组合成一个旋转,也适合制作动画。     给定一个三维向量v = (r, y, z)和一个标量s,将这两者组合成一个四分量对象,形成一个四元数q: g = [s T y z] = [s;v)。几个然后为四元数定义新的操作。四元数加法只是将标量部分和向量部分分别相加: $$ q_1+q_2\equiv[s_1+s_2;v_1+v_2]. $$     乘以标量a得到一个新的四元数 $$ aq \equiv{as;av}. $$     更复杂的四元数乘法定义为 $$ q_1\cdot q_2 \equiv{s_1s_2-v_1v_2;s_1v_2+s_2v_1=v_1\times v_2}, $$     其中x表示向量叉乘。很容易看出,与矩阵类似,四元数乘法是结合律,但不是交换律。我们主要感兴趣的是归一化四元数——对于那些四元数范数g) = Vs2 + v2等于1的四元数。我们需要的最后一个定义是反四元数: $$ q^{-1}=(1/|q|)[s;-V] $$     表示绕经过原点的轴以角度o旋转,其方向由归一化向量n(归一化四元数)给出 $$ q=[cos(\phi/2);sin(\phi/2)n] $$     就形成了。要旋转点p,需要将其转换为四元数qp = [0;P],计算四元数乘积 $$ q'_p=q\cdot q_p\cdot q^-1 $$     它保证标量部分为零旋转的点是它的向量部分。复合旋转简单地由表示每个独立旋转步骤的四元数的乘积给出。要用四元数制作动画,可以将它们视为四维空间中的点,并直接在该空间中设置键。为了保持四元数归一化,严格地说,应该将插值过程限制在这个4D空间中的一个单位球体(一个3D对象)上。然而,即使是线性插值的球形版本(通常称为slerp)也会导致相当不愉快的数学结果。简单的4D线性插值,然后投影到单位球上,如图16.12所示,是更简单的,在实践中往往足够。 通过使用de Casteljau算法重复应用线性插值程序可以获得更平滑的结果。

16.3变形

    虽然物体变形技术可能更适合作为建模工具处理,但它们通常与动画方法一起讨论。可能改变对象形状的操作中最简单的例子是非均匀缩放。更一般地,可以将一些函数应用到指定对象的所有点的局部坐标上(例如,三角形网格的顶点或样条曲面的控制多边形),重新定位这些点并创建一个新形状:p' = f(p。Y),其中Y是变形函数使用的参数向量。选择不同的f(并通过一个接一个的应用组合它们)可以帮助创建非常有趣的变形。有用的简单函数示例包括弯曲、扭转和锥度,如图16.13所示。 在这种情况下,通过关键帧的变形函数参数动画形状变化是非常容易的。这种技术的缺点包括为一些非标准变形选择数学函数的困难,以及由此产生的变形在某种意义上是全局的,即整个对象,而不仅仅是它的一部分,被重塑。     为了在局部变形对象的同时对结果提供更直接的控制,可以选择单个顶点,将其移动到一个新位置,并在一些邻域内调整顶点,以遵循种子顶点。受变形影响的区域和物体不同部位的特定位移量由衰减调谐控制,衰减调谐随距离(通常在物体表面计算)到种子顶点的距离减小。种子顶点运动可以通过关键帧产生动画形状变化。     一种更通用的变形技术叫做自由变形(FFD) (Sederberg & Parry, 1986)。首先建立一个局部(在大多数情况下是直线的)坐标网格来封装变形对象的部分,并计算所有相关点的坐标(s,t, u)相对于该网格。然后,用户可以自由地将晶格点Pijk的网格重塑为新的扭曲晶格Pfik(图16.14)。用三元模拟Bézier插值(见第15章)中原始的未扭曲网格计算的坐标重建对象,其中扭曲晶格点Pijk作为表达式中的控制点: $$ P(s,y,t)=\sum_{i=0}^L \left( \begin{matrix} i\ L \end{matrix} \right)(1-s)^{L-i}s^i \sum_{j=0}^M \left( \begin{matrix} j\ M \end{matrix} \right)(1-t)^{M-j}t^j \sum_{k=0}^N \left( \begin{matrix} k\ N \end{matrix} \right)(1-u)^{N-k}P'_{ijk} $$     其中L, M, N为每维点阵点的最大指标。实际上,晶格作为物体的低分辨率版本用于变形,允许任意复杂物体的平滑形状变化Ject通过相对少量的直观调整。FFD晶格本身可以被系统视为规则对象,并且可以进行转换、动画,甚至在必要时进一步变形,从而导致晶格所附着的对象发生相应的变化。例如,移动由原始格和表示凸起的扭曲格组成的变形工具会导致凸起在物体上移动。

16.4角色动画

    铰接图形的动画通常是通过关键帧和专门的变形技术的组合来完成的。用于动画的角色模型通常至少由两个主要层组成,如图16.15所示。呈现角色外壳或皮肤的精细表面的运动是观众最终在最终产品中所看到的。它下面的骨架是一个关节的层次结构(树),它提供了一个图形的运动学模型,专门用于动画。在某些情况下,在骨骼和皮肤之间插入与肌肉大致对应的额外中间层。     骨架的每个关节都充当其下方层次结构的父节点。根代表整个字符,直接定位在世界坐标系中。如果一个将关节与其层次结构中的父节点联系起来的局部变换矩阵是可用的,那么只需沿着从根节点到关节的路径连接变换,就可以获得一个将任何关节的局部空间与世界系统(即根节点的系统)联系起来的变换。为了评估整个骨架(即,找到所有关节的位置和方向),对关节的完整树进行深度优先遍历。转换堆栈是帮助完成此任务的自然数据结构。当遍历树时,当前的复合矩阵被推到堆栈上,通过将当前矩阵与存储在关节上的矩阵相乘,创建一个新的复合矩阵。当回溯到父分支时,这个额外的转换应该在访问另一个分支之前被撤销;这很容易通过简单地弹出堆栈来实现。尽管这种用于评估层次结构的通用而简单的技术在计算机图形学中广泛使用,但在动画(和机器人)中,它被赋予了一个特殊的名称——正运动学(FK)。虽然可以使用所有转换的通用表示,但通常使用专门的参数集,如链接长度或关节角度,来指定骨架。为了用正运动学进行动画,所有关节的旋转参数都直接被操纵。该技术还允许动画师改变关节之间的距离(链接长度),但应该注意,这对应于肢体的伸展,通常看起来很不自然。     正运动学要求用户为参与运动的所有关节设置参数(图16.16(上))。然而,这些关节大部分属于in层次结构的Temal节点,它们的运动通常不是动画师想要担心的事情。在大多数情况下,动画师只想让它们“自己”自然地移动,而人们更感兴趣的是指定关节链端点的行为,这通常对应于执行特定动作的东西,如脚踝或指尖。动画师希望所有内部关节的参数都由系统自动从末端执行器的运动中确定。逆运动学(IK)允许我们这样做(见图16.16(下))。     设x为末端执行器的位置,a为从根关节到末端关节沿链条指定所有内部关节所需的参数向量。有时最终关节的方向也直接由动画师设置,在这种情况下,我们假设相应的变量包含在向量中.不过,为了简单起见,我们将写出该向量的所有特定表达式: $$ X=(x_1,x_2,x_3)^T. $$     因为x中的每个变量都是a的函数,所以可以写成向量方程x = F(a)。如果我们改变少量的内部关节参数δα,在末端执行器位置上产生的变化可以近似写成 $$ \delta x = \frac{ \partial F}{\partial a} \delta a,\tag{16.1} $$     偏导数矩阵叫雅可比矩阵 $$ \frac{ \partial F}{\partial a}= \begin{bmatrix} \frac{ \partial f_1}{\partial a_1} & \frac{ \partial f_1}{\partial a_2} \cdots \frac{ \partial f_1}{\partial a_n} \ \frac{ \partial f_2}{\partial a_1} & \frac{ \partial f_2}{\partial a_2} \cdots \frac{ \partial f_2}{\partial a_n} \ \frac{ \partial f_3}{\partial a_1} & \frac{ \partial f_3}{\partial a_2} \cdots \frac{ \partial f_3}{\partial a_n} \ \end{bmatrix} $$     在每个时刻,我们都知道末端执行器的期望位置(由动画师设置),当然还有执行器的当前位置。减去这两个,我们将得到所需的调整牛。当一个特定的内部参数改变,而其他参数保持固定时,雅可比矩阵的元素与末端执行器坐标的变化有关(参见图16.17)。这些元素可以通过几何关系对任何给定的骨架结构进行计算。方程组(16.1)中唯一剩下的未知数是内部参数a的变化。一旦我们解出它们,我们更新a = a+a,这为FK过程重新定位骨架提供了所有必要的信息。     不幸的是,系统(16.1)通常不能解析求解,而且,在大多数情况下,它是不受约束的,即未知的内部关节参数a的数量超过向量x中的变量的数量。这意味着,不同的骨架运动可以导致相同的末端运动效应。一些例子如图16.18所示。有许多方法可以获得这类系统的特定解,包括那些考虑到某些系统所需的自然约束的方法现实生活中的关节(只弯曲一个膝盖)方向,例如)。一个人应该也记住雅可比矩阵的计算Trix只对一个特定的配置有效Tion,它必须被更新为骨架吨的动作。完整的IK框架是我根效应.如图16.19所示。当然,位置IK的根关节并不一定是整个层次的根,和多个IK求解器可应用于独立零件的骨架。例如,一个人可以用左右脚分开求解,如图16.18所示。内部关节的多种配置可以产生相同的效应器再来一个,帮助动画抓取位置。(上)不相交的“fipped”解;用右手,每根都有根。(下)一系列解决方案。     FK和IK方法的组合通常用于动画骨骼。许多常见的运动(步行或跑步循环,抓握,伸手等)都表现出众所周知的相互关节运动模式,这使得快速运动成为可能创建看起来自然的动作,甚至使用这样的“剪辑”库。然后动画师根据角色的物理参数调整这个通用的结果,并赋予它更多的个性。     当一个骨骼改变它的位置时,它作为一个特殊类型的变形应用到角色的皮肤上。通过为每个蒙皮顶点分配一个(刚性蒙皮)或多个(光滑蒙皮)关节作为驱动,运动被转移到这个表面(参见图16.20)。在第一种情况下,一个蒙皮顶点被简单地冻结到相应关节的局部空间中,该关节可以是空间中最近的顶点,也可以是用户直接选择的顶点。然后顶点重复这个关节经历的任何运动,它在世界坐标中的位置由标准FK程序确定。虽然它是简单的,刚性蒙皮使它很难获得足够光滑的皮肤变形的区域附近的关节,也为更微妙的效果,如呼吸或肌肉动作。额外的专门的变形称为屈曲可用于这一目的。在平滑蒙皮中,几个关节可以根据动画师分配的权重来影响蒙皮顶点,从而对结果提供更详细的控制。位移向量di,由影响给定蒙皮顶点的不同关节(每个关节再次用标准FK计算)根据它们的权重w求平均值;计算顶点的最终位移d = Dwd。归一化权值(w, = 1)是最常见的,但不是基本必需的。设置平滑的蒙皮权重来达到想要的效果是不容易的,需要动画师的重要技能。

16.4.1面部表情动画

    骨骼非常适合创造角色身体的大部分动作,但对于逼真的面部动画来说却不太方便。原因是,人类面部的皮肤是由直接附着在其上的肌肉移动的,而身体的其他部位的肌肉的主要目的是移动骨骼,任何皮肤变形都是次要的结果。这种面部解剖排列的结果是一套非常丰富的动态面部表情,被用作交流的主要工具。我们都受过很好的训练,可以识别这种面部变化,很容易注意到任何不自然的外表。这不仅对动画师提出了特殊的要求,而且还需要人脸的高分辨率几何模型,如果想要拍摄真实感,还需要精确的皮肤反射属性和纹理。     虽然可以逐个顶点设置面部的关键姿势,并在它们之间插入,或者使用基于物理的技术直接模拟底层肌肉结构的行为(参见第16.5节),但更专门高级别的方法也存在。一张特定脸的静态形状可以由一组相对较小的所谓的构造参数来表征(总体比例,从眼睛到前额的距离,鼻子的长度,下巴的宽度,等等),这些参数被用来将一个普通的脸模型变成一个具有单独特征的脸。一组附加的表达参数可以用来描述动画中人脸的动态形状。例子包括头部的刚性旋转,眼睛睁得有多大,一些特征点从静态位置的移动等等。选择这些是为了通过一些参数调整组合来获得大多数有趣的表情,因此,允许通过标准的关键帧来制作人脸动画。为了达到更高的控制水平,可以使用表达参数创建一组与常见情绪(中性、悲伤、快乐、愤怒、惊讶等)对应的表情,然后将这些关键姿势混合,获得“微悲伤”或“愤怒惊讶”的脸。类似的技术也可用来执行假唱动画,但在这种情况下,关键姿势对应不同的音素。面部动作编码系统(FACS) (Eckman & Friesen, 1978)没有使用静态表情序列来描述动态表情,而是直接将动态面部表情分解为称为动作单元(au)的基本动作的集合。这套动作是基于广泛的心理学研究,包括提高内眉、皱鼻子、拉伸嘴唇等动作。结合au可以用来合成一个必要的表达式。

16.4.2动作捕捉

    即使有上述技术的帮助,从零开始创建逼真的角色动画仍然是一项艰巨的任务。因此,人们很自然地将注意力集中在记录演员在现实世界中的动作,然后将其应用到计算机生成的角色上的技术上。这种运动捕捉(MC)技术主要有两类:电磁和光学。     在电磁运动捕获中,电磁传感器直接在3D中测量其位置(可能还有方向),通常实时提供捕获结果。该技术的缺点包括设备成本高,附近金属物体可能干扰,传感器和电池的明显尺寸可能成为执行高振幅运动的障碍。在光学MC中,使用小的彩色标记代替主动传感器,使它成为一个侵入性小得多的过程。图16.21显示了这种系统的运行情况。在最基本的安排中,运动由两个校准的摄像机记录,并使用简单的三角测量提取标记的3D位置。更先进的计算机视觉算法用于精确跟踪来自视频的多个标记的计算成本很高,因此,在大多数情况下,这样的处理是离线完成的。光学跟踪通常不如电磁跟踪健壮。某些帧中特定标记的遮挡,可能的标记识别错误,以及图像中的噪声只是一些必须解决的常见问题。引入更多的摄像头从不同的方向观察运动,提高了准确性和鲁棒性,但这种方法更昂贵,需要更长的时间来处理这些数据。随着可用计算能力的提高和更好的计算机视觉算法的发展,光学MC变得越来越有吸引力。由于标记的低影响特性,光学方法适用于精细的面部动作捕捉,也可以用于除人类以外的物体——例如,动物甚至风中树枝。     通过将几个传感器或标记附加到表演者的身体上,可以记录一些点集合的一组与时间相关的3D位置。这些跟踪位置通常选择在关节附近,但当然,它们仍然位于皮肤表面,而不是在实际的骨头连接的点。因此,要将记录的位置转换为物理骨架关节的位置,还需要一些额外的注意和额外的处理。例如,在肘部或脚踝的两侧放置两个标记,系统可以通过平均两个标记的位置来获得更好的关节位置。如果没有这些额外的注意,由于关节位置偏移、固有噪声和测量精度不足,会出现非常明显的伪影。例如,由于动作中的肢体不准确,角色的lims可能会在走路或抓东西时与他们应该接触的物体失去接触,就会出现骨骼的脚滑(滑冰)等问题。这些问题中的大多数都可以通过使用逆运动学技术来纠正,该技术可以明确地强制要求肢体末端的行为。     恢复的关节位置现在可以直接应用到计算机生成的角色的骨架上。这个过程假设角色的物理尺寸与表演者的相同。将记录的运动重定向到不同的字符,更一般地,编辑MC数据,需要非常小心地满足必要的约束(如保持脚在地面上或不允许肘部向后弯曲),并保持修改后的运动的整体自然外观。一般来说,与原始的期望变化越大,就越不可能保持结果的质量。解决这个问题的一个有趣的方法是记录大量的运动集合,并从这个库中将短剪辑拼接在一起,以获得所需的运动。尽管这一主题目前是一个非常活跃的研究领域,但根据动画师的需要调整记录的动作的能力有限仍然是动作捕捉技术的主要缺点之一。

16.5基于物理的动画

    我们周围的世界是由物理定律支配的,其中许多定律可以形式化为偏微分方程的集合,或者在一些更简单的情况下,常微分方程。计算机最初的应用之一就是(现在仍然是)解这样的方程。因此,尝试使用过去几十年发展起来的数值技术来获得计算机动画的真实运动是很自然的。     由于其相对的复杂性和巨大的成本,基于物理的动画最常用于其他技术不可用或不能产生足够逼真的结果的情况。主要的例子包括流体的动画(其中包括由相同的方程描述的许多气相现象——烟、云、火等)、布料模拟(如图16.22所示)、刚体运动和弹性物体的精确变形。在每一种情况下,常用的数值方法的管理方程和细节是不同的,但许多基本思想和困难仍然适用于各种应用。数值求解ode和pde的方法有很多,但详细讨论它们远远超出了本书的范围。为了让读者了解基于物理的技术和其中涉及的一些问题,我们在这里只简单地提到有限差分方法——这是概念上最简单和最流行的算法家族之一,它被应用于动画中遇到的大多数微分方程。     这种方法的关键思想是用它的离散类比——差分方程来代替微分方程。为了做到这一点,连续感兴趣的区域用一组有限的点表示,在这些点上计算解。在最简单的情况下,这些定义在一个均匀的矩形网格上,如图16.23所示。原始ODE或PDE中的每一个导数都被网格点上函数值的近似值所取代。一种方法是用网格上相邻点的函数值减去给定点的函数值: $$ \frac{df(t)}{dt}\approx \frac{\Delta f}{\Delta t}=\frac{f(t+\Delta t)-f(t)}{\Delta t} ~~~or\ \frac{\partial f(x,t)}{\partial x}\approx \frac{\Delta f}{\Delta t}=\frac{f(t+\Delta t)-f(t)}{\Delta t} \tag{16.2} $$     当然,这些表达并不是唯一的方式。例如,我们可以用f(t - At)来代替上面的f(t)然后除以2At。对于包含时间导数的方程,现在可以通过求解未知f(t+ at)的差分方程系统(每个空间位置一个),将未知函数的值沿时间沿at -size步骤序列向前传播。一些最初的条件,即未知函数att = 0的值,是启动该过程所必需的。根据特定的问题,还可能需要其他信息,例如域边界上的值。 f(t+ At)的计算对于所谓的显式格式来说是很容易的,只要取当前的所有其他值,对应的差分方程f(t+ At)中唯一的未知数用这些已知的值表示。隐式方案混合了当前和未来时间的值,并可能使用,例如, $$ \frac{f(x+\Delta x,t+\Delta t)-f(x,t+\Delta t)}{\Delta x} $$ 的近似值。在这种情况下,每一步都必须解一个代数方程组。     差分方案的选择会极大地影响算法的各个方面。其中最明显的是准确性。在极限At + 0或az0的情况下,式(16.2)中类型的表达式是精确的,但对于有限步长,有些格式允许比其他格式更好的导数近似。差分格式的稳定性与实际中经常存在的数值误差随时间增长的速度有关。对于稳定的方案,这种增长是有界的,而对于不稳定的方案,它是指数增长,可以迅速压倒人们寻求的解决方案(参见图16.24)。重要的是要认识到,虽然解决方案中的某些不准确性是可以容忍的(事实上,物理和工程中要求的准确性很少用于动画),但不稳定的结果是完全不稳定的毫无意义,应该避免使用不稳定的方案。一般来说,显式方案要么是不稳定的,要么在更大的步长下变得不稳定,而隐式方案是无条件稳定的。隐式方案允许更大的步长(因此,更少的步骤),这就是为什么尽管在每一步都需要求解一个代数方程组,但隐式方案仍然很受欢迎。如果能满足显式方案的稳定性条件,则显式方案因其简单而具有吸引力。为一个特定的问题开发一个好的差分格式和相应的算法并不容易,对于大多数标准情况,建议使用现有的方法。有大量的文献讨论了这些技术的细节。     人们应该记住,在许多情况下,仅仅计算方程中所有必要的项本身就是一项困难和耗时的任务。例如,在刚体或布料模拟中,作用在系统上的大部分力都是由于物体之间的碰撞。因此,在动画过程中的每一步,我们都必须解决一个纯几何的,但非常重要的碰撞检测问题。在这种情况下,需要较少的力评估的方案可能提供显著的计算节省。     虽然解决适当的时间相关方程的结果给出非常现实的运动,但这种方法有其局限性。首先,基于物理的动画效果很难控制。这些方程的基本数学性质表明,一旦设定了初始条件,解就是唯一定义的。这就没有给动画师留下太多的输入空间,如果由于某种原因结果不令人满意,就只有几个选项了。它们大多局限于调整所使用的初始条件,改变系统的物理属性,甚至通过引入旨在将解“驱动”到动画师想要的方向的人工术语来修改方程本身。做出这样的改变需要大量的技能以及对基础物理的理解,理想情况下,还需要数值方法。如果没有这些知识,基于物理的动画所提供的真实感就会被破坏,或者可能出现严重的数值问题。


16.6 程序的技术

    想象一下,一个人可以编写(并在计算机上实现)一个数学函数,在给定一些动画师的指导下精确输出所需的运动。上面概述的基于物理的技术可以被视为这种方法的一个特例,当涉及的“函数”是求解一个特定微分方程的过程,而“指导”是初始条件和边界条件的集合,额外的方程项等等。     然而,如果我们只关心最终结果,我们就不必遵循基于物理的方法。例如,一个简单的表面恒定振幅波湖可以直接由应用函数f (x, t) = cos (wt - kx + o)和恒频w,阿波矢量k和相位得到位移在2 d点x在时间t。这样的波浪随机集合阶段和适当选择振幅,频率和波向量会导致一个非常现实的动画的表面水没有明确解决任何流体动力学方程。事实证明,其他相当简单的数学函数也可以创建非常有趣的模式或对象。几个这样的函数,大多基于格噪声,已在第11.5节中描述。在这些函数中加入时间依赖性,我们就可以比基于物理的技术更容易、更便宜地制作出某些复杂现象的动画,同时保持结果的高视觉质量。如果噪声(x)是底层的模式生成函数,则可以通过在晶格中移动参数位置来创建它的一个与时间相关的变体。最简单的情况是匀速运动:timenoise(x,t) = noise(x + vt),但更复杂的穿过晶格的运动当然也是可能的,而且实际上更常见。其中一个路径,螺旋,如图16.25所示。另一种方法是将用于生成噪声函数的参数动画化。如果外观随着时间发生显著变化——例如,云变得更加湍流,这种方法尤其适用。通过这种方式,我们可以使用生成静态云的函数来动画化云形成的动态过程。     对于一些程序技术来说,时间依赖性是一个更重要的组成部分。最简单的元胞自动机操作在二维矩形网格上,其中每个位置(单元格)存储一个二进制值。要创建时变模式,需要重复应用一些用户提供的用于修改这些值的规则。规则通常涉及当前值和单元格相邻值的一些条件集。例如,英国数学家John Conway在1970年发明的流行的2D Game of Life细胞自动机的规则如下:

  1. 一个死单元格(即,给定位置的二进制值为O)正好有三个活邻居就成为活单元格(即,它的值设置为1)。
  2. 一个有两个或三个活邻居的活细胞是活的。
  3. 在所有其他情况下,细胞死亡或保持死亡。

    一旦规则应用到所有网格位置,就会创建一个新的模式,并开始一个新的演化周期。图16.26显示了不同时间活细胞分布的三个示例快照。更复杂的自动机同时操作几个可能是浮点值的3D网格,并可以用于建模云和其他气体现象或生物系统的动力学,这是这个仪器最初发明的(注意术语)。令人惊讶的模式复杂性可以由一些精心选择的规则产生,但是如何编写这样的规则来创建所需的行为通常并不明显。这是程序化技术的一个常见问题:关于如何创建新过程或调整现有过程的参数的指导只有有限的(如果有的话)。因此,为了释放程序方法的全部潜力,通常需要大量的调整和通过试错(“通过经验”)来学习。     另一种有趣的方法最初也是用来描述生物物体的,叫做l -系统(以其最初发明者Astrid Lindenmayer的名字命名)。这种方法基于重写符号字符串的语法或递归规则集。有两种类型的符号:终端符号代表我们想用语法表示的元素。根据它们的含义,语法可以描述树木和灌木的结构,建筑和整个城市,或者编程和自然语言。在动画中,l系统最常用来表示植物,对应的终端是对几何建模系统的指令:将一片叶子(或树枝)放在当前位置——我们将使用符号@并画一个圆,将当前位置向前移动若干单位(符号f),将当前方向绕世界z轴旋转60度(符号+),弹出(符号[)或推(符号])当前位置/方向,等等。辅助非终结符号(用大写字母表示)只有语义意义而没有任何直接意义。它们的目的是最终通过终端重写。我们从特殊的非终结符开始符号S开始,并并行地对当前字符串应用语法规则,即替换当前存在的所有非终结符以获得新的字符串,直到最终得到只包含终端的字符串,因此不可能进行更多替换。然后使用这串建模指令输出实际的几何图形。例如,一组规则(产品) $$ S \to A\ A \to [+B]fA\ A \to B\ B \to fB\ B \to f@ $$     可能会导致如图16.27所示的重写步骤顺序: $$ S \to A \to[+B]fA \to [+fB]f[+B]fA\ \ \to [+ff@]f[+fB]fB \to [+ff@]f[+ff@]ff@ $$     如上所示,对于同一个非终结符,通常会有许多不同的结果,从而允许使用相同的语法生成许多不同的对象。应用哪条规则的选择取决于被替换符号旁边的符号(上下文敏感),也可以随机执行,每个规则都有指定的概率(随机l系统)。更复杂的规则可以建模与环境的交互,例如修剪到特定的形状,参数可以与符号相关联,以控制发出的几何命令。     l系统已经捕捉到植物拓扑随时间的变化:在重写过程中获得的每个中间字符串都可以解释为植物的“较年轻”版本(参见图16.27)。对于更显著的变化,在不同的时间产生不同的结果,使植物的结构在生长过程中发生显著的变化。例如,一棵年轻的树会长出许多新分枝,而一棵老树只会长出少量的新分枝。     非常逼真的植物模型已经用l系统创建出来了。然而,与大多数过程性技术一样,人们需要一些经验来有意义地应用现有的l系统,而编写新的语法来获得一些想要的效果当然不容易。


16.7对象组

    当然,要制作多个物体的动画,我们可以简单地将本章所描述的标准技术应用到每一个物体上。对于一定数量的独立物体,它的运动是已知的,这种方法相当有效的进步。然而,在许多情况下,动态环境中的某种协调行动是必要的。如果只涉及到几个对象,动画师可以使用基于人工智能(AI)的系统,根据某些高级目标自动确定每个对象的即时任务,计划必要的动作,并执行计划。许多现代游戏使用这种自主对象来创造智能怪物或玩家合作者。     有趣的是,当一个群体中的物体数量从几个增长到几十个、几百个甚至几千个时,群体中的个体成员必须只有非常有限的“智力”,才能使群体作为一个整体表现出协调的目标驱动运动。事实证明,这种群体行为是一种突发行为,可能是群体成员与少数最近邻居的有限互动的结果(Reynolds, 1987)。如果你观察过一群鸟或一群鱼的同步运动,你应该对蜂群运动很熟悉。这项技术还可以用来控制在地形上移动的动物群体,甚至是人群。     在任何给定的时刻,一个群体成员的运动,通常被称为boid,当应用于群体时,是平衡几个经常相互矛盾的趋势的结果,每个趋势表明自己的速度矢量(见图16.28)。首先,有外力作用在物体上,如重力或风。这些力产生的新速度可以通过牛顿定律直接计算出来其次,一个boid应该对全局环境和其他群体成员的行为做出反应。避免碰撞是这种相互作用的主要结果之一。对于群体来说,关键是每个群体成员的视野都是有限的,因此只能知道当前位置附近发生的事情。为了避开环境中的物体,最简单的(如果不完美的话)策略是在每个这样的物体周围建立一个有限范围的斥力场。这将产生第二个所需的速度矢量,也是由牛顿定律给出的。与其他组成员的相互作用可以通过同时应用不同的转向行为来建模,从而产生几个额外的所需速度向量。远离邻居以避免拥挤,转向同伴以确保羊群的凝聚力,调整boid的速度以与邻居的平均方向一致是最常见的方法。最后,为了实现所需的全局目标,通常使用一些附加的期望速度向量。这些可以是空间中沿着某些路径的向量,跟随某个特定的羊群首领,或者只是代表一个羊群成员的迁移冲动。     一旦确定了所有的vneo,将根据它们之间的优先级协商最终所需的向量。避免碰撞和速度匹配通常具有更高的优先级。而不是简单的平均期望速度矢量可能导致取消冲动和非自然的“无处移动”行为,加速分配策略被使用。一个物体可以获得固定的总加速度,并按优先级将其部分分配给每个催促。如果总可用加速度耗尽,一些较低优先级的催促将对运动的影响较小或完全被忽略。我们希望,一旦当前最重要的任务(在大多数情况下避免碰撞)完成,其他任务可以在不久的将来得到处理。同样重要的是要尊重真实物体的一些物理限制,例如,夹紧过高的加速度或速度到一些现实值。根据鸟群成员的内部复杂性,动画的最后阶段可能是将协商好的速度矢量转换为一组特定的参数(鸟的翅膀位置、平面模型在空间中的方向、腿骨架配置)。我是建筑者的muuiou。系统实施运气的示意图见图16.28(右)。     一个更简单但仍然非常有用的群体控制版本是由粒子系统实现的(Reeves, 1983)。一个系统中粒子的数量通常比群中粒子的数量大得多,可能是数万或数十万,甚至更多。此外,在动画过程中粒子的确切数量可能会发生波动,每一步都会产生新的粒子和一些旧的粒子。粒子通常完全独立于彼此之间,忽略自己的邻居,只通过体验外部力量和与物体的碰撞与环境相互作用,而不是像鸟群那样通过避免碰撞。在动画过程中的每一步,系统首先用一些初始参数创建新的粒子,终止旧的粒子,然后根据牛顿定律计算必要的力,更新剩余粒子的速度和位置。     粒子系统的所有参数(粒子数量、粒子寿命、初始速度、粒子位置等)通常都由动画师直接控制。粒子系统的主要应用包括建模烟花、爆炸、喷射液体、烟雾和火,或其他模糊的物体和没有明显边界的现象。为了实现逼真的外观,很重要的一点是给所有参数引入一些随机性,例如,在每一步都有随机数量的粒子生成(和销毁),它们的速度根据某种分布产生。除了设置适当的初始参数外,控制粒子系统的运动通常是通过在空间中创建一个特定的力模式来实现的,例如,一旦粒子到达一个特定的位置,就将其吹向一个新的方向,或添加一个吸引中心。人们应该记住,尽管粒子系统具有所有的优势,即执行的简单性和易于控制性,但它们通常不能提供基于真实物理的模拟相同现象的逼真程度。


笔记

    在本章中,我们集中讨论了3D动画中使用的技术。也有一套丰富的算法来帮助2D动画制作和后期计算机图形渲染系统生成的图像的处理。这些技术包括清理扫描入的艺术家绘画、特征提取、自动2D中间、着色、图像扭曲、增强和合成等。     计算机动画领域最重要的发展之一是复杂动画系统的能力和可用性不断提高。虽然在特定的功能集、内部结构、用户界面细节和价格方面有所不同,但大多数这样的系统不仅包括对动画的广泛支持,还包括对建模和渲染的广泛支持,使它们成为完整的生产平台。使用这些系统创建静态图像也很常见。例如,本节中的许多人物图像都是使用Alias慷慨捐赠的Maya软件制作的。     大规模动画制作是一个极其复杂的过程,通常涉及到来自多个部门甚至公司的数十名不同背景的人的共同努力。为了更好地协调这一活动,我们需要建立一个特定的制作管道,即从故事和角色草图开始,录制必要的声音,构建模型,并为动画设置角色。一旦真正的动画开始,通常会返回并修改原始的设计、模型和装备,以修复任何发现的运动和外观问题。设置灯光和材质属性是必要的,之后就可以开始渲染了。在大多数足够复杂的项目中,大量的后期处理和合成阶段将不同来源的图像汇集在一起,最终完成产品。     在本章的结尾,我们提醒读者,在计算机动画领域,任何技术复杂性都是次要的,一个好的故事,富有表现力的角色,和其他艺术因素,大多数是很难或根本不可能量化的。可以肯定地说,白雪公主和她的七个小矮人将永远与绿色的食人魔和驴子共享屏幕,大多数观众将对角色和故事更感兴趣,而不是谁(如果有的话)帮助创造了他们。