• 游戏引擎中的动画基础


    一、动画技术简介

    在这里插入图片描述
    视觉残留理论 - 影像在我们的视网膜上残留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 怎样制作一个蒙皮动画

    1. 制作一个模型
    2. 制作模型对应的骨骼
    3. 绘制蒙皮,蒙皮受骨骼影响
    4. 动画决定骨骼的位置
    5. 骨骼根据权重决定蒙皮的位置

    在这里插入图片描述
    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敏感度是不一样的。
  • 相关阅读:
    C++ Reference: Standard C++ Library reference: Containers: array: array: at
    帮助开放大学学子们更好学习的铺助工具
    机器学习之时序差分学习(Temporal Different Learning)
    二维码登录的原理
    安装GPT 学术优化 (GPT Academic)@FreeBSD
    DDoS攻击--防护本质
    Python Flask框架-开发简单博客-认证蓝图
    你还弄不清xxxForCausalLM和xxxForConditionalGeneration吗?
    深度学习领域图像分割FCN(Fully Convolutional Networks for Semantic Segmentation)
    VmWare采用工具kubeadm 快速k8s集群部署
  • 原文地址:https://blog.csdn.net/gghhb12/article/details/136607477