当前位置: 首页 > news >正文

Games104 现代游戏引擎3

Sprite Animation  序列帧动画

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

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

Skinned Animation 蒙皮动画

通过控制角色内部骨骼的运动来实现整个角色的运动。和刚体动画相比,蒙皮动画可以实现更加真实和自然的运动效果。

Physics-based Animation 物理动画

物理动画是完全基于物理法则的动画模拟方法,和蒙皮动画相比需要更加深入的数学物理知识进行描述。

接下来我们介绍蒙皮动画的实现细节。从整体上来看,蒙皮动画的实现包括以下5个步骤:

  1. 建立网格模型;
  2. 建立网格模型附着的骨骼;
  3. 为网格上每个顶点赋予骨骼对应的权重;
  4. 利用骨骼完成角色的运动;
  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 篇文章: 【云计算】混合云概述【云计算】混合云分类【云计算】混合云组成、应用场景、风险挑战 😊 如果您觉得这篇文章有用 ✔️ 的话,请给博主一个一键三连 🚀🚀&#x1f68…...

探索分布式系统监控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虚拟机以及切换网络都需要配置虚拟机网络&#xff0c; 从而使得win主机内通过远程连接工具能够连接该虚拟机&#xff0c; 而不是在虚拟机内操作。 本片文章你将了解到网络切换后如何配置虚拟机网络的一些基础操作&#xff0c;以及局域网通信的一些基础知识。 …...

革新鞋服零售:数据驱动的智能商品管理 解锁库存优化与高效增长

国内鞋服零售企业经过多年的发展&#xff0c;已经形成诸多家喻户晓的品牌&#xff0c;但近年来一些企业的库存问题也时常显现&#xff0c;高库存不仅困扰着品牌商&#xff0c;也使一些多年合作良好的经销商深受其害&#xff0c;当下的订货会制度在初期帮助企业解决了盲目生产的…...

word文件的创建时间和修改时间可以更改吗?答案是肯定的 文件属性修改的方法

一&#xff0c;引言 在日常生活和工作中&#xff0c;我们经常需要处理各种Word文件。有时&#xff0c;由于某些原因&#xff0c;我们可能需要更改Word文件的创建时间和修改时间。虽然这听起来可能有些复杂&#xff0c;但实际上&#xff0c;通过一些简单的方法和工具&#xff0…...

redisson -- 延迟队列RDelayedQueue

1.maven配置 <!-- 用于管理起步工程的依赖管理 --><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.11</version><relativePath/> </parent…...

Flex弹性盒子布局案例(认识弹性布局)

一、导航菜单 此示例创建了一个水平导航菜单&#xff0c;其中链接在 Flex 容器中等距分布。 HTML结构&#xff1a; <nav class"nav-menu"><a href"#">Home</a><a href"#">About</a><a href"#">…...

【ros2】ros1和ros2可以同时在一台机器上运行吗

可以&#xff0c;ROS 1 和 ROS 2 是两个不同版本的 Robot Operating System (ROS)&#xff0c;它们分别有着各自的架构、消息传递机制以及配套工具集。尽管存在这些差异&#xff0c;ROS 1 和 ROS 2 可以在同一台 Ubuntu 系统上共存并独立运行。以下是一些关键点来说明如何实现这…...

PMSM MATLAB

// s-function搭建变参数PMSM模型 ///...

笔记本电脑上的聊天机器人: 在英特尔 Meteor Lake 上运行 Phi-2

对应于其强大的能力&#xff0c;大语言模型 (LLM) 需要强大的算力支撑&#xff0c;而个人计算机上很难满足这一需求。因此&#xff0c;我们别无选择&#xff0c;只能将它们部署至由本地或云端托管的性能强大的定制 AI 服务器上。 为何需要将 LLM 推理本地化 如果我们可以在典配…...

【Web】陇原战“疫“2021网络安全大赛 题解

目录 CheckIN eaaasyphp EasyJaba CheckIN 拿到附件&#xff0c;贴出关键代码 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攻击&#xff0c;了解到2011年前后披露的LURID-APT&#xff0c;其中敌手利用了各种版本的文件查看器的漏洞实现攻击。CVE-2010-2883就是其中被利用的一个adobe reader的漏洞。特此复现&#xff0c;更好的研究和防范APT攻击。 本文仅仅是对相关漏洞利用的学习…...

【Python】如何在Ubuntu上设置Python脚本开机自启

你不知道我为什么狠下心 盘旋在你看不见的高空里 多的是 你不知道的事 蝴蝶眨几次眼睛 才学会飞行 夜空洒满了星星 但几颗会落地 我飞行 但你坠落之际 很靠近 还听见呼吸 对不起 我却没捉紧你 &#x1f3b5; 王力宏《你不知道的事》 前置要求 确保你的Ub…...

计算机视觉——OpenCV Python基于颜色识别的目标检测

1. 计算机视觉中的颜色空间 颜色空间在计算机视觉领域的应用非常广泛&#xff0c;它们在图像和视频处理、物体检测等任务中扮演着重要角色。颜色空间的主要作用是将颜色以数值形式表示出来&#xff0c;这样计算机算法就能够对其进行处理和分析。不同的颜色空间有着不同的特点和…...

2024中国内燃机展-北京汽车发动机零部件展

2024第二十三届中国国际内燃机与零部件展览会 由中国内燃机工业协会主办、中国机床专用技术设备有限公司、汽车工艺装备成套开发集团协办的2024中国国际内燃机及动力装备博览会&#xff08;简称“动博会”&#xff09;将于2024年10月11日-13日在亦创国际会展中心隆重举办。本届…...

【iOS】——SDWebImage源码学习

文章目录 一、SDWebIamge简介二、SDWebImage的调用流程SDWebImage源码分析1.UIImageViewWebCache层2.UIViewWebCache层3.SDWebManager层4.SDWebCache层5.SDWebImageDownloader层 一、SDWebIamge简介 SDWebImage是iOS中提供图片加载的第三方库&#xff0c;可以给UIKit框架中的控…...

树和二叉树(一)

一、树 非线性数据结构&#xff0c;在实际场景中&#xff0c;存在一对多&#xff0c;多对多的情况。 树( tree&#xff09;是n (n>0&#xff09;个节点的有限集。当n0时&#xff0c;称为空树。 在任意一个非空树中&#xff0c;有如下特点。 1.有且仅有一个特定的称为根的节点…...

RAID 磁盘阵列及RAID配置实战

目录 一.RAID磁盘阵列介绍 二.常用的RAID磁盘阵列的介绍 1.RAID 0 &#xff08;条带化存储&#xff09; 2.RAID 1&#xff08;镜像存储&#xff09; 3.RAID 5 4.RAID 6 5.RAID 10&#xff08;先做镜像&#xff0c;再做条带&#xff09; 6.RAID 01 &#xff08;先做条带…...

listpack

目录 为什么有listpack? listpack结构 listpack的节点entry 长度length encoding编码方式 listpack的API 1.创建listpack 2.遍历操作 正向遍历 反向遍历 3.查找元素 4.插入/替换/删除元素 总结 为什么有listpack? ziplist是存储在连续内存空间&#xff0c;节省…...

Web3与社会契约:去中心化治理的新模式

在数字化时代&#xff0c;技术不断为我们提供新的可能性&#xff0c;而Web3技术作为一种基于区块链的创新&#xff0c;正在引领着互联网的下一波变革。它不仅改变了我们的经济模式和商业逻辑&#xff0c;还对社会契约和权力结构提出了全新的挑战和思考。本文将深入探讨Web3的基…...

实体类List重复校验

如果实体类有多个属性&#xff0c;并且你希望根据所有属性的组合来进行重复校验&#xff0c;你可以考虑以下几种方法&#xff1a; 使用集合存储已经出现过的实体对象&#xff1a; 将每个实体对象放入一个 Set 中进行重复校验。在 Set 中元素的比较可以使用自定义的 equals 方法…...

loadash常用的函数方法

Lodash是一个JavaScript实用工具库&#xff0c;提供了很多常用的函数方法来简化开发过程。以下是一些常用的Lodash函数方法&#xff1a; _.map(array, iteratee)&#xff1a;对数组中的每个元素应用一个函数&#xff0c;并返回结果数组。_.filter(collection, predicate)&…...

【零基础入门TypeScript】模块

目录 内部模块 内部模块语法&#xff08;旧&#xff09; 命名空间语法&#xff08;新&#xff09; 两种情况下生成的 JavaScript 是相同的 外部模块 选择模块加载器 定义外部模块 句法 例子 文件&#xff1a;IShape.js 文件&#xff1a;Circle.js 文件&#xff1a;…...

Scala 之数组

可变数组与不可变数组 import scala.collection.mutable.ArrayBuffer// 不可变数组。 长度不可变&#xff0c;但是元素的值可变 object Demo1 {def main(args: Array[String]): Unit {// 不可变数组定义方式// 未初始化有默认值 Int > 0val arr1 : Array[Int] new Arr…...

【Phytium】飞腾D2000 UEFI/EDK2 适配 RTC(IIC SD3077)

文章目录 0. env1. 软件2. 硬件 10. 需求1. 硬件2. 软件 20. DatasheetCPURTC 30. 调试步骤1. 硬件环境搭建2. UEFI 开发环境搭建3. 修改步骤1. UEFI 中使能RTC驱动、配置RTC信息等1.1 使能RTC驱动1.2 修改RTC对应的IIC配置信息1.3 解决驱动冲突1.4 验证波形 2. 修改对应RTC驱动…...

如何利用纯前端技术,实现一个网页版视频编辑器?

纯网页版视频编辑器 一、前言二、功能实现三、所需技术四、部分功能实现4.1 素材预设4.2 多轨道剪辑 一、前言 介绍&#xff1a;本篇文章打算利用纯前端的技术&#xff0c;来实现一个网页版的视频编辑器。为什么突然想做一个这么项目来呢&#xff0c;主要是最近一直在利用手机…...

专业做网站app真假/邯郸百度推广公司

作者&#xff1a; Amin Gholiha 翻译&#xff1a;高庆余 文章来源&#xff1a; [url]http://www.codeproject.com/KB/IP/iocp_server_client.aspx[/url] 前言&#xff1a;源代码使用比较高级的 IOCP 技术&#xff0c;它能够有效的为多个客户端服务&#xff0c;利用 IOCP…...

政府门户网站信息资源建设情况/创建网站的软件

应用场景设置以学生的信息管理系统为例&#xff0c;演示学生信息的增删改查。这里定义学生的Bean类为&#xff1a;Student.javapublic class Student {private String studentId;private String name;private int weight;private int height;private Date birthday;public Stri…...

常见的网站结构有哪些/郑州官网关键词优化公司

面试过程&#xff1a;7&#xff1a;45到场签到&#xff0c;8&#xff1a;30面试正式开始。主考官一个接着一个问问题。问题有很多&#xff0c;我记不全了&#xff0c;简单罗列一些印象深刻的吧。1.如果你是学生会某部门的部长&#xff0c;你的干事(女生)因为你布置的工作压力太…...

建设工程业绩查询网站/百度收录技术

<?php //建立连接对象 try {$pdo new PDO(mysql:hostlocalhost;dbnametest,testuser,pass);$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); //setAttribute PDO对象的方法&#xff0c;PDO&#xff1a;&#xff1a;表示这些变量是我们所使用的PDO的一…...

研磨材料 东莞网站建设/网站建设公司排名

内容转自“泽平科技”微信公众号&#xff0c;技术咨询请微信搜索“泽平科技” 土壤中的微生物资源非常丰富&#xff0c;原核生物细胞含量大约110^7个&#xff0f;g&#xff0c;但用传统技术培养的微生物仅占微生物总数的0.01&#xff05;~10&#xff05;&#xff0c;且大部分微…...

wordpress中文企业模板/怎么自己建立一个网站

2019独角兽企业重金招聘Python工程师标准>>> 1 索引概念 索引通过记录表中的关键值来指向表中的记录。在一个 表中建⽴立一个索引,执⾏行查询时不必扫描整个表,就能快速地找到 所需的数据。⼀个索引就是⼀一个列表,其中列出⼀一些值和指向每个 值在表中的实际…...