Games104 现代游戏引擎3

Sprite Animation 序列帧动画
自由度(degrees of freedom,DoF)对于刚体而言描述它的运动需要3个位移3个旋转,一共6个自由度


顶点动画(per-vertex animation)利用网格的顶点来控制运动。此时网格上的每个顶点有具有3个平移自由度,通过对网格顶点坐标的变换就可以实现模型的运动。这种动画方法在人物角色上的应用比较少,但在物理仿真中则相对比较常见。
Skinned Animation 蒙皮动画
通过控制角色内部骨骼的运动来实现整个角色的运动。和刚体动画相比,蒙皮动画可以实现更加真实和自然的运动效果。

Physics-based Animation 物理动画
物理动画是完全基于物理法则的动画模拟方法,和蒙皮动画相比需要更加深入的数学物理知识进行描述。
接下来我们介绍蒙皮动画的实现细节。从整体上来看,蒙皮动画的实现包括以下5个步骤:
- 建立网格模型;
- 建立网格模型附着的骨骼;
- 为网格上每个顶点赋予骨骼对应的权重;
- 利用骨骼完成角色的运动;
- 结合顶点的骨骼权重实现网格的运动。
上述步骤看上去不是很难,但在实际编程中需要多加小心防止出现网格爆炸的问题。

Different Spaces
要描述骨骼的运动我们还需要引入相应的坐标系统。首先整个游戏世界定义了一个世界坐标系(world space),所有的物体都位于这个坐标系中;对于每个单独的模型,模型自身还定义了一个模型坐标系(model space);最后每个骨骼还定义了一个局部坐标系(local space)来描述网格顶点和骨骼的相对位置关系。任意两个坐标系之间的变换关系可以通过3个平移和3个旋转一共6个自由度来表示,这样每个顶点的坐标都可以从局部坐标系变换到模型坐标系再变换到世界坐标系上。

Joint
我们定义骨骼与骨骼之间相连接的部位为一个关节(joint)。实际上我们不会直接按照骨骼进行编程,而是利用关节及他们直接的连接关系来表达整个骨骼的运动。

在游戏建模中除了常见的四肢外可能还会根据角色的服装和特点来构建更加复杂的骨骼模型。比如说玩家手中的武器就是通过在角色手上绑定一个新的骨骼来实现的。

除此之外,在进行建模时我们往往还会定义一个root关节。不同于前面介绍过的胯部骨骼,root关节一般会定义在角色的两脚之间,这样方便把角色固定的地面上。类似地,对于坐骑的骨骼也往往会单独把root关节定义在接近地面的位置。


很多游戏动画需要将不同的骨骼绑定到一起。最直观的例子就是角色骑马的动画,此时角色和马都有自身独立的动画而我们需要将它们组合到一起完成角色骑马的动作。要实现这种功能需要设计一个单独的mount关节,然后通过这个关节将两个模型拼接到一起。需要注意的是在拼接时不仅要考虑关节坐标的一致性,更要保证两个模型的mount关节上有一致的朝向,(不仅是接触点的重合,更是坐标轴的完全重合)这样才能实现模型正确的结合。

欧拉角
Euler Angle
三维空间中的旋转要更复杂一些。我们可以把任意三维空间的旋转分解为绕三个轴的旋转,每个旋转都对应一个三维旋转矩阵,这样就可以通过绕三个轴的旋转角度来进行表达。这种描述三维旋转的方法称为欧拉角(Euler angle)。
欧拉角的主要缺陷如下:
- 万向锁及相应的自由度退化问题;
- 很难对欧拉角进行插值;
- 很难通过欧拉角对旋转进行叠加;
- 很难描述绕$x, y, z$轴之外其它轴的旋转。
由于这些缺陷的存在,游戏引擎中几乎不会直接使用欧拉角来表达物体的旋转。
Joint Pose
有了三维旋转的表达方法后我们就可以利用关节的姿态来控制角色模型的运动。具体来说,我们每个关节的姿态可以分为平移、旋转和缩放三个部分,把它们组合到一起就可以通过一个仿射矩阵(affine matrix)来描述关节的姿态。

对于骨骼上的每一个关节,我们实际上只需要存储它相对于父节点的相对姿态。这样在计算绝对姿态时可以利用仿射矩阵的传递性从根节点出发进行累乘即可。

这种利用相对坐标系来描述位姿关系的好处在于它可以正确地对角色动作进行插值,而如果直接从绝对坐标系进行插值则会得到错误的结果。

Skinning Matrix
在前面我们介绍过模型的每个顶点是附着在骨骼上的,因此在关节姿态发生变化后顶点会跟着关节一起运动。

记顶点$V$在关节$J$定义的局部坐标系下的坐标为$V_b^l$,初始时刻进行绑定时$V$在模型坐标系下的坐标为$V_b^m$。在$t$时刻,当关节位姿发生变化后顶点的局部坐标保持不变。此时顶点在模型坐标系下的坐标和局部坐标直接满足变换关系:

其中$M_{b(J)}^m$即为初始时刻进行绑定时关节$J$对应的姿态。

利用$t$时刻关节的位姿$M_J^m(t)$,可以得到顶点$V$模型坐标系下的坐标$V^m(t)$与初始时刻模型坐标系下绑定的坐标$V_b^m$之间的变换关系:

其中$K_J = M_J^m(t) \cdot (M_{b(J)}^m)^{-1}$称为关节$J$的蒙皮矩阵(skinning matrix)。

对于同一个顶点绑定到多个骨骼的情况则需要通过插值进行处理。此时顶点V会同时存储它所绑定到的关节以及对应的权重,其在世界坐标系下的坐标为它在每个关节上定义的局部坐标转换到世界坐标后的加权和。

Interpolation
在动画制作过程中一般只会记录下一系列关键帧上骨骼的姿态,而要得到实际的动画还需要通过插值来获得中间帧上模型的运动。
线性插值是最基本的插值方法,我们可以通过对关节姿态的插值来计算中间帧上的模型运动。

对于三维旋转的插值要相对复杂一些,不过我们可以借助四元数的运算来进行处理。要获得插值后的旋转只需要对四元数直接进行线性插值,然后再进行归一化即可,这样的方法称为NLERP。

需要说明的是NLERP并不是真的对旋转进行线性插值。当动画的帧数较高时NLERP会有明显的违和感,这是由于它没有考虑旋转并不是线性空间。从角度上来看插值是不均匀的
想要真的对旋转进行线性插值可以使用SLERP这样的算法,不过SLERP的计算代价要比NLERP要大一些。


AnimationRuntime Pipeline
我们把上面介绍过的算法整理一下就得到了一个简单的蒙皮动画管线如下。现代3A游戏在此基础上还会更多地把计算配置到GPU上来充分计算资源。

另行学习:IK,动画混合,给Player安装武器
参考文章:GAMES104课程笔记08-Basics of Animation Technology - Bo's Blog (peng00bo00.github.io)
相关文章:
Games104 现代游戏引擎3
Sprite Animation 序列帧动画 自由度(degrees of freedom,DoF)对于刚体而言描述它的运动需要3个位移3个旋转,一共6个自由度 顶点动画(per-vertex animation)利用网格的顶点来控制运动。此时网格上的每个顶…...
【云计算】混合云分类
《混合云》系列,共包含以下 3 篇文章: 【云计算】混合云概述【云计算】混合云分类【云计算】混合云组成、应用场景、风险挑战 😊 如果您觉得这篇文章有用 ✔️ 的话,请给博主一个一键三连 🚀🚀Ὠ…...
探索分布式系统监控zabbix------------自动发现与自动注册
目录 一、部署 zabbix 服务端 二、部署 zabbix 客户端 2.1环境准备 2.2服务端和客户端都配置时间同步 (ntp) 2.2.1服务端zbx-server 2.2.2服务端zabbix-agent01客户端 2.3客户端配置时区,与服务器保持一致 2.4设置 zabbix 的下载源&…...
权限管理Ranger详解
文章目录 一、Ranger概述与安装1、Ranger概述1.1 Ranger介绍1.2 Ranger的目标1.3 Ranger支持的框架1.4 Ranger的架构1.5 Ranger的工作原理 2、Ranger安装2.1 创建系统用户和Kerberos主体2.2 数据库环境准备2.3 安装RangerAdmin2.4 启动RangerAdmin 二、Ranger简单使用1、安装 R…...
WPF Extended.Wpf.Toolkit 加载界面
1、NuGet 中安装 Extended.Wpf.Toolkit 。 2、在MainWindow.xaml中添加xmlns:tk"http://schemas.xceed.com/wpf/xaml/toolkit" 。 MainWindow.xaml 代码如下。 <Window x:Class"WPF_Extended_Wpf_Toolkit_Loading.MainWindow" xmlns"ht…...
【切换网络连接后】VMware虚拟机网络配置【局域网通信】
初次安装Linux虚拟机以及切换网络都需要配置虚拟机网络, 从而使得win主机内通过远程连接工具能够连接该虚拟机, 而不是在虚拟机内操作。 本片文章你将了解到网络切换后如何配置虚拟机网络的一些基础操作,以及局域网通信的一些基础知识。 …...
革新鞋服零售:数据驱动的智能商品管理 解锁库存优化与高效增长
国内鞋服零售企业经过多年的发展,已经形成诸多家喻户晓的品牌,但近年来一些企业的库存问题也时常显现,高库存不仅困扰着品牌商,也使一些多年合作良好的经销商深受其害,当下的订货会制度在初期帮助企业解决了盲目生产的…...
word文件的创建时间和修改时间可以更改吗?答案是肯定的 文件属性修改的方法
一,引言 在日常生活和工作中,我们经常需要处理各种Word文件。有时,由于某些原因,我们可能需要更改Word文件的创建时间和修改时间。虽然这听起来可能有些复杂,但实际上,通过一些简单的方法和工具࿰…...
redisson -- 延迟队列RDelayedQueue
1.maven配置 <!-- 用于管理起步工程的依赖管理 --><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.11</version><relativePath/> </parent…...
Flex弹性盒子布局案例(认识弹性布局)
一、导航菜单 此示例创建了一个水平导航菜单,其中链接在 Flex 容器中等距分布。 HTML结构: <nav class"nav-menu"><a href"#">Home</a><a href"#">About</a><a href"#">…...
【ros2】ros1和ros2可以同时在一台机器上运行吗
可以,ROS 1 和 ROS 2 是两个不同版本的 Robot Operating System (ROS),它们分别有着各自的架构、消息传递机制以及配套工具集。尽管存在这些差异,ROS 1 和 ROS 2 可以在同一台 Ubuntu 系统上共存并独立运行。以下是一些关键点来说明如何实现这…...
PMSM MATLAB
// s-function搭建变参数PMSM模型 ///...
笔记本电脑上的聊天机器人: 在英特尔 Meteor Lake 上运行 Phi-2
对应于其强大的能力,大语言模型 (LLM) 需要强大的算力支撑,而个人计算机上很难满足这一需求。因此,我们别无选择,只能将它们部署至由本地或云端托管的性能强大的定制 AI 服务器上。 为何需要将 LLM 推理本地化 如果我们可以在典配…...
【Web】陇原战“疫“2021网络安全大赛 题解
目录 CheckIN eaaasyphp EasyJaba CheckIN 拿到附件,贴出关键代码 func getController(c *gin.Context) {cmd : exec.Command("/bin/wget", c.QueryArray("argv")[1:]...)err : cmd.Run()if err ! nil {fmt.Println("error: ", …...
010Node.js自定义模块通过exports的使用,两种暴露的方法及区别(二)
module/request.js var obj{get:function(){console.log(从服务器获取数据);},post:function(){console.log(提交数据);} }exports.xxxxobj;//方法一 { xxxx: { get: [Function: get], post: [Function: post] } }//module.exportsobj;//方法二 //{ get: [Function: g…...
【CVE-2010-2883】进行钓鱼攻击的研究
最近作业中研究APT攻击,了解到2011年前后披露的LURID-APT,其中敌手利用了各种版本的文件查看器的漏洞实现攻击。CVE-2010-2883就是其中被利用的一个adobe reader的漏洞。特此复现,更好的研究和防范APT攻击。 本文仅仅是对相关漏洞利用的学习…...
【Python】如何在Ubuntu上设置Python脚本开机自启
你不知道我为什么狠下心 盘旋在你看不见的高空里 多的是 你不知道的事 蝴蝶眨几次眼睛 才学会飞行 夜空洒满了星星 但几颗会落地 我飞行 但你坠落之际 很靠近 还听见呼吸 对不起 我却没捉紧你 🎵 王力宏《你不知道的事》 前置要求 确保你的Ub…...
计算机视觉——OpenCV Python基于颜色识别的目标检测
1. 计算机视觉中的颜色空间 颜色空间在计算机视觉领域的应用非常广泛,它们在图像和视频处理、物体检测等任务中扮演着重要角色。颜色空间的主要作用是将颜色以数值形式表示出来,这样计算机算法就能够对其进行处理和分析。不同的颜色空间有着不同的特点和…...
2024中国内燃机展-北京汽车发动机零部件展
2024第二十三届中国国际内燃机与零部件展览会 由中国内燃机工业协会主办、中国机床专用技术设备有限公司、汽车工艺装备成套开发集团协办的2024中国国际内燃机及动力装备博览会(简称“动博会”)将于2024年10月11日-13日在亦创国际会展中心隆重举办。本届…...
【iOS】——SDWebImage源码学习
文章目录 一、SDWebIamge简介二、SDWebImage的调用流程SDWebImage源码分析1.UIImageViewWebCache层2.UIViewWebCache层3.SDWebManager层4.SDWebCache层5.SDWebImageDownloader层 一、SDWebIamge简介 SDWebImage是iOS中提供图片加载的第三方库,可以给UIKit框架中的控…...
VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...
vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...
从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障
关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...
windows系统MySQL安装文档
概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...
