动画与仿真
动画
关键帧动画
在生成关键帧后,通过特定模型的插值得到过渡帧


仿真
仿真概述
仿真的作用一般是使模拟物体按照要求的方式运动
而渲染的作用就是给物体上色
质点-弹簧系统
根据胡克定律写出弹簧因形变而产生的力

再加上弹簧振动时的阻尼damping force,就可以得到弹簧的内部力

还可以将多个弹簧组合成各种形状

布料的模拟
布料可以通过质点-弹簧系统模拟
布料的基础也是将弹簧连成网格状,但真正的布料还需要补充上抗剪切力和抗弯曲力
抗剪切力:防止布料被斜向拉扯造成形变
抗弯曲力:防止布料被折叠

下图中,补充的蓝色弹簧使得布料抗剪切,在斜向拉扯时会有蓝色弹簧缩短;蓝色弹簧也有抗弯曲的作用,在斜向对折时,有蓝色弹簧缩短
补充的红色弹簧使得布料不能沿原来的黑色线弯曲

粒子系统
得到每一帧动画的过程
- 创建新的粒子
- 计算粒子的受力
- 更新粒子的位置
- 清除没用的粒子
- 渲染粒子
第2到第3步被称为模拟,始终是先模拟,再对需要的粒子进行渲染
下图就是一个海浪的模拟和渲染。模拟后渲染就可以得到真实海浪


动物群的模拟也可以用粒子系统实现
鸟群之间存在
- 吸引力:鸟与鸟之间不会离得太远
- 排斥力:鸟与鸟之间也不会离得太近
- 一只鸟的方向,会尽量与周围的鸟一致
![image]()
模拟粒子系统
有三种方式模拟
- 拉格朗日方法:对每个粒子逐个模拟
- 欧拉方法:将整个空间用网格分隔开小格,小格的位置不会发生变化,对每个小格内的变化做分析即可
- Material Point Method:将拉格朗日方法和欧拉方法结合,粒子上记录了信息,但我们对小格进行模拟,模拟后再将小格的属性插值回到粒子上
运动学
Kinematics包括forward和backward
Forward Kinematics中包括几种连接结构
-
Pin:只能在二维平面上旋转
![image]()
-
Ball:类似于关节的结构,可以在限定的三维空间中转动
![image]()
-
Prismatic joint: 允许平移
![image]()
Forward Kinematics非常简洁明了,可以通过调节连接结构的角度或者长度来实现任意运动,但是对于动画制作来说,调节角度是不够直接明了的
Inverse Kinematics:可以自己设计物体的运动轨迹,不需要管角度调整,再由计算机通过运动轨迹来计算出角度变化,再实施运动。往往角度是用优化的方法来解出


Rigging
rigging就是在物体上添加控制点,每个控制点都能进行位置调节,从而实现对整个物体运动的控制

在制作动画时,前一关键帧与后一关键帧中,同一控制点在前后两个时间,如果需要得到过渡帧,就将两个控制点的属性做插值即可
动作捕捉
动作捕捉就是在人上加控制点,人的运动带来控制点的移动
再将人上的控制点映射到动画人物上的控制点,就可以得到动画人物的rigging

动作捕捉优点在于得到的人物动作比较真实,而且得到数据比较简单,不需要技术人员完全手工调整控制点
缺点在于真人的动作不一定符合虚拟人物的动作,还需要技术人员对控制点微调,而且动作捕捉棚的搭建花费高昂
刚体
刚体不会发生形变,即刚体内所有的点都在同时完成同样的运动,我们把刚体可以看作一个粒子
流体
流体模拟的一种方法:Position-based method
假设
- 流体是由很多刚体小球组成的,即用粒子系统模拟流体
- 一块静止的流体是不能压缩的,即任何地方任何时间流体的密度都保持一致
Position-based Method的思想:如果任何一部分流体的密度变化了,都应该向标准的密度纠正
在模拟时,先计算在流体的整体中,流体的密度在每个小球位置的梯度
然后用梯度下降法纠正
Position-based Method不是一个基于物理的方法,所以无法保证能量守恒

常微分方程
Euler Method
求解常微分方程Ordinary Differential Equation ODE
Ordinary代表不存在偏微分
解常微分方程最基础的方法就是Euler Method
就是用以下这种方法递推


但如下图,Euler Method存在两点缺陷
- 误差:每一次推导都会存在误差,而且误差会积累
- 不稳定:误差会可能使得拟合像第二张图一样,完全不拟合而且发散
![image]()
Midpoint Method
先用一次Euler Method,得到下一帧的位置
取第一帧与第二帧位置的中点,记录中点的速度\(v_{mid}\)
重新从第一帧位置用\(v_{mid}\)来做Euler Method,得到真正的第二帧位置
这样可以实现更加准确的运动轨迹

Adaptive Step Size
在每次Euler Method后,得到第二帧位置后,试着通过缩小到一半的\(\deltaT\)来做两次Euler Method,得到另一种第二帧的位置
比较两个位置,如果相差不多,则这一段就用\(\deltaT\)即可;如果相差比较多,则这一段用\(\delta\frac{T}{2}\)
最终得到的整个曲线的拟合是用了不同长度的分段

Implicit Euler Method
用下一帧的速度/加速度来做这一帧的Euler Method
我们已知当前\(x\)和下一帧的\(x''\),要用下面两个方程解出下一帧的\(x\)和\(x'\),往往用优化的方法来解出

Implicit Euler Method的稳定性可以用local and global error来描述
Implicit Euler Method的local truncation error是\(O(h^2)\),global truncation error是\(O(h)\)
这代表着,当\(\deltaT\)缩小到一半,则global error缩小到一半,local error缩小到\(\frac{1}{4}\)
Runge-Kutta Family
Runge-Kutta Family是一系列解决常微分方程的方法
RK4可以达到四阶的稳定性,具体步骤如下







浙公网安备 33010602011771号