动画:把物体变成活的,让它动起来
更关注的是美学。早期的动画是画出来的,并不关心对不对,符不符合物理,只要看起来对
图形学里对动画理解为对于建模或几何的拓展。动画无非就是在不同的时间或不同的帧有不同的几何形状,也就是将3D的模型延伸到时间的维度
将很多的图按顺序和一定的速度播放(因为人眼有视觉暂留的效应,所以不需要在整个时间范围内进行非常集中的采样)
Film(电影):每一秒放24张图(24fps)
Video(平常所说的视频):30fps
游戏(需要体验感好,连贯性高):60fps(甚至会到144HZ,也就是144张图每秒)
Virtual reality(虚拟现实):90fps(为了让人们戴上头戴式设备不晕,会有很多要求,就包括对帧率的要求非常高,要非常流畅,两个眼睛的帧率要达到90fps)
Historical Points in Animation
远古人类所画的壁画
随着科学的进步,人们人为的制造一些真正可以看到的动画
最早期,有类似圆盘的物体,圆盘中心固定在某个地方,可以旋转
到一定阶段,真正发明了电影技术
第一部手绘的和电影长度相当(Feature-Length)的动画。每一秒放24帧,那就要放24张图,放在一起播放,耗时很长
计算机本身也可以生成动画
显示人脸的三维网格模型
侏罗纪公园,真正将用电脑生成的恐龙放到了电影
第一个整个电影完全用计算机生成(CG,computer generate)——皮克斯的玩具总动员
是光栅化的方式生成的阴影
10年前的计算机动画
冰雪奇缘2,充满了各种细节
Keyframe Animation
上面一行,是一个人在不同的时间有3个不同的动作。(这3个动作是重要的位置,对应的帧就叫关键帧)
下面一行相当于在2个动作之间补出过渡的动作
给定一系列不同的帧,中间要插值出来,这就好像每一帧中有若干重要的点,这些重要的点在其他的帧长什么样,然后将它们一一对应找出来后,就可以将这些点在不同的帧之间通过插值的方法算出来
最简单的是线性插值,但下图就已经不是线性的了,对于这种过渡如何看着自然、真实,是有一定讲究的
线性插值:给你任意的连续的点,将其连起来,连成线段
但有时希望更好的连续性(比如C1),那就要用到曲线和样条,也就是说动画和之前所说的几何是非常有关联的
Physical Simulation
应用在物体有一个质量(质点),应用在物体上的力叫F,然后它就会获得一个加速度a(有加速度,就可以算速度,有速度就可以算位置。也就是说只要知道物体上的力和初始条件(初始位置、初速度),就可以动态的更新下一时刻的位置)
往某一个方向扔一个小球,小球会形成一个抛物线(因为它始终受到重力的作用,自然就会有一个加速度,也就会有速度,从而影响位置)
对于衣服来说,是用各种各样的网格形成的,任何一个顶点上有一定的质量,肯定会受到重力的影响,因为它又和其他的顶点相连,肯定还会受到来自其他点的作用力
虽然会复杂,但只要正确的把它受力的模型建立出来,就可以通过解一系列的方程将它算出来
例子:布料模拟
如果模拟得好,是不会出现反物理的现象的(比如衣服进到身体里等穿模现象),这就涉及到一系列的碰撞检测等问题
例子:流体(Fluids)
将下面的水分成2步看:
- 先模拟水是如何运动的,它的水滴在各种各样的地方是怎么形成的
- 当模拟了位置和形状后,进行渲染,得到它长什么样
Mass Spring System/质点弹簧系统
绳子模拟器:可以把一根绳子模拟成很多小的弹簧连接在一块,可以让它在重力的作用下来回摆
头发本身受重力,头发和头发之间有摩擦力
布料本身是网格描述的,自然就可以用各种不同的质点弹簧系统描述它,还可以通过一个点进行拖拽
质点弹簧系统:是一系列相互连接的质点和弹簧
最基础的单元:一个弹簧左右分别连着2个质点
一个理想的弹簧(没有长度、被拉开多长就会产生相应多大的力)
f a→b是应用到a上,往b方向的作用力,取决于a和b之间有多远
(b-a)是一个从a指向b的向量,所以这和它本身长度是有关系的,b-a越长,这个力越大,这样就可以写出a点往b方向去的力
Ks是劲度系数(胡克定律:固体材料受力后,应力和形变量之间成线性关系)
因为力的作用的相对性,a受到向右的力,b肯定受到向左的力,2和互为相反
弹簧正常情况下都应该有一定长度,叫做Rest length
弹簧可以拉伸和挤压,下面考虑拉伸,弹簧拉伸后:
b和a的距离为||b-a||
拉开的形变量(距离)为||b-a||-l
受力的方向((b-a)归一化):(b-a)/||b-a||
由于能量守恒,它会永远的振动下去(动能和势能始终在进行一个转换的过程)
加入摩擦力
引入在物理仿真中经常会用到的记号:
平常我们会用x来表示位置,x的一阶导数(x′)表示速度,x的二阶导数(x′′)表示加速度
在物理模拟中会用x上面加一个点表示速度,加2个点表示加速度
加入摩擦力(damping force)使它能停:
对于任何一个运动的质点,如果想让它停,那力的方向肯定和速度方向相反(如上图,b的速度往哪,摩擦力就与它相反,再乘上一个强度kd)
但这样会引起所有的运动都停下来。假如有一根弹簧a和b,a和b同步的向右一直移动,这样其实a和b之间没有相对的运动,也就是说这个弹簧没有拉伸,它不会振动,最后还会被摩擦力停下来。这样描述的摩擦力只能描述外部的力,描述不了弹簧之间内部的力(损耗)
拿一个质点弹簧系统,竖着放,一松手,会往地上掉,而且它作为一个整体,下落的速度是定的,那如果对a和b都应用摩擦力,它就会整个让弹簧往地上掉得越来越慢
加入内部摩擦力
内部的摩擦力应该和它们的相对运动有关系
内部摩擦力的目的:希望弹簧恢复到正常长度。只要a和b被拉开了,a就会向b方向去靠,所以这个摩擦力肯定是要使其往这个方向去。所以应用在b上的力的方向应该是向左的
方向:-(b-a)/||b-a||
大小:如上图红框里的部分(点乘),a和b之间的相对速度投影在ab方向上的速度(投影是因为有些速度(比如a固定,b绕a做圆周运动,它的速度是垂直弹簧的)并不能引起弹簧长度的改变)
弹簧可以组合成各种形状,如上图,可以每2根共用一个质量表示一张纸,也可以在三维空间中进行连接
现在用各种弹簧模拟一块布
问题1:切变会受影响(如果拉着上图布的2个角往外拽,形状自然会被拉成中间被拉成,两边收的形状。但布会抵抗切变的力,不会影响形状)
问题2:如果有一种力让整个形状变得不是一个平面(即out-of-plane bending)(如果沿着对角线折一块布,布本身有对抗这个的力)
解决切变的问题—加入斜的对角线
在以上的形状中加入斜的对角线,再拉就不能变成之前的形状了(因为拉的话,新加的蓝线会被压缩,那弹簧就会向外抵抗它)
但是这个结构不对称(对于一块布,往任何一个方向拉它,它的行为应该是一致的)
虽然沿右上到左下对折解决了问题2,但沿右下到左上对折仍然没有解决问题2
加上另外一个方向上的斜对角线
但这个形状不能抵抗非平面的弯曲(沿着竖的或横的线折叠)
加上skip connection的连线
如上图的红线,任何一个点都和它隔一个点连一根线
这个红线的连接是非常弱的(正常情况下布也可以折过来),蓝线非常强
质点弹簧系统做的裙子(只是简化的表示,并无纤维、股和线等之间的力的关系)
有限元方法(FEM (Finite Element Method)),这个方法被广泛应用于车子碰撞(车子接触墙的地方受力,为什么车子一直到车尾都会坏掉,因为力之间有传导diffusion的作用)
Particle Systems
描述一些很小很小移动的东西
建模一堆很微小的东西,定义每一个粒子会受到的力(有重力、风力、粒子和粒子之间的力)
很容易模仿一些魔法效果、雾、灰尘等等
粒子越多模拟得越精细,但是越慢;越少,跑起来越快,但效果差一些
挑战:
粒子系统可以模拟流体,这样可能需要很多粒子
粒子和粒子之间的作用不只有碰撞,还可能有引力(这样就要找粒子周围的最近的多少个粒子,这样就需要一些加速结构,然后粒子的位置还会移动,就还要进行更新)
算法:
- 动态生成一些新的粒子
- 计算每个粒子的作用力(内部的、外部的)
- 根据作用力更新粒子的位置和速度
- 如果粒子有存活时间,移除消亡的粒子
- 渲染粒子
难点:定义相互作用力,解作用力
吸引力和排斥力:
重力,电磁力, …
弹力,推力, …
阻尼力:
摩擦力, 空气阻力, 粘滞力, …
碰撞:(粒子和粒子之间、和墙、容器等,不能穿模)
万有引力:再小的物体都会满足这个规律,对于灰尘和粒子来说肯定会有万有引力
对于星系来说,也和上面是同样的道理。对于粒子如何被画出来,也是先模拟,再渲染,这2个过程是分开的
基于粒子的流体模拟
模拟的是粒子,渲染的是像玻璃、是否带白沫等等
粒子系统不一定只是描述最简单的点,这个粒子也就是在一个很大范围内有很多重复的东西(一个群体中的个体)如模拟一个鸟群,个体的鸟应该满足哪些规则(可以定义出它们之间的相互关系)
个体的运动属性:
吸引:任何一只鸟都不愿意落单,都会找到它周围的鸟,并试图融入进去
排斥:任何一只鸟都不希望和其他鸟离得太近
对齐:如果大家都往某一个方向飞,鸟因为不会离群,也会沿着它能看到的大家飞的主要方向
Forward Kinematics/正运动学
在图形学中运动学分为正向的和反向的,即正运动学和逆运动学
正运动学
描述一个和人骨骼连接拓扑结构类似的骨骼系统,可以定义不同的关节
3种不同的关节
- Pin (1D rotation) 钉子钉上的关节,钉上后只能在钉住的平面内往一个方向旋转
- Ball (2D rotation)有一个东西可以包住一个球,这个球可以任意的在任意方向旋转
- Prismatic joint (translation)可以拉长,也就是可以有一些移动
可以定义一些简单的关节模型(即定义复杂模型是如何相连的),整个结构可以形成一个树形的加速结构
如上图,只能在平面内发生旋转,类似于肩和肘的旋转,假设第一段旋转θ1度,第二段旋转θ2度,那尖端在哪?
先算出上方黑点的位置,因为θ2是在θ1的基础上旋转的,可以用θ1加θ2计算
所以正向运动学,只要能定义好连接方式,定义好它们之间的各种位置,就可以找到各种点的位置。还可以画出随时间变化的角度的曲线
例子:走路
优点
实现容易(告诉你任何一个位置,可以算出任何一个地方停在哪)
缺点
它的定义都很物理(比如定义什么东西旋转多少角度)
但是艺术家们更喜欢直观的控制尖端进行动画的创建,而非调整角度
Inverse Kinematics/逆运动学
为了让艺术家更好的使用这套系统,去直观的的调骨骼的位置,就引入了逆运动学
逆运动学可以手里捏着尖端到处移动,它会自动的调整它的关节的位置,使得尖端就在你要的位置上
如上图,逆运动学就是固定P点,它会告诉你θ1、θ2
解起来就比较复杂
逆运动学的解有时候不唯一(多解)
如上图,尖端的位置确定了,但是可以有2个不同的摆放方式,取哪一个?
逆运动学有时会出现无解的情况
如上图,最上面的关节点只可能出现在下图的虚线上,尖端通过旋转可以在一个圆上,从而尖端只有可能在外层的圈和内层的圈之间,其他位置到不了
优化问题:
一般N链IK问题的数值求解
•选择初始配置
•定义错误度量(例如:目标与当前位置之间距离的平方)
•计算误差梯度作为配置的函数
•应用梯度下降(或牛顿方法,或其他优化过程)(知道尖端位置,如何优化θ1和θ2)
梯度下降法来解,而不是用数学方法真的去解θ1,θ2
Rigging
对于一个形状的控制,其实就是木偶操作(就好像用各种线提木偶的部件的不同位置,它就会形成某一种造型),一定程度上就是逆运动学的一个应用。动画或电影就会应用Rigging给角色添加动作
一些建模软件(3ds MAX、MAYA),要先给物体加上骨骼,要知道操作哪些点会影响其他的哪些点,包括软选取、蒙皮等操作。
本课程就理解成对物体或角色的不同地方加一些控制点
例子
人物有2个不同的造型,这2个造型之间可以通过插值的方式做。利用控制点做了2个不同的造型,然后将控制点和控制点之间的位置做插值
实际上在blend控制点以及它周围能够影响的区域
Motion Capture/动作捕捉
给真人各个不同的地方加上控制点,让这些控制点的位置直接反应到虚拟的造型上去。要建立虚拟的人物和真实的人物之间的关系
优点
可以迅速捕捉大量的真实数据。如果艺术家们直接去调可能耗时会很长
真实感非常强
缺点
进行动作捕捉需要很多前期的准备(上面的衣服不容易穿,放标志点不自然)
捕捉出来的动作可能不符合艺术家的需求,需要调整(比如真人去演动画人物,动画人物的表情是很夸张的;或者有时捕捉不到好的数据,比如捕捉条件有限制,人在正面的时候看到的控制点,背面也有但正面看不到,那就要在背后加一个摄像机,这就需要成本,而且正常需要更多的摄像机;人物动作的时候还会遮挡)
除了白色控制点,还有磁力的(不受遮挡影响)、机械的(真正在人身上贴上机械的东西)
应用最广泛的还是光学的捕捉方法,贴一些Maker(贴片或小球)贴在人身上,然后用很多很复杂的摄像机,将这些点的位置非常准确的测出来
下面的曲线就是一个控制点(Maker)在不同的时间会出现在三维空间中的位置显示出来
虽然通过动作捕捉等非常真实的动画生成方式,可以得到非常真实的动画但是也会有一些担忧
Uncanny valley (恐怖谷效应):也就是害怕被人工智能统治世界,如果生成的东西过于真实,并且有人利用它做一些坏事