GAMES104-游戏引擎的动画基础

Animation System 动画系统

依据:视觉残留现象
古老的实现动画方式
1.Zoetrope
2.Praxinoscope
3.Flip Book

电影动画实现方式:
1.手绘一帧一帧
2.动作捕捉:人身上挂一些感知点,计算机捕捉

游戏动画实现方式:
1.2D帧动画
2.3D动画:骨骼动画、蒙皮动画、物理动画

问题:
1.不能预设玩家的行为,需要和 GamePlay 互动,需要表现得自然一些
2.Real-time,效率要高
3.Realism,表现得很真实


动画基础原理:
1.2D Animation
2.3D Aniamtion
3.Skinned Animation Implementation:蒙皮动画
4.Animatio Compression:动画数据的处理,压缩
5.Animation DCC:动画生产的 Pieline,和 3dMax 等工具的插件

2D Animation
1.Sprite Animation 精灵动画,一帧一帧循环播放
2.各个视角的假 3D 动画
并没有弃用,2D的游戏 以及 粒子系统
3.Live2D
把一个角色的所有元素变成所有的图元,拼起来成一个角色
通过各个图元进行旋转变形,看起来比较鲜活
可以控制深度
可以在图元上加各个控制点,控制点影响图片的缩放

3D Animation
Dof(自由度,Degrees of Freedom)
6DoFs:移动xyz,旋转xyz

Rigid Hierarchical Animation,关节动画
通过关节结构,mesh 的每个地方跟一个骨骼绑定
问题:骨骼之间会互相穿插

Per-vertex Animation,定点动画
表达:旗帜、水流
存两个Texture,顶点的offset + 法向

Morph Target Animation,另一种定点动画
顶点影响权重,通过 Key Frame 做插值
表达:捏脸系统

Skinned Animation,蒙皮动画
表面有一层皮肤,不会随着骨骼动的时候穿插
思想:多根骨骼同时作用一个皮肤点,保证水密性
2D 和 3D 都可以用

Physics-based Animation,物理动画
Ragdoll:布娃娃
Cloth and Fluid simluation:衣料系统
Inverse Kinematics(IK):保证手永远抓到一点


Skinned Animation 如何实现?

如何让 Mesh 动?
1.得到模型的 Mesh
2.创建骨骼嵌套在 Mesh 内部
3.给每个顶点刷蒙皮(每个顶点收哪个骨骼的影响权重)
4.做各个 Pose

动画系统中不同的空间
Local space:每一根骨骼的中心
Model space:以模型为中心
World space:整个游戏场景

类人型的物体,几乎是统一的骨骼结构(方便复用)
Root点:脚下,两脚中间(方便存离地高度)
中心点:脊椎那里 Pelvis
Joint:关节,游戏中存储的是关节数据,不会直接存骨骼数据
Bone:骨骼,在两个关节之间

真实的游戏里面有很多骨骼
标准模型:100个左右
还有额外的脸型、表情、披风、护肩之类的,也要加到骨骼
还有附加的(Additional joints):武器之类的

绑定骨骼(Bind Animation for Objects)
人骑在马上:人是播放人的动画,马播放马的动画
人和马有一个位置选中都对齐的绑点

Bind Pose,T-pose or A-pose?
T-pose的问题:
肩膀是被挤压的,精度不够,慢慢变成A-pose

Pose:每个动画的姿势
每个Pse 9DoFs 自由度:平移+旋转+缩放


数学如何表示知识:

2D-Rotation

x = r * cos
y = r * sin
最后可以表示成2x2的矩阵(唯一)
cos -sin
sin cos

3D-Rotation
可以根据不同方向进行旋转,比2d的麻烦一些
但是可以通过多个旋转叠加得出(欧拉角)
R=Rx * Ry * Rz

欧拉角:
Yaw + Pitch + Roll

问题:
Order Dependence:顺序依赖的,顺序不同表达全都不一样
Gimbal Loack:万象锁(可以利用这个做云台、无人机、陀螺之类的,保证永远指向一个方向)
如果Y轴转了90°之后,z和x是共轴了,Dof = 1
Hard to Interpolate:难以差值
Difficult for rotatio combination
Hard to rotate by certain axis:不能做定轴旋转

做动画的时候,不能用欧拉角!

Quaternion:四元数
复数(Complex Number):一个实部+一个虚部

四元数,一个实部+三个虚部
q = a + bi + cj + dk
(ijk的平方=ijk=-1)
模,单位四元数
共轭,就是四元数的逆

四元数如何表达欧拉角?
有公式


Joint Pose

Orientation:空间上的朝向
Position:空间上的平移(一般不会变)
几种需要的情况:
1.尾椎骨骼
2.捏脸系统
3.特殊的机械机械结构,弩箭
Scale:放缩变化(一般不会变,都是111)
捏脸系统:大眼睛小眼睛,大鼻子小鼻子

旋转矩阵+平移矩阵+缩放矩阵
M = R(hm) * T(hm) * S(hm)

Local Space to Model Space
动画只会存相对于父节点的变化
数学原因:
如果存的都是模型坐标系,差值出来的动作会一会边长一会变短

对于每个骨骼知道的信息:
1.父骨骼是谁
2.父骨骼在 local space 是什么样的

从根节点,一个骨骼一个骨骼算出来(矩阵垒乘)

Skinning Matrix
Bind Pose
要求:在 local space 中相对局部坐标系是严格一致的

Skinning Matrix Palette
先算所有的骨骼,存储蒙皮的矩阵
顶点重用蒙皮矩阵的值

Weighted Skinning with Multi-joints
收到所有骨骼影响的加权最后应该是1
如何计算?
先相对于各个骨骼分别求出对应的坐标,然后根据权重进行加权平均
!!!必须在模型空间差值!!!(Local space 每个 Joint 都不一样)

Clip,一组动画
一般存的帧数比游戏的帧率低,所以需要对两帧差值
对于 Translation 和 Scale 可以用线性插值
对于 Rotation 用线性差值 + Normalization
Sortest Path Fixing of NLERP
差值,人的知觉是最小路径的,否则会出现翻转之类的 BUG
问题:
角速度是不确定的
SLerp,通过反三角函数计算,效果比 NLerp 好


Simple Animation runtime Pieline,动画管线
CPU 部分:(现在也可以放到 GPU)
Clip + time => Previous Frame + NextFrame
Local Current Pose => Model Current Pos
Model Current Pose
GPU 部分:
Mesh Vertex Position


Animation Compression,动画压缩
Animation Clip Storage

动画数据,基本上有好多 GB
每个关节每秒钟存30个 Pose,每个Pose 里面有旋转平移缩放

对于大部分骨骼,位移和缩放不变,只有 Rotation 变化

优化方法:
1.干掉不变化的 DoF
2.Keyframe,通过关键帧之间的差值表现出来
依次检测 keyframe 超过某个阈值就记录
不适合旋转

Catmull-Rom Spline
得到很平滑的曲线

Float Quantization
4 个 float 16个 byte
定点数,使用 6个 byte

Error Propagation
压缩之后注意错误的传递,比如一步一步传递到手指骨骼拿武器,会反复地抖


动画怎么做的?(美术的动作)
构建 Mesh ,一般都用 低精度的 Mesh
会在经常动的地方额外加一些 Mesh
生成骨架,一般工具 可以拉出来 然后直接对上就行
再加上 Gameplay 的 Joint,武器啊翅膀啊
刷权重,有工具自动计算
设置关键帧,中间的自动插值
最后,通过导出工具 导入到引擎

FBX File:
mesh + skeleton + skinning data + animation clip

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值