一、动画技术简介
视觉残留理论 - 影像在我们的视网膜上残留1/24s。
游戏中动画面临的挑战:
- 交互:游戏中的玩家动画需要和场景中的物体进行交互。
- 实时:最慢需要在1/30秒内算完所有的场景渲染和动画数据。(可以用动画压缩解决)
- 真实:多个动画的融合,表情的变化。
二、2D动画技术
2.1 序列帧动画
采取多个图片切换实现2d动画效果
采取不同视角的多个图片实现3d动画效果
2.2 Live2D
将一个图片剪裁成多个图元,通过修改不同图元的位置,缩放,旋转来实现动画效果。
三、3D动画技术
3.1 DoF(自由度)
这是对于自由度的一个表达术语。比如6DOF代表能在xyz空间内进行平移和旋转。3d动画的核心就是对自由度的一个表达。
3.2 顶点动画
把每个帧的顶点的位置记下来
在做人脸的面部动画使用的也是顶点动画,不过这时的修改单个顶点的位置时会按照权重修改附近顶点的位置,这个叫做Morph Target Animation。
3.3 骨骼动画
刚体骨骼在动的时候,皮也在跟着动。是因为每个顶点是多个骨骼在动。
3.4 物理模拟动画
- 布娃娃系统
- 衣料模拟与流体模拟。
- 反向动画
四、蒙皮动画的实现
4.1 怎样制作一个蒙皮动画
- 制作一个模型
- 制作模型对应的骨骼
- 绘制蒙皮,蒙皮受骨骼影响
- 动画决定骨骼的位置
- 骨骼根据权重决定蒙皮的位置
4.2 不同的空间
- World space: 世界坐标系
- Model space: 我自己的坐标系
- Local space: 局部坐标系,每一根骨骼的坐标系都不一样,动画系统中的某个坐标系是由其他骨骼的坐标系累算出来的。只有通过local space从根节点累算出他的模型坐标系,才能够算他的世界坐标系,然后才能够进行渲染。
4.3 骨骼的创建
统一骨骼结构
骨骼与关节
Root节点
Bind point:绑定动画当两个骨骼动画绑在一起时需要这个Bind point
五、旋转的数学原理
5.1 2D旋转
5.2 3D旋转
在空间任意一点的旋转都可以分解成依次绕着每个轴旋转。
欧拉角:
在对物体进行编辑,或者摆放的时候会经常用欧拉角,但是做动画的时候无法使用欧拉角。
欧拉角的问题:
(1)严格的顺序依赖:顺序不一样,他算出来的结果不一样。
(2)万向节:万向锁
(3)很难插值
(4)旋转的叠加很难
(5)很难沿着一个固定的轴旋转。
5.3 四元数
四元数的定义如下:
欧拉角转成四元数的公式如下:
六、动画压缩技术
由于动画的数据量很大:
但是缩放和位移是不变的,大部分是rotation在变化。
所以我们可以通过以下方法来压缩动画数据存储:
6.1 较少自由度存储
6.2 关键帧
只存储几个关键帧,然后用线性插值的方法来计算中间帧,永远保证你的error小于你的阈值
6.3 浮点数
不要用浮点数来存储动画的旋转角度,因为浮点数占据的内存大,可以用整数来表达。
6.4 压缩带来的问题
- 会让这个压缩错误一直传递到错误很大。
- 不同 的骨骼对error敏感度是不一样的。