GAMES104:08游戏引擎的动画技术基础-学习笔记

news2024/11/16 0:57:52

文章目录

  • 一,动画技术简介
    • 动画技术的挑战
  • 二,2D游戏动画技术
    • 2.1 精灵动画(sprite animation)
    • 2.2 Live2D
  • 三,3D游戏动画技术
    • 3.1 基于层次的刚体动画
    • 3.2 顶点动画
    • 3.3 Morph Target Animation
    • 3.4 蒙皮动画
      • 3.4.1 2D蒙皮动画
    • 3.5 基于物理的动画
  • 四,蒙皮动画的实现
    • 4.1 如何制作一个模型动画
    • 4.2 Local Space、Model Space and World Space
    • 4.3 骨骼的构建
    • 4.4 骨骼的绑定
  • 五,3D旋转的数学原理
    • 5.1 2D旋转
    • 5.2 3D旋转
    • 5.3 欧拉角:Roll、Pitch、Yaw
    • 5.4 欧拉角的问题
    • 5.5 四元数(Quaternion)
  • 六,蒙皮动画的细节:关节与蒙皮
    • 6.1 蒙皮计算
    • 6.2 动画帧间Clip
    • 6.3 引擎侧动画系统pipeline
  • 七,动画压缩技术
    • 7.1 DoF压缩
    • 7.2 数位压缩
    • 总体压缩
    • 压缩误差
  • QA


一,动画技术简介

人类祖先就喜欢通过画画试图把动态的人物画下来,近代发现了视觉残留(1/24秒),奠定了动画视觉实现的基础
在这里插入图片描述

早期尝试:跑马灯、定格动画、早期动画电影(一帧一帧画的)等
未来方向:实时渲染动画、电影(Zafari)

动画技术的挑战

  1. 游戏中的动画是要与很多gameplay、地形、怪物交互,还受用户控制的影响
  2. 实时是基础,不仅包括计算,还有动画数据的加载定位、内存数据处理等
  3. 对自然感真实度的要求,角色如何表现得是否生动,是否符合物理,以及表情动画的实现(与肢体动画是2套技术体系)

并且当下很火的虚拟人最核心的技术就是动画技术

二,2D游戏动画技术

虽然3d很火,但现在最赚钱的还是2d游戏,并且有很多有意思的新技术

2.1 精灵动画(sprite animation)

通过把游戏的人物的动画一帧一帧记录下来,然后循环播放来实现动画的效果。(仙剑1、2)
除了人物动画,特效类也可以这么做
在这里插入图片描述
在这里插入图片描述

2.2 Live2D

皮套人嘿嘿
在这里插入图片描述
把角色的各个部件拆成一个个的小图元,把这些图元拼在一起,然后靠这些图元的旋转、变形、仿射变换等使角色变得更加鲜活。并且需要给各种图元设置深度来表达层次关系,控制可见性。(本质就是图像变形+图层叠加)

三,3D游戏动画技术

  • 自由度(DoF,Degree of Freedom)

字节出的vr眼镜宣传能支持6DoF,那什么是DoF呢?

定义:一个物体可以在多少个维度发生变换。比如平移就是三个自由度(在x,y,z方向上移动),旋转也是3个自由度(物体绕x,y,z轴旋转 )。通常动画是9DoF的(就是Transform那9个量),因此6DoF就是…………

3.1 基于层次的刚体动画

早期动画实现方式,类似皮影戏,将角色用一系列的刚体块(mesh绑定骨骼)表示,用关节点约束。

但皮影戏一样,这些骨骼动的时候mesh会互相穿插。

3.2 顶点动画

预烘焙顶点动画,离线下将每个顶点的复杂物理计算结果按照时间帧保存到一张纹理上,横轴表示顶点,竖轴表示不同时间每个顶点的偏移量。一般会存两个texture,一个texture存位置,一个存法向。
在这里插入图片描述

3.3 Morph Target Animation

另一种顶点动画,是把一系列key frame保存下来,应用是lerpkey frame去使用,通常用于人脸动画(类似BS)
在这里插入图片描述

3.4 蒙皮动画

骨骼驱动顶点的动画,每个顶点有不止一个骨骼驱动,可以避免mesh穿插;同时消耗也比逐顶点小
在这里插入图片描述

3.4.1 2D蒙皮动画

2D有时也用蒙皮骨骼动画,更加灵活效果丰富
在这里插入图片描述

3.5 基于物理的动画

  • Ragdoll布娃娃系统
  • 布料和流体模拟
  • 反向动力学Inverse Kinematics(IK)----给出指定点计算身体怎么运动最自然,用于游戏物体、地形交互等
    在这里插入图片描述

四,蒙皮动画的实现

4.1 如何制作一个模型动画

整体上,the Animation DCC(Digital Content Creating) process 分为:

  1. 制作一个有着固定姿势的mesh(T-pose)(一般用低精度mesh制作动画,在某些关节会再新额外加一些mesh来优化比如咯吱窝)
  2. Skeleton binding骨骼绑定
  3. Skinning蒙皮,刷权重(现在基本是自动计算的,只需部分手工微调)
  4. Animation creation将骨骼设置为所需姿势
  5. Exporting导出(注意如果像跳跃动画里root也位移了的话,一般不会保存到动画数据里–压缩了,会有一个专门的位移曲线来记录)

在这里插入图片描述

4.2 Local Space、Model Space and World Space

局部空间 – 以骨骼局部为参考系空间,坐标都是相对坐标
模型空间 – 以模型为参考系的空间
世界空间 – 以游戏世界中心为参考系的空间,坐标是绝对坐标

在这里插入图片描述

4.3 骨骼的构建

人类骨骼有几种通用标准,比如人形骨骼(Humanoid)标准,其骨骼起点一般是在胯部的RootM,其他骨骼一层层形成骨骼树,互为父子节点。一般还有一个两脚之间的根骨骼Root,方便判断移动,位置,离地高度等(下图右可见)。此外还有面部的骨骼、外骨骼(衣物、道具)等。

  • 游戏中存储的实际是关节的数据(位置旋转等),通过父子节点关系影响骨骼链
  • 人体骨骼一般50-100根,需要TA团队在游戏初期就设计好, 算上人脸骨骼和外骨骼可能总数300+

动物,比如四足动物是另外的标准,骨骼起点一般在尾椎的地方,Root根骨骼一般在四足中间
在这里插入图片描述

4.4 骨骼的绑定

例如人骑在马上,人和马都有一个叫 mount 的关节。该关节是用来绑定人和马的,不仅要连接,方向也要绑死,这样人和马的运动才能保持一致
在这里插入图片描述

五,3D旋转的数学原理

线代知识,少量记录

5.1 2D旋转

在这里插入图片描述

5.2 3D旋转

在这里插入图片描述

5.3 欧拉角:Roll、Pitch、Yaw

yaw:绕z轴 (ψ)
pitch:绕x轴 (θ)
roll:绕y轴 (φ)

5.4 欧拉角的问题

  • 旋转顺序依赖:如果轴旋转的顺序不同得到的角度不也不同,所以必须约定旋转顺序,旋转矩阵也很复杂。
  • 万向节死锁问题:(比如拍摄稳定器、陀螺仪都用的是万向节技术)

首先我们旋转每个轴的顺序是固定的。例如,按x,y,z轴顺序旋转,x轴先旋转,此时如果把y轴旋转90°时,z轴会被旋转到x轴的位置,此时还需要旋转依次z轴,但是此时旋转z轴就相当于旋转x轴,相当于只转了两个维度,本来是3个自由度(可以对x,y,z轴旋转),现在变为了两个(只能对x,y轴旋转,而不能旋转z轴)
注:这里的x,y,z轴都是相对世界坐标系而言的

  • 插值和叠加问题:在如角色动画关键帧需要插值计算中间帧的方位角或旋转过程,这个时候插值就很困难,线性插值结果是错的。同时机械臂父子节点的旋转叠加也不能直接欧拉角(cos(α+γ) != cosα+cosγ)
  • 表达问题:欧拉角只能按x,y,z轴旋转,但是现实中的旋转的旋转可以按任意轴,欧拉角并不能很好地、直观地表达。

5.5 四元数(Quaternion)

在二维空间,旋转某个角度可以用归一化的复数 e − i θ = c o s θ + i s i n θ e^{-iθ} = cosθ +isinθ eiθ=cosθ+isinθ来表示,在三维空间内我们定义一个四元数q = a + bi + cj + dk,其中a为实部, bcd为虚部。见下图,计算类似矩阵运算

在这里插入图片描述

  • 欧拉角到四元数:
    在这里插入图片描述
  • 用四元数计算旋转:(向量变成四元数)
    在这里插入图片描述
    在这里插入图片描述
  • 四元数的反向、叠加、从u转到v等
    在这里插入图片描述
  • 四元数绕轴旋转

在这里插入图片描述

啊太困了有需要再仔细看吧

六,蒙皮动画的细节:关节与蒙皮

6.1 蒙皮计算

关节的Pose有三个维度:
Orientation(方向、朝向):一般只需要Rotation即可表达骨骼链的位置
Position:某些情况也需要用到位移,比如root骨骼表达的位置、人脸骨骼等
Scale:面部表达经常用,调整五官大小(类似2d美颜)

以上3个变换合并起来形成了仿射矩阵Affine Matrix:
在这里插入图片描述
蒙皮动画只保存顶点相对骨骼local space的旋转变换,也就是Affine Matrix,以及骨骼权重;通过这些参数就能确定顶点位置。

  • 这里老师讲引擎侧的骨骼局部坐标和世界坐标怎么转换计算,就是先算骨骼的转换矩阵,再通过驱动顶点的矩阵反向计算相对坐标,再计算位置。并且在骨骼之前(MVP流程?)还需要计算骨骼的世界坐标系矩阵道一次。
  • 注意骨骼权重插值需要在模型空间插值,而不是局部空间

6.2 动画帧间Clip

动画资产一般是十几二十帧,远小于实际游戏帧率,所以应用时需要插值(clip)

  • 针对位移和缩放,一般直接线性插值即可
  • 针对旋转,四元数线性插值后再取normalization,这样也是避免长度发生变化(Nlerp)—但插值不是线性的
  • 插值中值得注意的是,当两个变换q1和q2相乘结果小于0时,可能会出现错误,例如本来只需反向转30度,现在正向转了330度,从而导致插值结果从 -30~0 变为0 ~ 330。因此需要计算插值的角是否大于180,如果大于,则反向插值:

在这里插入图片描述

  • 四元数插值是不均匀的,头尾快中间慢,因此提出一种slerp的算法来按角度进行插值,但这种计算方式稍微贵一点,同时分母sin值很小时也不稳定,所以实际中通常在角度差距大时用slerp,差距小时就直接用lerp了
    在这里插入图片描述

6.3 引擎侧动画系统pipeline

在这里插入图片描述

七,动画压缩技术

现代3A游戏动画量非常大,所以必须压缩好

7.1 DoF压缩

  • 对大部分骨骼来说,其translation和scale都不怎么变化,所以可以直接去掉;
  • 针对旋转,比较简单的方法是使用关键帧Key Frame进行插值,对动画的每一帧进行插值,当插值误差超过一定阈值时就设为关键帧,因此关键帧的间隔不是固定的。
  • Catmull-Rom Spline:关键帧虽然减少了数据,但插值出来都是折线,使用Catmull-Rom Spline在两帧P1P2之外分别再取P0P3,然后拟合这个曲线可以缓解。(类似贝塞尔曲线)
    在这里插入图片描述

7.2 数位压缩

四元数很多时候不需要32位浮点数的精度,所以可以将数值压缩到0-1之间然后乘以65535用16位整数去表示。
具体的,针对四位数Quaternion,利用其normalization后的特性(四元数的四个值中有一个较大,其余的都在正负 1 √ 2 \frac{1}{√2} √21之间,并且4个数的平方和为1),因此可以直接保存3个较小的值去表示大值,如下图,可以用48bit表示128bit的数据

在这里插入图片描述

总体压缩

在这里插入图片描述

压缩误差

压缩会带来误差累积问题。所以需要检测误差是不是被控制在可接受范围内。

不同骨骼对error的敏感度是不一样的,DoF那几个量的误差虽然更直观,但不符合人眼的感受,最实际可用的误差是visual error视觉误差(模型所有点用压缩前后的数据计算完之后进行比较),但完整计算的量太大,所以一般对每个关节定义2个垂直点,通过offset控制距离,如果精度敏感就设置大一些,只需对比这两个点压缩前后的error即可
在这里插入图片描述

误差补偿Error Compensation:在多帧误差累积后反向进行偏移来补偿。其问题就是这一帧和上一帧会很不连贯,会产生抖动问题。

QA

  • 顶点绑定的关节有数量限制吗:为了限制计算量,实践中不超过4个;并且关节数量也最好不超过255个,方便数位存储
  • 骨骼和场景碰撞的动画怎么做的:场景交互的动画并不是用一根根骨骼和场景计算碰撞的,而是用刚体进行碰撞
  • Morph Target动画与蒙皮动画的区别:蒙皮动画驱动骨骼影响顶点,而Morph Target动画存储顶点位置

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2046906.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

房产系统源码开发

一、开发需求: 信息录入与管理:系统需要支持各种数据的录入,这包括但不限于客户信息、房源信息、员工信息、合同信息和财务信息等。这些数据是房产系统的基础,对于后续的信息查询、分析和共享至关重要。信息查询与检索&#xff1…

Ports Number of field profile samples 参数设置

Ports Number of field profile samples 参数设置 正文正文 在进行 Port 仿真时,通常我们会对 port 端口中的光束模式进行设定,很多时候我们会遇到一个名为 Number of field profile samples 的参数,如下图所示: 如果去官方论坛查看解释,往往会被搞得云里雾里。这个参数…

什么是AR、VR、MR、XR?

时代背景 近年来随着计算机图形学、显示技术等的发展,视觉虚拟化技术得到了广泛的发展,并且越来越普及化,慢慢的也走入人们的视野。目前市场上视觉虚拟化技术的主流分为这几种 VR、AR、MR、XR。这几项技术并不是最近才出现的,VR的…

RabbitMQ 的工作原理

下面是rabbitmq 的工作原理图解 1、客户端连接到消息队列服务器,打开一个channel。 2、客户端声明一个exchange,并设置相关属性。 3、客户端声明一个queue,并设置相关属性。 4、客户端使用routing key, 在exchange和queue 之间…

FreeBSD 针对OpenSSH 高危漏洞发布紧急补丁

近日,FreeBSD 项目的维护者针对OpenSSH 高危漏洞发布了紧急补丁。该漏洞被追踪为 CVE-2024-7589,CVSS 得分为 7.4(最高分为 10.0)。通过利用该漏洞,黑客能够在权限提升的情况下远程执行任意代码。 根据上周发布的一份…

Hive3:常用的虚拟列(Virtual Columns)

一、作用 虚拟列是Hive内置的可以在查询语句中使用的特殊标记,可以查询数据本身的详细参数。 Hive目前可用3个虚拟列: INPUT__FILE__NAME:显示数据行所在的具体文件BLOCK__OFFSET__INSIDE__FILE:显示数据行所在文件的偏移量ROW…

HarmonyOS开发:跨应用数据共享详解

目录 前言跨应用数据共享的重要性HarmonyOS的数据共享能力相关的基本概念跨应用数据共享的数据管理具体实现跨应用数据共享延伸:数据共享的安全和隐私结语 前言 现在的移动操作系统中,应用之间的数据共享已成为提升用户体验和实现功能互补的重要手段&a…

机器学习——第十四章 概率图模型

目录 14.1 隐马尔可夫模型 14.2 马尔可夫随机场 14.3 条件随机场 14.4学习与推断 14.4.1 变量消去 14.4.2 信念传播 14.5 近似推断 14.5.1 MCMC采样 14.5.2 变分推断 14.6 话题模型 14.1 隐马尔可夫模型 隐马尔可夫模型(Hidden Markov Model&#x…

入门 MySQL 数据库:基础指南

简介 MySQL 是一个非常流行的开源关系型数据库管理系统(RDBMS),广泛用于 Web 应用、企业应用和数据仓库。本博客将引导你从零开始,学习 MySQL 数据库的基础知识。 什么是 MySQL? MySQL 是一个基于 SQL(Str…

秒懂Linux之制作简易shell

目录 一.全部代码 二.自定义shell 一.全部代码 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h>#define SIZE 1024 #define MAX_ARGC 64 #define SEP &…

pnpm【实用教程】2024最新版

pnpm 简介 pnpm 全称 performant npm&#xff0c;即高性能的 npm&#xff0c;由 npm/yarn 衍生而来&#xff0c;解决了 npm/yarn 内部潜在的 bug&#xff0c;极大的优化了性能&#xff0c;扩展了使用场景&#xff0c;被誉为 最先进的包管理工具 安装 pnpm npm i -g pnpm使用 pn…

安全基础学习-SM4加密算法

SM4 是一种中国国家密码标准(GB/T 32907-2016)中定义的分组加密算法,又称为“中国商用密码算法SM4”。它是由中国国家密码管理局发布的,并广泛应用于金融、电子商务和其他需要数据加密的场景。 1、SM4 算法概述 SM4 是一种对称加密算法,意味着加密和解密使用相同的密钥。…

升级 kubeadm 部署的 k8s 集群

文章目录 一、环境二、注意事项1、备份数据2、跨版本升级3、支持的版本偏差3.1、kube-apiserver3.2、kubeklet3.3、kube-proxy3.4、kube-controller-manager、kube-scheduler 和 cloud-controller-manager3.5、kubectl 4、升级流程 三、版本升级&#xff08;补丁版本升级&#…

css 文字图片居中及网格布局

以下内容纯自已个人理解&#xff0c;直接上代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><…

ervlet、jsp、Cookie、Ajax学习

系列文章目录 第一章 基础知识、数据类型学习 第二章 万年历项目 第三章 代码逻辑训练习题 第四章 方法、数组学习 第五章 图书管理系统项目 第六章 面向对象编程&#xff1a;封装、继承、多态学习 第七章 封装继承多态习题 第八章 常用类、包装类、异常处理机制学习 第九章 集…

Nginx 正则表达式与rewrite

目录 一、正则表达式 二、rewrite 2.1 rewrite简述 2.2 rewrite 跳转 2.3 rewrite 执行顺序 2.4 rewrite 语法格式 三、location 3.1 location 类别 3.2 location常用匹配规则 3.3 location优先级 3.4 示例说明 3.5 匹配规则总结 3.6 三个匹配规则定义 四、实战…

【业务场景实战】如何优雅地进行缓存预热?

从Java基础到中间件再到微服务&#xff0c;我们学了这么多&#xff0c;但遇到真实项目的时候&#xff0c;还是不会根据所学知识&#xff0c;对项目进行改造&#xff1b;或者太久不用早已忘记。学会用才是走得更远&#xff01; 缓存穿透、雪崩&#xff0c;大家都不陌生&#xf…

【Linux操作系统】——Centos7下安装python3.8

1.Centos7下安装python3.8 1.1 安装依赖包 yum install gcc openssl-devel bzip2-devel libffi-devel zlib-devel ncurses-devel sqlite-devel readline-devel readline-devel make在CentOS 7上安装Python时&#xff0c;‌需要安装一些必要的依赖包以确保Python的正常编译和运…

HarmonyOS NEXT - 项目基础框架的搭建

demo 地址: https://github.com/iotjin/JhHarmonyDemo 代码不定时更新&#xff0c;请前往github查看最新代码 HarmonyOS NEXT - 项目基础框架的搭建 序前置工作项目的目录结构主界面实现BaseTabBar代码实现子页面实现路由跳转登录页面和主页面切换登录实现退出登录 序 项目基于…

Spark-环境启动

一、概览 从start-all.sh开始捋&#xff0c;一直捋到Master、Worker的启动并建立通信 二、宏观描述 Master端 1、start-all.sh调用start-master.sh启动Master 2、执行org.apache.spark.deploy.master.Master中main方法 3、通过工厂模式创建RpcEnv子类NettyRpcEnv a、创建…