快速跳转:
1、矩阵变换原理Transform(旋转、位移、缩放、正交投影、透视投影)
2、光栅化(反走样、傅里叶变换、卷积)
3、着色计算(深度缓存、着色模型、着色频率)
4、纹理映射(重心坐标插值、透视投影矫正、双线性插值MipMap、环境光遮蔽AO)
5、几何(距离函数SDF、点云、贝塞尔曲线、曲面细分、曲面简化)
6、阴影映射(Shadow Mapping)
7、光线追踪原理(线面求交、预处理光追加速)
8、辐射度量学与光线追踪
9、蒙特卡洛路径追踪(Path Tracing)(光源采样)
10、材质(BRDF)(折射、菲涅尔项、微表面模型、各向异性材质)
11、渲染前沿技术介绍(双向路径追踪BDPT、MLT、光子映射、实时辐射度、外观建模)
12、相机(视场、曝光、光圈(F-Stop)、薄棱镜近似、CoC、景深)
13、光场、颜色与感知
14、动画(物理模拟、质点弹簧系统、粒子系统、运动学、动作捕捉、欧拉方法)


Lecture 21

  • 1 动画分类
    • 1.1 关键帧动画(Keyframe)
    • 1.2 物理模拟(Physical Simulation)
    • 1.3 质点弹簧系统(Mass Spring System)
    • 1.4 粒子系统(Particle Systems)
    • 1.5 正向运动学(Forward Kinematics)
    • 1.6 逆运动学(Inverse Kinematics)
    • 1.7 动画绑定(Rigging)
    • 1.8 动作捕捉(Motion capture)
    • 1.9 动画电影生产线(Pipeline)
  • 2 单粒子模拟(Single Particle Simulation)
    • 2.1 欧拉方法(Euler Method)
    • 2.2 对抗不稳定性的方法
      • 2.2.1 中点法(Midpoint method)
      • 2.2.2 变形欧拉法(Modified Euler)
      • 2.2.3 自适应步长(Adaptive Step Size)
      • 2.2.4 隐式欧拉方法(Implicit Euler Method)
      • 2.2.4 Runge-Kutta Families
  • 4 刚体模拟(Rigid Body Simulation)
  • 5 流体模拟(Fluid Simulation)
    • 5.1 基于位置的方法(Position-Based Method)
  • 6 欧拉 vs 拉格朗日(Eulerian vs Lagrangian)

1 动画分类

1.1 关键帧动画(Keyframe)

  • 在关键的位置上制作一帧画面,而中间的过程采用自动生成的方式形成动画
  • 自动生成可以用线性插值的方式,但是很生硬。
  • 用splines来平滑过度或者有必要的突变则会有更好的动画效果

1.2 物理模拟(Physical Simulation)

已知物体质量,给物体应用一个力,则可以算出它的加速度,再引入时间,就能算当前时刻速度、位置等一系列信息,然后就可以动态的更新下一时刻的信息从而产生动画了。

物理仿真/模拟背后的核心思想就是构建物理模型,分析受力,从而算出某时刻的加速度、速度、位置等信息。
只要能够正确建立物理模型,一定可以得出正确的物理模拟结果。


1.3 质点弹簧系统(Mass Spring System)



质点弹簧系统: 一系列相互连接的质点和弹簧

简单、理想化的弹簧(帮助理解)

  • 没有长度
  • 弹簧拉多长就产生多大的力
  • 受力计算方法如下,只有将质点向内拉的力,ks 为弹性系数。

正常的有长度的弹簧

  • 弹簧被拉长会产生向内收缩的力,被压短则产生外推力
  • 弹簧常态长度为 l,受力大小依然形变大小成正比,计算方式如下
  • 存在的问题:永远震荡不会停止,动能与势能不停转变,没有损耗。

(1)简单的引入阻尼(错误方法)

  • 介绍如下记号,打点表示对时间 t 求导,位移x求导1次是速度,求导2次为加速度。(简单物理)
  • 简单的阻尼表示:与速度反向相反,在数学中的表示如下,其中kd 为阻尼系数,
  • 引入简单阻尼产生的bug:他会减慢一切运动。
    (理解:我们引入阻尼真正的目的是让震荡的弹簧不会永远震荡下去,会因为阻尼的存在而停下。目前引入的阻尼确实能达到目的,但还会阻止一个处于常态的弹簧的一切非震荡运动。比如弹簧两端相对静止,但是处于自由落体状态,都有向下的速度,则此阻尼力会使他落得越来越慢,这不正常)

(2)引入弹簧内部阻尼(正确方法)

  • 限制阻尼只发生在弹簧内部,只作用于因弹簧形变引起的运动。
  • 未达目的,必须引入相对运动,公式更改如下(注意这里算阻尼跟伸缩长度没关系)
参数 说明
kd 阻尼系数
单位向量,表方向,a指向b
左边是单位向量ab,右边是b点相对于a的速度向量,点乘表示把速度投影到ab方向上(注意是标量了!),投影目的是:防止两端相对静止,一个球绕另一个球做圆周运动而出现的阻尼。

弹簧结构: 不同弹簧的组合,会有不同的性质,可以模拟不同的物品。

布料模拟推导过程

序号 结构 说明
0 不能模拟布料,因为它不具备布的特性(不能抵抗切力、不能抵抗对折力(布料多少有点抵抗对折的能力,因为它不能像纸一样被折叠))
1 改进了一点,虽然能抵抗图示对角线的切力,但是存在各向异性。依然不能抵抗折叠。
2 可以抵抗切力,有各向同性,不抗对折
3 红色skip connection,注意红线的力比较小。现在可以比较好的模拟布料
效果图:(本来是动画(⊙o⊙)…意思意思就行了)

另外有限元方法也是另一种不同于弹簧的模拟方式,这里不涉及


1.4 粒子系统(Particle Systems)

  • 建模一堆微小粒子,定义每个粒子会受到的力(粒子之间的力、来自外部的力、碰撞等)
  • 在游戏和图形学中非常流行,很好理解、实现

最简单的实现算法

  • 动画的每一帧

    • 创建新的粒子(如果需要)
    • 计算每个粒子的受力
    • 更新每个粒子的位置和速度
    • 结束某些粒子生命(如果需要)
    • 渲染

粒子系统较为简单不放图片了,嗯。。各种游戏引擎里面的粒子系统大家接触得很多了,如UE4里的Niagara系统中一个发射器就用类似上面这种算法从上到下进行计算的。


1.5 正向运动学(Forward Kinematics)

(1)骨骼动画
骨骼系统

  • 拓扑结构
  • 关节相互的几何联系
  • 树状结构

关节类型

  • Pin(滑车关节):平面内旋转
  • Ball(球窝关节):一部分空间内旋转
  • Prismatic joint(导轨关节):允许平移

例:由两部分骨骼构成的2D的手臂
第一部分旋转θ1,第二部分旋转θ2,问端点p的位置在哪?

  • 计算方法非常简单,说明只要定义好骨骼连接方式,任何时刻只要知道角度,就能算出尖端p应该停在哪里

运动学

  • 优点:控制方便、实现非常直接
  • 缺点:艺术家们不喜欢这种方式的动画创作

1.6 逆运动学(Inverse Kinematics)

正向运动学:通过骨骼旋转角度计算尖端位置
逆向运动学:通过控制尖端位置,反算出应该旋转多少

例:依然是最简单的2部分组成的手臂
知道p点位置,反算骨骼角度

逆运动学存在的问题

  • 解并不唯一,两种不同的角度组合方式都能让p处于目标位置
  • 并不是一定有解,即会有无解的情况,如下图尖端活动范围有限

优化方式有很多,这里略略略略略略略…


1.7 动画绑定(Rigging)

rigging是一种对角色更高层次的控制,允许更快速且直观的调整姿势、表情等

  • 皮影戏就有点这个味道,但是提线木偶对表情、动作的控制更贴切一些
  • 在角色身体、脸部等位置创造一系列控制点,艺术家通过调整控制点的位置,带动脸部其他从点移动,从而实现表情变化,动作变化等。
  • 缺点:需要艺术能力也需要技术,全手工制作费时费力费钱。

Blend Shapes:直接在两个不同关键帧之间做插值,注意是对其表面的控制点做插值


1.8 动作捕捉(Motion capture)

在真人身上放置许多控制点,在不同时刻对人进行拍照,记录控制点的位置,同步到对应的虚拟人物上。

优点

  • 快速获得大量真实数据
  • 非常真实
    缺点
  • 昂贵、准备工作麻烦
  • 捕捉的动画跟预期艺术需要不太符合,需要调整
  • 控制点被遮挡问题

众多动捕设备中最常用的还是光学动捕设备

  • 最重要的被遮挡问题,可以通过增加摄像机等方法避免
  • 得到的数据是每个控制点在三维空间中的运动数据

阿凡达面部动捕


1.9 动画电影生产线(Pipeline)

总之费钱、费艺术家

2 单粒子模拟(Single Particle Simulation)

学习单个粒子的运动,之后再推广到多粒子系统

  • 假设粒子的运动由速度矢量场决定,速度场是关于位置和时间的函数:v(x, t)
  • 速度场:定义质点在任何时刻在场中任何位置的速度。给个位置和时间,就能知道速度
  • 如下图,箭头方向是速度方向,曲线是粒子在这个速度场中的运动轨迹(粒子0时刻位置知道,以后每个时刻速度都根据速度场进行变化,由于速度变化,位置也会跟随时间产生变化,从而形成的轨迹)

常微分方程
已知速度,建立方程,解常微分方程就可以得到位置量

2.1 欧拉方法(Euler Method)

a.k.a 前向欧拉、a.k.a 显式欧拉

  • 简单迭代方法,用上一时刻的信息推导这一时刻的信息
  • 很常用、非常不准确、非常不稳定

(1) 已知 t 时刻的位置和速度,求下一时刻 t + Δt 的位置(注意右上角的角标仅表示时刻信息)

(2) 已知 t 时刻的速度和加速度,求下一时刻 t + Δt 的速度

(1)欧拉方法的误差

  • 如果采用较大的Δt,误差会很大,并且误差会积累
  • 可以通过缩小Δt来控制误差

(2)欧拉方法的不稳定性

  • 与误差无关,不管取多小的时间差,最后的结果都会和正确结果相差无限远。

  • 假设有一个圆形速度场,速度一直是垂直于直径的,按理来说粒子在这里会一直做圆周运动不会飞出去,但是用欧拉方法,不管选择多小的步长Δt,粒子都会飞出去

  • 假设如下速度场,粒子初始点在下方,会被下方速度场推到右上方,又被上方的速度场推向右下方,如此交替往复。
    但是这个速度场,这样的粒子初始位置,正确的路径应该是沿着速度场,缓慢向中间靠拢,最后收敛于中间。

2.2 对抗不稳定性的方法

  • 为了解决欧拉方法计算结果跟正确结果偏差越来越大而提出的一系列方法

2.2.1 中点法(Midpoint method)

  • 欧拉方法计算质点 t 时刻经过Δt之后的位置a
  • 弃用a点选择其中点位置b,得到中点处的速度矢量
  • 用中点的速度,计算初始点经过Δt后的位置c
  • 如下两个式子,先计算中点b的位置xmid,然后得到t时刻xmid处的速度**v(xmid, t)**算位置c

2.2.2 变形欧拉法(Modified Euler)

  • 取开始和结束位置的速度的平均速度,再计算最终位置

2.2.3 自适应步长(Adaptive Step Size)

  • 基于误差估计,自动选择步长Δt
  • 非常实用
  • 但是可能会让步长变得特别小

实现步骤

  • 先用步长 T 做一次欧拉计算 XT
  • 再用步长 T/2 做两次欧拉得到 XT/2
  • 比较两次位置误差error ||XT - XT/2||
  • if(error > threshold) 减少步长,重复上面步骤

所以如果误差error很大,就会往下细分,直到误差够小为止,这样可以模拟出比较好的效果如右图。拐弯的地方一般步长会比较小。

2.2.4 隐式欧拉方法(Implicit Euler Method)

  • 跟欧拉方法唯一的区别是:用下一个时刻的速度和加速度来计算下一个时刻的位置和速度
  • 但是下一个时刻的速度和加速度我们并不知道,所以搞出来是个方程组,这个不好解。。
  • 这个方法提供比较好的稳定性。

怎么定义稳定性?

  • 局部截断误差(local truncation error):每一步的误差
  • 全局累积误差(total accumulated error):总的累积误差

but上面两个数值并不重要,重要的是步长h误差的关系(用阶来描述)

  • 隐式的欧拉方法是1阶,阶数越高代表方法越好
  • 局部误差:O(h)
  • 全局误差:O(h2)

O(h)意思是一阶,步长Δt变为原来的一半,误差也变成原来的一半
O(h2)则表示,步长变为原来的一半,误差变成原来的四分之一

下面介绍一种更好的4阶的方法。

2.2.4 Runge-Kutta Families

这是求解一阶微分方程的一系列方法

  • 特别擅长处理非线性问题
  • 其中最常用的是一种能达到4阶的方法,也叫做RK4

方法的使用如下

  • 初始情况,跟之前没啥不同,也就定义一下各个量,微分方程是关于时间t 和 位置y的,t0时刻位于y0
  • RK4求解方法(h是步长,相当于之前的Δt。下一时刻的位置等于当前时刻+六分之一倍的步长乘以一个组合,这个组合比较复杂,看下面)
  • 其中k1 ~ k4

更详细的推导,参考《数值分析》这门课

4 刚体模拟(Rigid Body Simulation)

模拟刚体很简单

  • 刚体不会发生形变
  • 类似于粒子系统,刚体相当于内部所有粒子以相同方式运动
  • 不同的是刚体的模拟中,会考虑更多的属性
  • 有以下属性,可以根据前面提到的欧拉方法或者各种其他稳定性好的方法得出经过Δt以后的位置、角度等信息

5 流体模拟(Fluid Simulation)

5.1 基于位置的方法(Position-Based Method)

通过形成一些小球,通过它们的位置来模拟水和浪花。基于位置的方法不是物理的,没有能量损失,虽然可以人为的加入能量衰减
主要思想

  • 水是由一个个刚体小球组成的
  • 水不能被压缩
  • 任何一个时刻,某个位置的密度发生变化(不同于平静水时该空间的小球的密度),就必须通过移动小球的位置进行密度修正
  • 需要知道任何一个位置的密度梯度(这是机器学习的梯度下降)
  • gradient descent梯度下降

6 欧拉 vs 拉格朗日(Eulerian vs Lagrangian)

大规模模拟问题中有两个基本的思路

  • 拉格朗日法(质点法):类似于模拟水,我们认为水是许多不同刚体水滴组成,模拟好每一个水滴,知道每一个在某个时刻应该在什么位置,即可很好的模拟水。
  • 欧拉方法(网格法),不同于之前的解微分方程的欧拉方法,这里是指把空间分成一个个网格,考虑一个网格随着时间不同的变化

Mterial Point Method(MPM)
把欧拉法和拉格朗日法混合在一起

  • 拉格朗日法:考虑每个粒子都带有一些材质属性
  • 欧拉法:用网格做数值积分处理
  • 混合:粒子把属性传给网格,网格计算处理更新后返还给粒子

计算机图形学【GAMES-101】14、动画(物理模拟、质点弹簧系统、粒子系统、运动学、动作捕捉、欧拉方法)相关推荐

  1. [计算机图形学]动画与模拟:关键帧动画、质点弹簧系统、运动学与绑定(前瞻预习/复习回顾)

    一.动画的简要概念 动画和语言一样,一开始都是作为传达信息的工具.什么是动画呢?简单的理解就是让画面变成"活的",也就是让它们能够动起来,其次需要一定的美观.在图形学上,我们可以把 ...

  2. 图形学笔记(二十)粒子、刚体、流体的模拟—— 欧拉方法、Errors 和 Instability、中点法、自适应步长、隐式欧拉方法、Runge-Kutta方法、刚体与流体模拟(质点法、网格法、MPM)

    图形学笔记(十九)粒子.刚体.流体的模拟-- 欧拉方法.Errors 和 Instability.中点法.自适应步长.隐式欧拉方法.Runge-Kutta方法.刚体与流体模拟(质点法.网格法.MPM) ...

  3. 图形学笔记(十九)动画 —— 动画的历史、关键帧插值、物理仿真、质点弹簧系统、粒子系统、(反向IK)动力学、Rigging 绑定、Blend Shapes、动作捕捉

    图形学笔记(十八)光场.颜色和感知-- 光场相机(全光函数.光线和光场的定义).可见光谱.谱功率密度.颜色的生物学基础.Tristimulus Theory.同色异谱.加色与减色系统.颜色空间SPD ...

  4. 动画都要用计算机图形学吗,计算机图形学在电影和动画中的应用.pdf

    计算机图形学在电影和动画中的应用.pdf SoftwareApplication ·软件应用 计算机图形学在电影和动画中的应用 文/费立伟 工学院毕业论文课题是关于三维交互式图形系 计算机软硬件和图形 ...

  5. [计算机图形学]动画与模拟:欧拉方法、刚体与流体(前瞻预习/复习回顾)

    一.前言 这是本专栏的倒数第二篇文章了,为什么不是最后一篇?因为我要单独写一篇总结哈哈,不管怎么说,从今年的3.13的MVP变换开始写,写到现在,也是一个很大的工程了,我很高兴能在大二下学期的期中这个 ...

  6. c语言图形学彩球上浮,计算机图形学 弹跳的彩球动画.doc

    计算机图形学 弹跳的彩球动画 课程设计任务书 题目: 弹跳的彩球动画 课程设计任务书及成绩评定 课程设计的内容和具体要求 1.设计内容: 弹跳的球体:一个着色的三维球体,沿着一条给定的轨道(正弦衰弱曲 ...

  7. xp计算机关闭139端口,小编搞定xp系统电脑关闭139端口的图文方法

    我们在使用xp系统的过程中,经常需要对xp系统电脑关闭139端口进行设置,可能很多用户都不知道怎么对xp系统电脑关闭139端口进行设置,但当我们遇到对xp系统电脑关闭139端口的设置方法非常简单,只需 ...

  8. win7 修复计算机 黑屏,boot bcd修复win7 旗舰版系统黑屏错误代码0xc0000034的解决方法...

    Win7旗舰版系统全面的功能,稳定的性能,人性的操作界面赢得了用户的喜爱,但是再完美的系统,有时也是会出一些故障,比如有一用户反馈在开启时出现黑屏.错误代码0xc0000034,不知怎样解决.为了帮助 ...

  9. 计算机映像缺失磁盘如何修复,重装Win10系统找不到硬盘的解决方法

    重装Win10系统找不到硬盘该如何解决?硬盘是计算机的存储设备,是系统安装的所在地,一般电脑系统出现崩溃问题的话,大多数朋友都会选择重装Windows10系统来修复.但是有朋友在重装Win10系统的时 ...

最新文章

  1. 训练集(train set) 验证集(validation set) 测试集(test set)
  2. APM - 零侵入监控JDBC服务
  3. 回顾游戏中的设计模式:策略模式vs抽象工厂
  4. el-select下拉框组件el-option如何使用v-for动态渲染问题 - 方法篇
  5. PHP如何判断一个数组是一维数组或者是二维数组?用什么函数?
  6. 大android 平板,15.6英寸安卓大平板? 阿芙罗S1评测
  7. github 搜索_如何通过GitHub快速的搜索资源?
  8. XFBAY学习笔记=++=实验十三 交换机和路由器组合实验
  9. 1043 : 最大值
  10. hud 4415 Assassin’s Creed
  11. 罗夏墨迹测验(转载)
  12. 含echarts图表の网页打印
  13. oracle数据库管理员账户锁定,Oracle数据库账号被锁定解决方法
  14. 笔记本电脑的电池越来越不耐用?那是你不会这样保养!
  15. Linux命令行修改配置(待续)
  16. Linux虚拟机配置网络代理配置yum源
  17. 车架号/vin码识别
  18. 基于ThinkPHP6+Layui通用后台管理框架
  19. IOS字体设置及展现效果
  20. 2023-01-18 ClickHouse之聚合功能源码分析

热门文章

  1. 泛微OA 开发环境搭建 IDEA
  2. python外星人入侵游戏图片_[Python]简单的外星人入侵游戏
  3. python编程:从入门到实践-2变量和简单数据类型
  4. 极客日报第4期:爆料 华为鸿蒙手机 OS 开发者 Beta 版预计 12 月 18 日开放;程序员的幸福指数是如何下降的?
  5. Watershed算法
  6. pyLDAvis3.3.1 报错 OSError: [Errno 22] Invalid argument: ‘https://cdn.jsdelivr.net/gh/bmabey/pyLDAvis@
  7. UVA 1626括号序列DP
  8. PS 图片编辑软件软件安装包下载地址及安装教程
  9. 随机森林的原理和用随机森林的方式进行特征选择
  10. java写入dat文件_java写入dat文件