返回

计算机图形学基础学习笔记-动画与模拟

动画原理

根据视觉暂留现象,只要离散的画面切换的足够快,在人眼看起来就是连续的。

一般电影是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||} \]

弹簧组成的结构

例如组成一个网状结构、立方体结构等等。

结构的行为更多的取决于弹簧的连接方式。

粒子系统

直接定义众多小粒子,来描述更宏观的运动现象。通常可能比物理意义上的粒子(如原子)要大得多。

它便于理解和实现,并且有较好的扩展性。

但是有时需要大量粒子,如模拟流体;还需要加速结构。

对于每一帧动画:

  1. 如果需要,创造新的粒子
  2. 计算每个粒子上收到的力
  3. 更新粒子的位置和速度
  4. 如果需要,移除一些粒子
  5. 渲染粒子

粒子系统中的力:引力、电磁力、摩擦力、空气阻力等等。粒子系统还有碰撞。

单粒子模拟

速度场

描述了在某个位置,某个时间上的粒子的速度。(这里的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) \]

自适应步长法

  1. 定义一个threshold
  2. 计算以\(T\)为步长,计算一次欧拉方法,得到\(x_T\)
  3. \(T/2\)为步长,计算两次欧拉方法,得到\(x_{T/2}\)
  4. 计算error,即\(x_T-x_{T/2}\)
  5. 如果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

混合了欧拉方法和拉格朗日方法。

正向运动学

关节骨骼模型

  1. 拓扑的(什么连向了什么)
  2. 关节的几何关系
  3. 树状结构

关节的类型:

  1. 类似于钉子的关节(只有一维旋转)
  2. 类似于球的关节(可以在两个维度内旋转)
  3. 平移关节

只要提供骨骼的长度和关节旋转的角度,就能知道尖端处于什么位置。

逆向运动学

控制尖端的位置,然后自动计算合理的关节、骨骼位置。

有时候解不唯一,并且解很难以求得。

Rigging

类似于提线木偶,也可以说是逆向运动学的一种应用。

主要是给角色的一些部分以更高级的控件(控制点),可以进行鼠标拖动位置等修改。像是贝赛尔曲线。

动作捕捉

把现实中的数据应用到Rigging上的操作。