动画原理
根据视觉暂留现象,只要离散的画面切换的足够快,在人眼看起来就是连续的。
一般电影是24fps,一般视频是30fps以上,VR是90fps以上。
关键帧动画
重要的动作节点,会作为关键帧。而中间的帧会作为动作间的过渡。
关键帧一般是画出来的。过渡帧也可以画,现在也有不少的软件可以自动生成过渡帧。
关键帧插值
自动生成过渡帧就用到了关键帧插值。
有线性插值,也有更光滑的插值。
物理模拟
将各种各样的物理公式用来计算物体的运动,称为物理模拟、物理仿真。
质点弹簧系统
最简单的单位是:一个弹簧连接了两个质点。
假设两个点为\(a,b\)
则
\[\bm f_{a\to b}=k_s(\bm{b}-\bm{a})\\ \bm f_{b\to a}=-\bm f_{a\to b} \]
上述情况的条件是弹簧长度为\(0\),若弹簧原始长度为\(l\),则
\[\bm f_{a\to b}=k_s\frac{\bm b-\bm a}{||\bm b-\bm a||}(||\bm b-\bm a||-l) \]
上述情况假设没有能量损失,如果假设存在阻力,如\(b\)物体的阻力是
\[\bm f=-k_d\dot{\bm b} \]
其中\(\dot{\bm b}\)是\(\bm b\)的一阶导数,即速度。
考虑整个物体,此时要考虑两个物体的相对速度,则施加在\(b\)上面的阻力为
\[\bm f_b=-k_d\frac{\bm b-\bm a}{||\bm b-\bm a||}\cdot(\dot{\bm b}-\dot{\bm a})\cdot\frac{\bm b-\bm a}{||\bm b-\bm a||} \]
弹簧组成的结构
例如组成一个网状结构、立方体结构等等。
结构的行为更多的取决于弹簧的连接方式。
粒子系统
直接定义众多小粒子,来描述更宏观的运动现象。通常可能比物理意义上的粒子(如原子)要大得多。
它便于理解和实现,并且有较好的扩展性。
但是有时需要大量粒子,如模拟流体;还需要加速结构。
对于每一帧动画:
- 如果需要,创造新的粒子
- 计算每个粒子上收到的力
- 更新粒子的位置和速度
- 如果需要,移除一些粒子
- 渲染粒子
粒子系统中的力:引力、电磁力、摩擦力、空气阻力等等。粒子系统还有碰撞。
单粒子模拟
速度场
描述了在某个位置,某个时间上的粒子的速度。(这里的x我推测是向量)
\[v(x,t) \]
然后有常微分方程(ODE)
\[\frac{dx}{dt}=\dot{x}=v(x,t) \]
欧拉方法
用前一帧的量去估计下一帧的量
\[x_{t+\Delta t}=x_t+\Delta t\dot{x}_t\\ \dot{x}_{t+\Delta t}=\dot{x}_t+\Delta t\ddot{x}_t \]
问题:非常不准确,非常不稳定。主要是步长\(\Delta t\)的存在导致的问题。这其实也是用数值方法来计算的共有问题。
解决(降低)不稳定性的方法有:中点法、自适应步长法、隐式欧拉方法、基于位置的方法等等。
中点法
\[x_{mid}=x(t)+\Delta t/2\cdot v(x(t),t)\\ x(t+\Delta t)=x(t)+\Delta t\cdot v(x_{mid},t) \]
自适应步长法
- 定义一个threshold
- 计算以\(T\)为步长,计算一次欧拉方法,得到\(x_T\)
- 以\(T/2\)为步长,计算两次欧拉方法,得到\(x_{T/2}\)
- 计算error,即\(x_T-x_{T/2}\)
- 如果error>threshold,则减小步长\(T\),重试。
隐式欧拉方法
\[x_{t+\Delta t}=x_t+\Delta t\dot{x}_{t+\Delta t}\\ \dot{x}_{t+\Delta t}=\dot{x}_t+\Delta t\ddot{x}_{t+\Delta t} \]
解这个非线性方程,求出\(x_{t+\Delta t},\dot{x}_{t+\Delta t}\)。用求根的算法,例如牛顿迭代法或者下述Runge-Kutta方法。隐式欧拉方法稳定性很好。
Runge-Kutta 方法
非常擅长解非线性方程。其中RK4最常被使用。
首先,我们知道
\[\frac{dy}{dt}=f(t,y),\quad y(t_0)=y_0 \]
则
\[y_{n+1}=y_n+\frac{1}{6}h(k_1+2k_2+2k_3+k_4)\\ t_{n+1}=t_n+h \]
其中\(h\)是步长
\[k_1=f(t_n,y_n)\\ k_2=f(t_n+h/2,y_n+hk_1/2)\\ k_3=f(t_n+h/2,y_n+hk_2/2)\\ k_4=f(t_n+h,y_n+hk_3) \]
基于位置的方法
- 在修正欧拉方法的步长后,约束粒子的位置以防止其不稳定
- 使用约束位置计算速度
但是这会导致能量损失。
刚体模拟
和粒子的模拟相似。
需要考虑转角,角速度等。仍然可以使用欧拉方法。
流体模拟
基于位置的方法
假设水都是由很多刚体小球组成的。
假设水是不可压缩的。
拉格朗日方法和欧拉方法
对于处理大量的物体
拉格朗日方法是将每个物体看成质点去处理。
欧拉法发是将空间切分为网格,对格子进行处理。
Material Point Method
混合了欧拉方法和拉格朗日方法。
正向运动学
关节骨骼模型
- 拓扑的(什么连向了什么)
- 关节的几何关系
- 树状结构
关节的类型:
- 类似于钉子的关节(只有一维旋转)
- 类似于球的关节(可以在两个维度内旋转)
- 平移关节
只要提供骨骼的长度和关节旋转的角度,就能知道尖端处于什么位置。
逆向运动学
控制尖端的位置,然后自动计算合理的关节、骨骼位置。
有时候解不唯一,并且解很难以求得。
Rigging
类似于提线木偶,也可以说是逆向运动学的一种应用。
主要是给角色的一些部分以更高级的控件(控制点),可以进行鼠标拖动位置等修改。像是贝赛尔曲线。
动作捕捉
把现实中的数据应用到Rigging上的操作。