简单介绍

动画历史

动画在最开始是作为一种沟通交流而存在的工具,它所传递的信息更富于美学意义

在图形学中,动画可以被认为是对3d建模和几何在时间上的拓展(升维)

里程碑

3200BC-远古时期 人类壁画——Shahr-e Sukhteh, 伊朗
1931 Phenakistoscope圆盘,通过转动圆盘来做动画
1878 第一部电影——Sallie Gardner
1937 第一部剧场版手绘电影——白雪公主与七个小矮人
1963 第一个计算机生成的动画
1972 早期计算机动画,人脸动画
1993 侏罗纪公园
1995 第一部完全计算机生成的动画电影——玩具总动员
2009 天降美食
2019 冰雪奇缘2

关键帧动画

最早期的动画制作一般由画师画出关键的画面,再由其助手补全关键帧之间的过渡

所以关键帧动画的主要问题在于使用怎样的插值方法得到更为平滑的过渡

关键帧动画1

通常来说线性插值是无法满足平滑过渡的需求的,所以一般会用贝塞尔,b样条之类的几何插值技术

关键帧动画2 关键帧动画3

物理模拟

物理模拟一般指 通过建立物理模型来还原诸如流体,布料等基于真实情况的动画

质点弹簧系统

质点弹簧系统是一系列相互连接的质点和弹簧,最简单的一种是理想弹簧,如图

理想弹簧

理想弹簧没有初始长度,且满足牛顿第三定律,用胡克定律求解作用力的大小

在理想弹簧的基础上引入原长,就变成了非零长弹簧

非零长弹簧

其中,$\frac{b-a}{|b-a|}$为归一化的力的方向,由于不考虑能量损失,非零长弹簧会始终保持运动的状态

如果简单引入摩擦力,则所有运动最后都会停止,如图

简单引入摩擦力

$-k_d$表示劲度系数,$\dot{b}$表示速度(x上加一点是导数的牛顿标记法)

这个模型的主要问题是无法考虑弹簧内部的相互作用力的影响,依然不接近真实情况

所以我们再引入一个内部的阻尼力

引入内部作用力

红框内表示b与a的相对速度在二者连线方向上的投影,是一个标量,再乘以b到a的归一化方向以及劲度系数,就得到的b上的总阻力

考虑完两个质点的相互作用,再来考虑弹簧系统,如何用这样一个系统来模拟纸或布料这种具有抗切变性质的材质

三步优化 (1) 三步优化 (2) 三步优化 (3)

抗切变:对于平面内的力,普通质点弹簧系统一拉就会变形,而抗切变材质不会;对于非平面力,质点弹簧系统可以做到完美对折,而抗切变材质不会

为了模拟这种情况,对原本的质点弹簧系统添加两步约束,如上图所示,一个是对角线的强约束,一个是跨顶点的弱约束

这样一来基本就可以得到物理正确的布料模拟了,但有时依旧不够精确

在渲染前沿话题中我们提到,布料的组成远比一个质点弹簧系统复杂(纤维,股,线),如果需要更为精确的模拟,首先在模型上的精度就得上去,其次还要得考虑质点间力的传导(有限元法,FEM),这样的模拟比较难做,在此略过

粒子系统

粒子系统被广泛应用于图形与游戏行业,系统中每一个粒子的行为都会被一组人为设置的力所定义

一般来说,粒子生成的步骤如下:

生成粒子 -> 计算每个粒子的力 -> 更新每个粒子的位置和速度 -> 将死亡的粒子移除 -> 渲染到屏幕

粒子之间常见的作用力举例:重力,电磁力,摩擦力,空气阻力,粘滞力,碰撞等

粒子的模拟不仅限于计算机图形,现实中的大自然如鸟群行为,细胞结构都可以通过粒子模拟

鸟群行为

运动学

运动学大致分为正向运动学和逆向运动学

正向运动学是通过定义一些可活动关节(如铰链),通过计算来控制末端的点的运动

正向运动学1 正向运动学2

虽然计算简单,但过程太过理性,艺术家习惯直接控制末端的点,而不是控制关节来间接运动

这种直接控制末端点的运动的方法,称为逆向运动学

逆向运动学1 逆向运动学2

逆向运动学虽然直观形象,但它有一个很大的问题就是多解问题,要优化解的选择则涉及到深度学习(随机化算法、梯度下降等方法)

https://zhuanlan.zhihu.com/p/434238743

角色绑定

角色绑定(Rigging)是指动画制作中涉及的骨骼创建、约束、蒙皮等操作,可以形象理解为提线木偶,是对逆运动学的一种应用

角色不同,每个角色的绑骨也都会不同,并且这一流程对后续动画制作会有直接影响,即角色的动作与动作之间原本需要对三维模型进行插值,现在只需要对骨骼插值即可

骨骼绑定

作为一个绑定师,需要同时具备艺术和技术才能

动作捕捉

既然可以通过绑骨来人为规定角色动作,那么这些信息同样也可以被捕捉记录下来,捕捉真实的控制点来生成动画

这种技术就是动捕技术

动作捕捉

动作捕捉的数据采集有不同的方法,一种是光学动捕,在动捕演员的关键位置设置信号源,还有诸如应用了电磁波的或是直接纯机械的动捕,都可以达到最终目的

但是,动作捕捉在采集真实信息的时候也有一些技术难点,比如遮挡、环境影响等,这会导致采集的信息良莠不齐

另外该项技术对硬件的要求比较高,操作也非常复杂,是一个高成本动画制作方案

动画制作流程

动画制作流程

模拟方法

单粒子模拟

为了模拟一个粒子的运动,我们需要获取其任意时间的位置信息

为了达到这个目的,我们可以假定一个速度场,在场内使用一阶常微分方程来得到其速度信息

单粒子模拟

计算得到速度之后,再用欧拉方法等各种手段,解出位置信息,得到模拟结果

欧拉方法

即对时间进行离散化,以一定步长细分时间,并每次用前一帧的计算结果更新当前帧的位置信息(前项欧拉)
$$
前项欧拉:\ x^{t+\triangle t}=x^t+\triangle t \dot{x}^t\
非前项欧拉:\ \dot{x}^{t+\triangle t}=\dot{x}^t+\triangle t \ddot{x}^t
$$
不过,这么做容易造成很大的误差,并且稳定性也非常差,如图

一旦步长低于一定精度,这种模拟就显得非常粗糙

欧拉方法误差大

而在一些速度场中,产生的误差会被无限放大,出现正反馈现象

欧拉方法稳定性差

为了改善这种模拟方法的不足之处,可以采用其他模拟方法,如下面介绍的中点法,自适应步长方法,隐式欧拉方法,龙格库塔方法等

中点法

中点法其实就是做了两次欧拉方法,第一次欧拉方法获得中点位置,在取中点位置的速度,再代入算一遍欧拉方法

中点法1 中点法2

最后的形式有点像泰勒的样子,就是多了一个二次项

理解的话,可以用初中物理的平均速度概念,自己推一遍加速度方程,$\dot{x}$是速度,$\ddot{x}$是加速度

自适应步长方法

这种方法也是算两遍欧拉,第一遍用$\triangle t$算,第二遍用$\frac{\triangle t}{2}$算,算完之后检验两次计算结果,如果偏差较大,则步长减半重新计算

这与直接减小步长的最大差别就是,他可以根据计算结果判断哪里应该用小步长,哪里用大步长,这就是所谓的“自适应”

自适应步长法

隐式欧拉方法

又称后向欧拉方法,前向欧拉是每次计算都用前一帧数据,那后向计算顾名思义就是用未来的数据

隐式的欧拉方法

这种方法需要求解非线性方程组,会用到牛顿法等求根算法,计算会慢,但稳定性相应也高

如何定义稳定性:

考虑截断误差和总体误差,我们习惯用$O(h)$表示当步长减小为原来的一半,误差会相应减少为原来一半,用$O(h^2)$表示当步长减小为原来的一半,误差会相应减少为原来$\frac{1}4$……(h为步长)

对于隐式欧拉方法来说,它是一阶稳定的,截断误差满足$O(h^2)$,总体误差满足$O(h)$

Runge-Kutta Family

是一种四阶的方法,稳定性非常好

龙格库塔

公式推导会涉及很多数值分析的内容,还没学到,先放一放

非物理方法

如位置调整法,韦尔莱积分等,这些方法通过调整粒子的位置使其满足一些特定性质,虽然不太物理(不满足能量守恒)也不太稳定,但实现起来比较简单,计算也比较快

非物理方法

刚体模拟

主要思想是刚体不会发生形变,并且内部所有粒子都以同一种运动方式运动

那么相对于粒子模拟只考虑位置和速度,刚体模拟会考虑更多的参数,如角度和角速度,角速度和角加速度等这些的对应关系

刚体模拟

流体模拟

流体模拟算是一种典型的非物理方法粒子模拟

与刚体模拟一样,流体模拟同样认为流体粒子不可压缩,且密度处处相等(变化前后密度也保持不变),那么任何时刻,任意位置的流体粒子发生运动都会导致其周围粒子的密度发生变化(马尔科夫链),而要使运动前后密度不变,就需要通过改变流体粒子位置来修正

这个修正过程,就是流体模拟的过程

修正方法用到了深度学习的梯度下降法

注意,流体模拟的过程会有永动的情况出现,这时候可以人为加入外力消耗能量,使其最后稳定下来

流体模拟1

模拟思想总结

有两种主流的模拟思想,拉格朗日视角(质点法)和欧拉视角(网格法),前一种是逐个进行单粒子模拟,后一种是将空间定义为多个网格单元,通过观察网格来决定如何模拟,关于这两种方法会在GAMES201物理引擎实战中有详细讲解

将上述两种思想结合,就是现在流行的材质点方法(MPM)

具体做法是,先将属性参数储存在粒子上(拉格朗日视角),再在模拟变换的过程中运用欧拉视角进行模拟计算,最后将每一个时刻网格的信息写回网格内的粒子上,并渲染到屏幕上

MPM

【END】