计算机图形学入门30:动画与模拟介绍

1.动画是什么

       动画最初的定义为Animation,就是把一些物体变成“活”的,也就是让它们能够动起来。动画和语言一样,一开始都是作为传达信息的工具,用来展示各种各样动起来的东西,其次需要一定的美观。

        在图形学中动画可以理解为建模或者是几何的一种扩展,动画就是可以让这些建模和几何在不同的时间有不同的形状或其它属性,也就是加了一个时间的维度。

       动画的形成过程就是一些列图片去按顺序播放的过程,一般来说达到每秒24张图,也就是24FPS,可以让人觉得是一个连贯的动画。对于一些正常的视频一般是30FPS,这样看起更流畅。而对于一些游戏,要求可能更高,比如144Hz的刷新率或者是165Hz的刷新率。同时对于VR来说,要想达到真实且不使人晕眩的效果,两个眼睛的帧数都要达到90FPS以上。

2.关键帧动画

        关键帧动画(Keyframe Animation)就是一段动画中比较重要的几个位置对应的帧,我们将几个重要的帧找出来,然后它们之间的过渡过程来补出来。一开始这些关键帧都是需要大量的人力来补的,且补出来的帧风格大小都要看起来一致,这样才能达到不违和的效果。但是之后有一款软件叫Flash,它可以自动计算补出关键帧之间的帧。

        

        关键帧中间补帧就是一个插值的过程,只不过它不一定是线性插值。

        有时候人们可能会要求它有更好的连续性和过度,让它看起来不那么生硬,就和我们之前说的贝塞尔曲线C1,C2,C3,几阶连续类似,所以动画和样条这些几何有关联的。虽然如何过度我们不能直接确定,但是补出的帧一定在两个关键帧之间这是可以确定的。 如下图所示。

3.物理模拟

3.1 定义

        最简单的物理,如牛顿的F=ma,它可以计算力和加速度的关系。

        物理模拟(Physical Simulation)其实就是计算各种不同的物理公式,从而知道,在不同的时间,我们这些物体的位置,速度,这些属性。简单说就是使用数值模拟生成物体的运动。

        如下图所示,抛物线就是一种物理模拟,而右边的衣服,虽然是一个网格,但是我们可以知道每个顶点所受的重力,以及它的质量,或者受其它顶点牵引的力等等,我们同样可以计算它的各种物理量和受力,从而模拟。

3.2 质点弹簧系统

3.2.1 质点弹簧系统计算模型

        质点弹簧系统(Mass Spring System)是一系列相互连接的质点弹簧。它可以模拟绳子,布料,头发等等,是最简单的一种模拟之一。它的最基础的单位是一根弹簧连着两个质点,如下图所示。其中的弹簧是理想弹簧,也就是说它没有长度,拉多长就产生多大的力,从 到 的作用力大小取决于两点的距离长度。如下图公式 fa→b=ks(b-a),其中Ks是劲度系数。】

        当然,实际的弹簧是不可能没有长度的,那么在公式中 和 的距离 ||b-a|| 减去弹簧本身的长度l,就能得到拉开的长度。如下图所示,其中 b-a 的归一化表示的是单位向量,也就是方向,方向乘以拉开长度和 Ks 就得到了作用力大小。但是这有一个问题,放开后它永远不会停,一直会来回震动,因为能量守恒,动能和势能一直在转换,所以要考虑摩擦力。

        在这之前先引入一个概念,在模拟仿真中如果用 来表示一个位置,会在头上加个点表示速度(一阶导数),两个点表示加速度 (二阶导数)。如下图所示。

        回到摩擦力的引入,如下图所示,摩擦力 f 等于 速度乘以-KdKd是一个阻尼系数,摩擦力时刻与速度方向相反,这样物体最终一定会停下来。

        当然它也有问题,这样会引起所有运动都停下来,当 和 不存在相对运动,但是整体在运动时也会被停下来。所以我们引入的摩擦力,它只能表示外部的力,无法表示弹簧之间内部的力。

         于是我们想到了相对速度,它比绝对速度更能表示弹簧内部的关系,所以我们得到如下图的公式。

        相对速度就是\dot{b}-\dot{a},其左边对 b-a 做归一化求得方向,两者其实是个点乘,所谓相对速度投影在ab方向的速度是多少。因为有些速度并不会引起弹簧长度改变,比如a固定不动,然后拉着b做圆周运动,速度方向始终与ab方向垂直,这就不会有内部摩擦力引起。所以把相对速度给分解到沿着ab方向的相对速度,这个才会对弹簧内部造成衰减(摩擦力)。

        综上,图上右边对 b-a 做归一化求得ab的方向,加个负号就是 到 的作用力,再乘以Kd系数。最后相对速度越快力越大,而且这个相对速度还必须沿着ab方向,算出的结果为一个数值(红框内)。注意:摩擦力和长度无关。

        有了一个质点弹簧基本计算模型,就可以通过组合成不同形状。比如下图组合表示一张纸。

        还可以组成三维空间的形状,如下图所示。

        这些物理原理都是对真实物理存在现象的一种抽象,或者一种简化。

3.2.2 简单模拟布料

        假设现在用弹簧组成去模拟一块布,如下图所示。

        但是这里存在两个问题。

        第一:切变会受影响。如果我们拽着这块布的两个角向两边拉他,它会发生切变,但实际上我们真实的布被这样拉拽是不会发生切边的,也就说明真实的布有抵抗切变的性质。

        第二:真实布存在out-of-plane bending。我们这块布可以沿着对角线折成三角形,折成一个平面,但是真实的布并不会,它有一种抵抗对折成一个平面的力,这种力叫做out-of-plane bending。

        先解决第一个切变的问题,我们在原本的正方形网格的布模型上面加入对角线的弹簧,这样就可以阻止切边,我们再次两角拉动这块布的时候,新加入蓝色的弹簧会被压缩会抵抗这种切变,这就符合我们真实的一块布了。如下图所示。

        但是它不对称,这仍然不符合真实的布,一块布的属性各处按理来说都应该是一样的,所以我们两条对角线都加上弹簧,如下图所示。

        当然,单纯的引入两条对角线,并不能解决我们说的第二个问题,它仍然没有抵抗对折成一个平面的力。所以我们最后做一步改进,加上横竖的跨越弹簧,任何一个点都和隔着它的一个点连一根线。这次我们得到了无论怎么形边,它都会影响一些弹簧长度变化的一块布的模型。如下图所示。

        一般情况下,红色弹簧力很小,蓝色弹簧力比较大。当然,这种不能完全模拟真实的布料,这只是个简化模拟。

        除了质点弹簧系统模拟布,还可以用有限元方法FEM(Finite Element Method),这种方法广泛用于车子碰撞。热和力都会传导,传导的过程,或者说扩散的过程,这些适合有限元方法来做。

3.3 粒子系统

        有些东西不适合用质点弹簧系统来描述,比如一些很细小的东西,如粉尘,雾等。那么就可以用粒子系统(Particle Systems)来描述,粒子系统中,把这些细小的东西一个一个建模出来,然后定义它们收到的力,有来自粒子之间的力,外部的力如重力,风力等等。在游戏中得到广泛应用,比如特效,烟雾等。

        粒子系统还能模拟流体,把一片水可以看成一大堆小水滴。

        其次,我们说的粒子之间的力可不止有碰撞,还有粒子之间的引力,电磁力等等,我们要计算引力那要考虑一个粒子周围的最近的多少个粒子对它的影响,同时粒子位置的移动导致我们需要更新它,所以粒子的模拟还是有很多挑战性的。

        这里有个简单的算法,简略的来说明。对于动画的每一帧:1.创建新的粒子。2.计算每个粒子上的力。3.更新每个粒子的位置和速度。4.粒子有存活时间,有些粒子死亡后会有新的粒子加进来。5.渲染粒子。

        粒子系统一定是先模拟,再渲染的。如下图所示,先模拟无数小水滴的力作用,然后渲染出水的效果。

        我们之前提到过粒子系统可以模拟海浪,水这些东西。而实际上只要是一个群体,是由一群微小的个体组成的,我们都可以用粒子系统去模拟,如鸟群,鱼群,蜜蜂群这些集群,只要定义一些简单的规则和相互关系就可以,就像引力和斥力这些东西一样。

3.4 运动学

3.4.1 定义

        运动学(Kinematics)定义了一套骨骼系统,这个骨骼系统能表示和人类似的骨骼连接的拓扑结构,我们可以定义各种各样的关节,如下图所示。

        关节可分三种关节,分别为Pin关节,Ball关节,Prismatic joint关节。Pin关节就是可以旋转的一种关节,当然它只能在2D平面上360°旋转,相当于一个圆。Ball关节可以在球面上旋转,也就说3D空间中任意旋转。Prismatic joint则是可以拉长一定距离的关节。如下图所示。

        通过关节的运动可以分为正向(Forward)运动学逆向(Inverse)运动学。

3.4.2 正向运动学

        如上图中的这么一个关节,如果我们知道每个关节是怎么运动的,那我们就可以算出最后的尖端 最终落在哪个位置,如上图的公式,而这就是正向运动学

        我们还可以算出随时间位置的变化 点的位置。如下图所示。

        但是正向运动学看起来并不直观,我们并不希望调整这些角度,而是直接调整这些位置,像拉木偶一样。当然好处是给定任意角度,我们都可以计算位置。

3.4.3 逆向运动学

        我们不调整角度,我们直接去调整我们之前说的尖端 p,拽着 任意的移动,这些骨骼关节都会自动的调整角度从而可以实现这个尖端 就是在我们拽的位置,这就是逆向运动学

        举一个与正向运动学相对的同样的例子,逆向运动学就是给定 的位置,计算两个关节的角度θ1θ2,我们发现特别复杂,方程特别难解。如下图所示。

        而且逆向运动学还有一些问题,比如它的方程的解并不唯一,如下图所示,虽然两种情况的尖端位置相同,但是关节的角度有两种截然不同的组合形式。

        而且有些情况下,方程还会无解,比如下图所示。

        我们把尖端可能的位置表示出来,发现它只可能停留在半圆的一个扇面上,而如果我们尝试把尖端拽到扇面外,或者扇面里面靠近圆心的位置,这不可能实现,也就是方程无解。

        而解决这种问题,本质上仍然是一个优化问题,解决方法有梯度下降法和牛顿法等等,涉及到机器学习的知识,有兴趣的朋友可以自行了解,这里不做介绍。

3.5 绑定

        绑定(Rigging)也是制作动画中很重要的一步操作,就是通过调整不同的控制点从而达到不同的造型目的,就像皮影戏,木偶之类的东西。通过绑定,我们可以调整许多东西,比如角色的姿势,表情等。

        绑定做动画制作成本较高,需要手动去调整每个控制点,要知道操作一个点能够影响哪些点。所谓软选取,蒙皮这些都是相关术语。

        另外,两种不同形状下的控制点同样可以做插值,可以做一些平滑的过渡,我们常常用这种方法做表情动画,它有专有的名词叫做Blend Shapes。就是一个形状平滑过渡到另一个形状的过程。

3.6 动作捕捉

        既然可以用控制点来调整虚拟角色的姿势,那么为什么不可以给真正的真人各个不同的地方加上控制点,让这些控制点的位置直接反映到虚拟造型上去呢?这个过程就叫做动作捕捉(Motion Capture),简称动捕。如下图所示。

        这样我们就可以让动作演员来做动作然后通过控制点记录下来,而不需要人为的手动的去调整,可以快速的做出动画,而且更贴近真实感。

        但是,设备昂贵和复杂。另外,捕捉的动画可能不符合艺术需求,需要修改。

        动作捕捉有很多的方法,如不在身上绑小球和贴片,而是一些机器,通过在人身上绑定机器直接反馈位置信息。但是人们最常用的还是光学的方法。

        虽然光学的捕捉方法有很多问题,比如人的胳膊会挡住里面的传感点,而且要用无死角的大量的摄像机去记录,成本高等等。

        数据测出来之后,控制点会形成一堆曲线,就是表示一个控制点在不同时间在哪个位置。

        通过动作捕捉这种方式能够生成非常真实的虚拟人物的动作和面部表情。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YanisWu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值