opengl实现骨骼动画-(1)原理

教学知识文档

骨骼动画

背景

  • 骨骼动画实际上是一个由两部分组成的过程。第一个由艺术家执行,第二个由程序员(或者更确切地说,你编写的引擎)执行。第一部分发生在建模软件内部,称为索具。这里发生的事情是,艺术家定义了网格下方的骨骼骨架。网格表示对象(无论是人类,怪物还是其他任何东西)的皮肤,并且骨骼用于以模仿现实世界中实际运动的方式移动网格。这是通过将每个顶点分配给一个或多个骨骼来完成的。将顶点分配给骨骼时,将定义一个权重,以确定骨骼移动时对顶点的影响量。通常的做法是使所有权重的总和为1(每个顶点)。例如,如果顶点正好位于两个骨骼之间,我们可能希望为每个骨骼分配 0.5 的权重,因为我们期望骨骼对顶点的影响相等。但是,如果顶点完全在单个骨骼的影响范围内,则权重将为1(这意味着骨骼自主控制顶点的运动)。
    在这里插入图片描述

  • 艺术家将骨骼结构装配在一起,并为每种动画类型(“行走”,“奔跑”,"死亡"等)定义一组关键帧关键帧包含动画路径上关键点中所有骨骼的变换。图形引擎在关键帧的变换之间进行插值,并在它们之间创建平滑的运动

  • 用于骨骼动画的骨骼结构通常是分层的。这意味着骨骼具有子/父关系,因此会创建骨骼树。除根骨外,每个骨骼都有一个父骨

  • 我们不打算进一步讨论操纵。这是一个复杂的主题,超出了图形程序员的领域。建模软件具有高级工具来帮助艺术家完成这项工作,您需要成为一名优秀的艺术家才能创建好看的网格和骨架。让我们看看图形引擎需要做什么才能制作骨架动画。

  • 第一阶段是使用每个顶点骨骼信息预兆顶点缓冲区。有几个选项可用,但我们要做的非常简单。对于每个顶点,我们将添加一个槽数组,其中每个槽都包含骨骼 ID 和权重。为了使我们的生活更简单,我们将使用一个具有四个插槽的数组,这意味着没有顶点可以受到四个以上骨骼的影响。如果您要加载包含更多骨骼的模型,则需要调整数组大小,但对于本教程演示的一部分的Doom 3模型,四个骨骼就足够了。因此,我们的新顶点结构将如下所示:

    在这里插入图片描述

  • 骨 ID 是骨转换数组的索引。这些转换将应用于WVP矩阵之前的位置和法线(即它们将顶点从"骨空间"转换为局部空间)。权重将用于将多个骨骼的转换组合成单个转换,并且在任何情况下,总权重必须正好为1(建模软件的责任)。通常,我们会在动画关键帧之间进行插值,并更新每一帧中的骨骼转换数组

  • 创建骨骼转换阵列的方式通常是棘手的部分。转换设置在继承结构(即)中,常见的做法是在树中的每个节点中具有缩放向量旋转四元数平移向量。实际上,每个节点都包含这些项的数组。数组中的每个条目都必须有一个时间戳。应用程序时间与其中一个时间戳完全匹配的情况可能很少见,因此我们的代码必须能够插值缩放/旋转/平移,以获得应用程序时间点的正确转换。我们对从当前骨骼到根的每个节点执行相同的过程,并将这一转换链相乘以获得最终结果。我们对每个骨骼执行此操作,然后更新着色器

Assimp骨骼动画

  • 到目前为止,我们谈论的所有内容都非常通用。但是这是一个关于使用Assimp骨架动画的教程,因此我们需要再次深入研究该库,并了解如何使用它进行蒙皮。Assimp的好处是它支持从多种格式加载骨骼信息坏处是,您仍然需要对它创建的数据结构进行大量工作,以生成着色器所需的骨骼转换。
    在这里插入图片描述

  • Assimp 教程中,所有内容都包含在 aiScene 类中(我们在导入网格文件时获得的对象)。aiScene 包含一个 aiMesh 对象数组。aiMesh 是模型的一部分,包含顶点级别的内容,例如位置、法线、纹理坐标等。现在我们看到 aiMesh 还包含一个 aiBone 对象数组。毫无疑问,aiBone 代表网格骨架中的一个骨骼

  • 每个骨骼都有一个名称,通过该名称可以在骨骼层次结构中找到它(见下文),顶点权重数组和4x4偏移矩阵。我们需要这个矩阵的原因是因为顶点存储在通常的局部空间中。这意味着即使没有骨架动画支持,我们现有的代码库也可以加载模型并正确呈现它。但是,继承权中的骨骼变换在骨骼空间中起作用(每个骨骼都有自己的空间,这就是为什么我们需要将变换相乘)。因此,偏移矩阵的工作是将顶点位置从网格的局部空间移动到该特定骨骼的骨骼空间中。

顶点级别构建骨骼信息

  • 顶点级别构建骨骼信息后,我们需要处理骨骼转换层次结构并生成将加载到着色器中的最终转换。下图显示了相关的数据结构:
    在这里插入图片描述

  • 同样,我们从aiScene开始。aiScene 对象包含一个指向 aiNode 类对象的指针,该对象是节点层次结构(换句话说 - 树)的根。树中的每个节点都有一个返回其父节点的指针和一个指向其子节点的指针数组。这使我们能够方便地来回遍历树。此外,节点携带一个转换矩阵,该矩阵从节点空间转换为其父级空间。最后,节点可能有名称,也可能没有名称。如果节点表示层次结构中的骨骼,则节点名称必须与骨骼名称匹配。但有时节点没有名称(这意味着没有相应的骨骼),它们的工作只是帮助建模者分解模型并在此过程中放置一些中间转换。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
课程简介:本课程详细讲解基于Assimp C++库的模型读取模块,并且做了关于动画理论、关键帧插值、骨骼动画矩阵原理骨骼动画读取与播放等知识的详细讲解,对于游戏行业或者三维可视化从业人员会有比较大的帮助。目前很多公司已经开始构建自己的底层图形引擎,其中动画就是重要的一个版块,本课程可以让学员从原理层面以及底层代码层面了解FBX、OBJ模型的读取本质,并且梳理程序架构,编写骨骼动画。2 课程解决优势:很多同学学习骨骼动画苦于无法找到详细的资料,其中卡主的问题点也比比皆是,比如FBX内嵌材质的读取,骨骼动画各类矩阵的应用,理论结合模型读取库读出来的数据如何一一对应等。我们的课程可以带领大家从原理+实践的角度进行学习,每一个知识点都会:a 推导基础公式及原理 b 一行一行进行代码实践从而能够保证每位同学都学有所得,能够看得懂,学得会,用得上,并且能够培养自主研究的能力。3 学习课程所得:学习本课程完毕之后,学员可以全方位的完全了解基于Assimp库的模型读取结构,了解每一个变量背后的含义,并且课程拥有随堂附赠的源代码,保证同学可以随时根据老师的代码纠正自己的错误。跟随课程一行一行写完代码的同学,可以获得自己的模型读取代码库,并且深度理解骨骼动画原理与模型读取原理 本课程含有全源代码
Opengl骨骼动画是一种通过在3D模型上应用骨骼结构和动画关键帧来实现动画效果的技术。在Opengl中,艺术家会将骨骼结构装配在一起,并为每种动画类型定义一组关键帧。关键帧包含了动画路径上骨骼的变换信息,图形引擎会在这些关键帧之间进行插值,从而创建平滑的运动效果。使用Opengl实现骨骼动画需要借助辅助库如Assimp,它可以从多种格式加载骨骼信息。然而,使用Assimp加载的数据结构还需要一些工作来生成着色器所需的骨骼转换。通过使用Opengl骨骼动画技术,可以实现人物行走、爬楼梯等复杂的动作效果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Opengl骨骼动画](https://download.csdn.net/download/mirro187/10762824)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [opengl实现骨骼动画-(1)原理](https://blog.csdn.net/wqdqwass/article/details/121569040)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值