GAMES101 21-22 笔记 动画模拟
Animation 动画
- 关键帧动画(Keyframe Animation)
关键的几帧决定整体走向,其他插帧 - 物理模拟(Physical Simulation )
运用牛顿力学等来制作(衣服、流体等)
Mass Spring System 支点弹簧系统
由一系列相互连接的支点和弹簧组成,基本组成部分是一个弹簧连接两个支点,然后就有弹力:
a, b都是向量。
因为弹簧长度不可能为0(即有初始长度),所以修改为:
但它仍有问题:会永远动下去没有损耗。
摩擦力:
向量上一点表示其速度,两点表示其加速度。
但弹簧的摩擦力和普通的不太一样,是源于其内部的,所以需要稍作修改:
其中红框指的是b相对a的速度在ab方向上的投影(因为比如绕圈圈这种其实不算),再乘以单位方向向量来表示成一个向量。
结合弹力的反向拉力和这个摩擦力才得到整个弹簧a端给b端(或相反)的拉力
由这种基础原件构成的结构与现实情况仍有差别,比如由它构成的布料的结构,会出现切变(对角线往外拉是能拉动的,然而事实上布料会有抵抗这个拉力的能力)和能够对折成一个面(布料很难对折到一个面上)
多次修改之后最终是这样:
淡蓝色是防止切片为主,红色是防止对折类。
Particle System 粒子系统
灰尘、魔法等还好用,很好使用和实施且具有规模效应,但需要粒子的量很大(比如流体中)以及需要一些加速结构等。
具体使用步骤如下:
粒子间的力有以下几种:
- 引力和斥力:
万有引力,电磁力…
弹力,推进力… - 阻尼力
摩擦力,空气阻力,粘度… - 碰撞
墙壁、容器、固定物体…
动态对象、角色身体部分…
粒子不局限于小的颗粒,也可以是群体中的个体,比如鸟群中的鸟
正向运动学 Forward Kinematics
有三种连接点:
- 只能转的1维
- 只固定一个点可以四面八方转的二维
- 可以伸长变化的
使用时需要计算,比如:
逆向运动学 Inverse Kinematics
给定最终要的位置,求怎么旋转等摆动。
思维简单方便,操作困难,如上图中逆向的话就是给定P点,求θ1 和θ2 。
逆向运动学的问题是有多种方式达到想要的效果或者没有方法能达到(多解或无解)。
解决方案是通过优化:
Rigging
有点像木偶戏,有很多控制点
会用到Blend Shapes,即不同帧间控制点的位置变化通过插值来使其流畅
Motion Capture
动作捕捉,方便、能快速获取大量真实数据但复杂、成本高且可能无法完全实现想要的效果
有各种各样的动捕设备,最准的是光学的动捕。
整个动画电影制作的pipeline如下:
动画制作具体细节
单粒子模拟
显示欧拉方法
欧拉方法使用起来主要有两个问题:
- 每一步是通过Δt来更新的,而不是完全微分跟着时间走的(会变成折线)
- 正反馈过大,很不稳定。
有几种方法来解决:
Midpoint method / Modified Euler
- 先用欧拉法计算步长a
- 计算步长a的中点的速度方向v(xmid,t)
- 用这个速度重新计算新的步长得到结果
比原来单纯的欧拉多了一项
Adaptive step size
把步长Δt再分为两段(根据中点):
Implicit Euler Methods
稳定性好。
速度和加速度直接用下一帧的,在计算时还未得到的。
那怎么定义稳定性呢:
局部误差和全局误差(定义了误差的阶数),比如一阶就是O(h) h是步长,也就是Δt,理解起来就是如果h缩小一般,误差也会缩小一半,二阶就是1/4,以此类推。
隐式欧拉是一阶误差,也就是:局部误差:O(h2) 、全局误差O(h)
Runge-Kutta Families
隐式欧拉是一阶,这个方法是四阶(效果很好)
Position-based / Verlet integration
通过改进欧拉步进,约束粒子的位置,防止发散。
不稳定的行为使用受约束的位置来计算速度。
优点是快、简单,缺点是不是基于物理的,有能量损耗误差。
刚体模拟 Rigid Body Simulation
刚体中的部分是和整体不剥离的,一起运动的,所以其实就是一个放大版的粒子,但是要考虑更多的物理量:
流体模拟 Fluid Simulation
A Simple Position-Based Method
关键思想:
- 水是由很多小的刚体球体组成
- 水不可以被压缩
- 因而只要水的密度发生变化(不稳定),就需要让它恢复到原本的密度状态(平静的水),通过移动粒子来实现
- 这样做需要知道每一个粒子的密度梯度
- 更新则通过梯度下降实现
对大空间多物体的分析:
随着时间推移,前者基于物体,后者基于空间。
还有混合法:
先将不同的材质属性(密度、粘性等)存在粒子上,然后在网格中去模拟过程(此图是融化)进而计算整合,最后将这些格子里的属性信息再写回给粒子。