模型的骨骼动画技术讲解..
- 格式:doc
- 大小:540.50 KB
- 文档页数:12
3D Max角色绑定教程:将骨骼和皮肤关联起来实现角色动画3D Max是一款常用的三维建模和动画渲染软件,在进行角色动画制作时,角色的骨骼与皮肤的绑定是非常重要的一步。
通过将骨骼和皮肤关联起来,可以实现角色的自然动画效果。
下面是一个详细的3D Max角色绑定教程。
步骤一:准备工作1. 打开3D Max软件,并导入已经完成建模的角色模型。
2. 确保已经创建好了骨骼系统,可以通过在“动作”面板中选择“创建”下的“骨骼系统”来创建。
步骤二:绑定骨骼和皮肤1. 选择角色模型,进入“修改器”面板,在列表中找到“皮肤”修改器并选择。
2. 在皮肤修改器中,点击“加入”按钮,并选择骨骼系统中的骨骼。
3. 确保骨骼被正确地添加到了角色模型上,可以通过点击添加的骨骼来查看。
4. 在骨骼列表中,选择每个骨骼,然后在“权重表”下的“顶点权重编辑器”中调整各顶点与骨骼的关联程度。
可以使用“刷子”工具进行绘制。
步骤三:测试绑定效果1. 在绑定骨骼和皮肤后,我们需要测试动画效果是否正常。
可以使用时间轴上的关键帧来测试。
2. 在场景中创建一个简单的运动动画,例如让角色在原地做个转圈动作。
3. 通过调整时间轴上的关键帧,查看角色模型是否按照预期进行动画。
步骤四:调整绑定效果1. 在测试动画时,如果发现一些异常情况,例如角色的皮肤在某些动作中出现扭曲,可以尝试调整权重表中对应顶点的权重数值。
2. 可以逐渐增加或减少权重数值,观察调整过后的效果,直到满意为止。
步骤五:保存绑定信息1. 当完成骨骼和皮肤的绑定后,我们需要将绑定信息保存起来,以备以后的动画制作使用。
2. 在“皮肤”修改器中,点击“复制数据”按钮,将绑定信息复制到剪贴板中。
3. 可以将复制的信息保存为一个文件,方便以后再次加载使用。
通过这个教程,我们可以学习到如何将3D Max中的角色模型与骨骼系统进行绑定,实现角色的自然动画效果。
通过合理调整骨骼与皮肤的关联程度,可以创建出更加真实的角色动画。
狗模型绑定动画效果概述引言在现代计算机图形学中,动画是一个重要的应用领域。
动画效果可以使静态的模型变得生动活泼,并且能够增强用户体验。
本文将探讨如何为狗模型绑定动画效果,以使其在应用中更加逼真和吸引人。
动画绑定的基本概念在开始讨论狗模型的动画绑定之前,我们先来了解一些基本概念。
动画绑定是指将一个模型的骨骼与其对应的动画序列进行关联的过程。
通过绑定,模型的骨骼可以根据动画序列的变化而产生相应的变形效果,从而实现模型的动态效果。
狗模型的骨骼结构在绑定动画效果之前,我们首先需要了解狗模型的骨骼结构。
狗模型的骨骼结构通常由多个骨骼组成,这些骨骼之间通过关节连接起来。
每个骨骼都有自己的旋转和平移属性,这些属性可以用来控制模型的姿态和动作。
狗模型的动画序列动画序列是一系列关键帧的集合,每个关键帧都包含了模型的姿态信息。
在动画序列中,一般会定义一些关键帧之间的插值方式,以使得模型在关键帧之间的过渡更加平滑。
狗模型的动画序列可以包括行走、奔跑、跳跃等不同的动作。
狗模型的动画绑定过程狗模型的动画绑定过程可以分为以下几个步骤:步骤一:导入狗模型和动画序列首先,我们需要将狗模型和相应的动画序列导入到动画编辑软件中。
导入过程包括加载模型文件和动画文件,并将它们显示在编辑器的场景中。
步骤二:创建骨骼控制器接下来,我们需要创建一个骨骼控制器,用于控制狗模型的骨骼。
骨骼控制器可以通过旋转和平移操作来改变模型的姿态。
在创建骨骼控制器时,我们需要将狗模型的骨骼与控制器进行关联。
步骤三:绑定骨骼和动画序列一旦骨骼控制器创建完成,我们就可以开始将骨骼和动画序列进行绑定。
绑定的过程包括将动画序列中的关键帧与骨骼控制器中的骨骼进行匹配,并将其相应的姿态信息传递给骨骼控制器。
步骤四:调整动画参数在绑定完成后,我们可能需要对动画参数进行一些调整,以使得模型的动作更加自然和流畅。
调整的参数包括动画的播放速度、循环方式以及过渡效果等。
步骤五:导出绑定后的模型和动画最后,我们可以将绑定后的狗模型和动画导出为文件,以供应用程序使用。
狗模型绑定动画效果概述(最新版)目录1.狗模型绑定动画效果的概念2.狗模型绑定动画效果的重要性3.狗模型绑定动画效果的实现步骤4.狗模型绑定动画效果的应用案例5.狗模型绑定动画效果的未来发展趋势正文一、狗模型绑定动画效果的概念狗模型绑定动画效果指的是将 3D 模型中的骨骼与动画效果进行关联,使得模型在播放动画时能够呈现出自然、流畅的动作。
在游戏、影视、广告等产业中,狗模型绑定动画效果是一项非常重要的技术,它能够赋予模型生命力,让观众感受到模型的真实感和立体感。
二、狗模型绑定动画效果的重要性狗模型绑定动画效果在许多领域中都发挥着重要作用,比如在游戏产业中,吸引玩家的不仅仅是游戏的玩法和故事情节,游戏的画面效果也是吸引玩家的一大因素。
而狗模型绑定动画效果正是提升游戏画面效果的关键技术之一。
在影视产业中,狗模型绑定动画效果能够让影视作品中的动物角色更具有真实感,从而提升作品的观赏性。
三、狗模型绑定动画效果的实现步骤1.创建 3D 模型:首先需要创建一个狗的 3D 模型,包括模型的外形、骨骼、纹理等。
2.制作动画:根据狗的生活习性,制作出各种动作的动画,比如奔跑、跳跃、摇头等。
3.绑定动画:将动画与骨骼进行关联,使得每段动画都能通过骨骼的运动来实现。
4.调整动画:根据需要,对动画进行调整,使得动画效果更加自然、流畅。
四、狗模型绑定动画效果的应用案例在许多游戏中,都可以看到狗模型绑定动画效果的应用,比如《绝地求生》、《守望先锋》等。
在这些游戏中,狗模型的绑定动画效果都非常出色,让玩家感受到了游戏的真实感和立体感。
五、狗模型绑定动画效果的未来发展趋势随着技术的发展,狗模型绑定动画效果将会有更高的要求,比如动画效果的真实感、流畅度、细节等。
毕业论文---浅谈三维动画的骨骼装配及动作调试毕业设计论文浅谈三维动画的骨骼装配及动作调试——短片《GO OUT》创作教学单位:专业名称:学号:学生姓名:指导教师:指导单位:完成时间:浅谈三维动画的骨骼装配及动作调试——短片《GO OUT》题目名称创作1 毕业设计内容:三维动画短片《GO OUT》创作要求:经过前期动画创作,故事剧本、角色设计、分镜头台本,、中期制作与后期合成~完成三维动画短片~并设计,撰着重探索三维动画中的骨骼装配及动作调试。
写,内容2 毕业论文内容:《浅谈三维动画的骨骼装配及动作调试——短片<GO OUT>创作》要求:论文的主要内容包含两个部分:其中第一部分为三维动画短片《GO OUT》前期概述。
第二部分将是本文的重点~结合三维动画短片《GO OUT》创作~阐述三维动画骨骼装配及动作调试的技术要点~以及这次短片创作过程中骨骼装配及动作调试运用与心得体会。
1、完成三维动画短片《GO OUT》的创作~将所学的动画原理与技术理论相结合~学以致用~着重探索三维动画预期目标中的骨骼装配及动作调试。
2、根据短片创作所获得的经验~结合三维动画中骨骼装配及动作调试的相关理论~完成毕业论文《浅谈三维动画的骨骼装配及动作调试——短片<GO OUT>创作》的写作。
三维动画短片、毕业论文成果形式设计,撰写,地点起止时间指导单位2011年月日指导教师审核意见年月日审核签名评语:设计, 撰写 ,过程指导教师:成绩年月日评语:论文评阅评阅教师:年月日成绩评语:论文答辩答辩组长:成绩年月日审核人: 年月日总分浅谈三维动画的骨骼装配及动作调试——短片《GO OUT》创作摘要三维动画正在国内迅速发展,三维动画迅速取代传统动画成为最卖座的动画片种。
三维动画展现出来最直观感受就是物体的逼真和运动的自然,而要做到运动自然,就必须充分研究人体、动物等的运动规律,以及支配他们运动的骨骼系统。
所以在以完美和真实为最终追求的三维动画中,骨骼装配有着其不可替代的作用。
vrm模型骨骼标准
VRM(Virtual Reality Modeling Language)模型是一种用于
虚拟现实应用的3D模型标准。
在VRM模型中,骨骼标准通常指的是
模型的骨骼系统,它是模型动画的基础,允许模型在虚拟现实环境
中进行动作和变换。
从技术角度来看,VRM模型的骨骼标准通常基于骨骼动画技术,使用骨骼和关节来控制模型的姿势和动作。
在VRM模型中,骨骼标
准需要定义骨骼的层次结构、旋转限制、初始姿势等信息,以便在
虚拟现实环境中正确地呈现模型的动作和变换。
常见的骨骼标准包
括但不限于Unity的Humanoid骨骼标准和其他游戏引擎的骨骼标准。
此外,从行业标准的角度来看,VRM模型的骨骼标准也可能受
到行业组织或标准化机构的制定和规范。
这些标准可能涉及骨骼的
命名规范、骨骼的功能分类、骨骼的姿势约束等方面,以确保不同VRM模型在不同的虚拟现实平台上能够正确地进行动画和交互。
总之,VRM模型的骨骼标准是指模型的骨骼系统,它涉及技术
实现和行业规范两个方面,目的是确保模型能够在虚拟现实环境中
正确地进行动作和变换。
这些标准对于虚拟现实应用的开发和交互设计都具有重要意义。
3d动画蒙皮原理3D动画蒙皮原理引言在现代电影、游戏和动画制作中,3D技术的应用越来越广泛。
其中,人物角色的逼真表现是一个非常重要的方面。
而实现人物角色的逼真表现离不开蒙皮技术。
本文将介绍3D动画中的蒙皮原理及其应用。
一、蒙皮的定义和作用蒙皮是指将一个模型表面的点与骨骼关联起来,使得模型在经过骨骼动作时能够自然地变形。
通过蒙皮技术,可以使得3D模型在动作过程中具有生动、逼真的效果,让观众产生身临其境的感觉。
二、蒙皮的基本原理1. 骨骼系统蒙皮的基础是骨骼系统。
骨骼系统由多个骨骼节点组成,每个节点都有自己的位置和旋转信息。
通过控制骨骼节点的位置和旋转,可以实现对模型的变形。
2. 权重绑定在蒙皮过程中,需要将模型表面的点与骨骼关联起来。
这就需要为每个模型点分配一个或多个骨骼节点,并给予它们不同的权重。
权重的大小决定了该点受到该骨骼节点影响的程度。
通常,靠近骨骼节点的点受到的权重更大,而远离骨骼节点的点受到的权重较小。
3. 蒙皮变形一旦完成了权重绑定,模型在经过骨骼动作时,每个点会根据骨骼节点的位置和权重进行变形。
通过对骨骼节点的控制,可以实现模型的各种动作,如弯曲、伸展、扭转等。
三、蒙皮的实现方法1. 线性插值线性插值是一种常见的蒙皮实现方法。
它将每个模型点的位置通过线性插值计算得到。
线性插值的优点是计算简单,适用于简单的模型和动作。
但是,线性插值的缺点是在某些情况下会导致模型的形变不够平滑,出现锯齿状的效果。
2. 皮肤变形皮肤变形是一种更加高级的蒙皮实现方法。
它通过对模型表面进行细分,将模型表面划分为多个小区域,并对每个小区域进行变形。
皮肤变形的优点是可以实现更加精细的模型形变,使得动画效果更加逼真。
但是,皮肤变形的缺点是计算复杂,对计算资源要求较高。
四、蒙皮的应用领域蒙皮技术在现代电影、游戏和动画制作中得到广泛应用。
通过蒙皮技术,可以实现各种各样的角色形象,包括人类、动物、怪物等。
蒙皮技术不仅可以用于角色模型,还可以用于物体模型的变形。
ue 重定向骨骼旋转约束解释说明1. 引言1.1 概述在虚幻引擎(UE)中,UE重定向和骨骼旋转约束是两个重要的技术。
UE 重定向是一种资源管理机制,用于处理游戏中的资源问题,它可以将引用到已删除或移动的资源的所有操作指向正确的资源。
而骨骼旋转约束则是一种动画控制技术,用于在角色模型上实现更加复杂和自然的运动效果。
1.2 文章结构本文将首先介绍UE重定向和骨骼旋转约束的定义和原理,包括其基本概念和工作原理。
接着会详细探讨它们在实际应用场景中的具体使用方法和示例。
最后,将对它们的作用、优势以及意义进行解释说明,并分享一些具体案例分析和使用技巧。
1.3 目的本文旨在帮助读者深入了解UE重定向和骨骼旋转约束这两个技术,在游戏开发过程中更好地使用它们。
通过阐述其定义、原理、应用场景以及具体案例分析,读者可以获得对这两项技术的全面理解,从而在实际项目中运用它们来提高游戏的效果和质量。
2. UE 重定向:2.1 定义与原理:UE重定向是指在虚幻引擎中,将一个资源或者对象的引用指向另一个资源或者对象的过程。
通过重定向, 我们可以改变游戏中使用的资源或者对象,并更新其引用关系。
它基于虚幻引擎中的资源管理系统和对象引用系统实现。
在虚幻引擎中,每个资源都有一个唯一的标识符称为Asset Identifier(简称:Asset ID)。
当我们导入一个资源时,虚幻引擎会为该资源生成一个Asset ID,并维护着这个ID与对应资源之间的关联关系。
当我们在游戏项目中引用该资源时,实际上是通过Asset ID来进行引用的。
UE重定向通过更新这些Asset ID之间的映射关系,达到改变资源或者对象的目的。
当我们需要替换某个资源时,可以使用UE编辑器提供的工具进行操作,在替换完成后,所有原本引用了该资源的地方都会自动指向新的资源。
2.2 应用场景:UE重定向功能广泛应用于开发过程中各种不同情况下,例如:- 资源升级/更换: 当需要替换项目中某个已经被使用的资源时,可以利用UE重定向功能快速更新所有引用该资源的地方,而不必手动一个个更改。
使用Blender进行角色绑定与骨骼动画的教程Blender是一款功能强大的开源3D动画软件,它不仅可以创建复杂的3D模型,还可以进行角色绑定和骨骼动画。
本教程将带您了解如何在Blender中进行角色绑定和实现骨骼动画。
第一步:模型准备首先,我们需要准备一个待绑定骨骼的角色模型。
在Blender中创建一个3D模型或导入已有模型并对其进行必要的调整。
确保角色的模型结构和比例合适,并且角色的各个部分是分离的。
第二步:创建骨骼选择"Armature"(骨骼)选项卡,点击"Add"(添加)按钮,在场景中创建一个骨骼。
然后,在编辑模式下对骨骼进行调整,创建适合角色的骨骼结构。
确保骨骼与角色模型的各个部分相匹配。
第三步:骨骼绑定选择角色模型,然后按住Shift键选择骨骼。
接下来,点击右键,在弹出的菜单中选择"Parent"(父对象),再选择"Armature"(骨骼)选项。
在下拉菜单中选择"With automatic weights"(自动权重)。
Blender会自动为骨骼分配权重,使其影响到相应的模型部分。
第四步:骨骼动画通过使用骨骼的旋转、平移和缩放功能,可以实现对角色模型的动画。
选择骨骼,进入"Pose"(姿势)模式。
使用G键移动骨骼,使用R 键旋转骨骼,使用S键缩放骨骼。
可以通过关键帧(Keyframe)来记录每个骨骼的姿势。
选择一个骨骼,定位到期望的帧数,点击"I"键,在弹出菜单中选择"LocRotScale"(位置、旋转和缩放)。
这样就在当前帧上创建了一个关键帧。
重复这个过程来创建更多的关键帧,以实现连续的动画效果。
第五步:调整和编辑动画在动画过程中,您可能需要调整和编辑骨骼的姿势。
选择一个骨骼,在属性面板中找到骨骼约束(Bone Constraints)选项,您可以添加约束和限制来控制骨骼的运动范围和方式。
模型的骨骼动画技术讲解 骨骼动画实际上是两部分的过程。第一个由美术执行,第二个由程序员(或者你写的引擎)执行。第一部分发生在建模软件中,称为建模。这里发生的是术定义了网格下面骨骼的骨架。网格代表物体(无论是人类,怪物还是其他物体)的皮肤,骨骼用于移动网格物体,以模拟现实世界中的实际运动,这通过将每个顶点分配给一个或多个骨头来完成。当顶点被分配给骨骼时,定义了权重,该权重确定骨骼在移动时对顶点的影响量。通常的做法是使所有权重的总和1(每个顶点)。例如,如果一个顶点位于两个骨骼之间,我们可能希望将每个骨骼的权重分配为0.5,因为我们希望骨骼在顶点上的影响相等。然而,如果顶点完全在单个骨骼的影响之内,那么权重将为1(这意味着骨骼自主地控制顶点的运动)。
这是一个在混合器中创建的骨骼结构的例子:
我们上面看到的是动画的重要组成部分, 美术将骨骼结构组合在一起,并为每个动画类型(“步行”,“跑步”,“死亡”等)定义了一组关键帧。 关键帧包含沿着动画路径的关键点的所有骨骼的变换。 图形引擎在关键帧的变换之间进行插值,并在它们之间创建平滑的运动。
用于骨骼动画的骨骼结构通常是继承的, 这意味着骨骼有一个孩子/父母关系,所以创建了一根骨头。 除了根骨之外,每个骨骼都有一个父母。 例如,在人体的情况下,您可以将后骨分配为具有诸如手臂和腿部以及手指骨的儿童骨骼的根部。 当父骨骼移动时,它也移动其所有的孩子,但是当孩子的骨骼移动时,它不会移动它的父母(我们的手指可以移动而不移动手,但是当手移动它移动所有的手指)。 从实践的角度来看,这意味着当我们处理骨骼的变换时,我们需要将它与从它引导到根的所有父骨骼的转换结合起来。
我们不会再进一步讨论装备, 它是一个复杂的主题,并且在图形程序员的领域之外。 建模软件有先进的工具来帮助美术做这项工作,你需要成为一个很好的美术来创造一个好看的网格和骨架。 让我们看看图形引擎需要做什么才能制作骨架动画。 第一阶段是用顶点骨骼信息来提取顶点缓冲区。 有几个选项可用,但我们将要做的很简单。 对于每个顶点,我们将添加一个插槽阵列,其中每个插槽包含骨骼ID和权重。 为了使我们的生活更简单,我们将使用具有四个插槽的数组,这意味着没有顶点可以受到四个以上的骨骼的影响。 如果您要加载更多骨骼的模型,则需要调整阵列大小,但是对于作为本博文一部分的Doom 3模型,四个骨骼就足够了。 所以我们的新顶点结构将如下所示:
骨骼ID是骨转换数组的索引, 这些变换将被应用在WVP矩阵之前的位置和正常(即它们将顶点从“骨空间”转换成局部空间)。 权重将用于将几个骨骼的变换组合成单个变换,并且在任何情况下,总权重必须正好为1(建模软件的事情)。 通常,我们将在动画关键帧之间进行插值,并在每个帧中更新骨骼变换数组。
骨骼转换阵列的创建方式通常是棘手的部分。 变换被设置在一个历史结构(即树)中,通常的做法是在树中的每个节点中具有缩放向量,旋转四元数和平移向量。 实际上,每个节点都包含这些项目的数组。 数组中的每个条目都必须有一个时间戳。 应用时间与其中一个时间戳完全匹配的情况可能很少,因此我们的代码必须能够插值缩放/旋转/转换,以便在应用程序的时间点获得正确的转换。 我们对每个节点从当前骨到根进行相同的过程,并将这个变换链相加在一起以获得最终结果。 我们为每个骨骼做这些,然后更新着色器。
到目前为止,我们谈到的一切都是非常通用的。 但是这是一个关于使用Assimp的骨骼动画的博文,所以我们需要再次进入该库,读者可以自行下载一个Assimp库,看看如何使用它进行皮肤化。 Assimp的好处是它支持从多种格式加载骨骼信息。 不好的是,您仍然需要对其创建的数据结构进行相当多的工作,以生成您为着色器所需的骨骼转换。
让我们从根的骨骼信息开始吧, 以下是Assimp数据结构中的相关内容: 后面给读者介绍一下关于Assimp类的加载,一切都包含在aiScene类中(当我们导入网格文件时我们得到的对象), aiScene包含一组aiMesh对象。 aiMesh是模型的一部分,并在顶点级别包含位置,法线,纹理坐标等内容。现在我们看到aiMesh还包含一个aiBone对象的数组。毫无疑问,aiBone代表网格骨架中的一个骨骼,每个骨骼都有一个名字,通过它可以在骨骼层级(见下文),顶点权重数组和4x4偏移矩阵中找到,我们需要这个矩阵的原因是因为顶点存储在通常的本地空间中,这意味着即使没有骨架动画,我们现有的代码库也可以加载模型并正确渲染。但是,骨干变化在骨骼空间中发挥作用(每个骨骼都有自己的空间,这就是为什么我们需要将变换加在一起)。因此,偏移矩阵的工作将顶点位置从网格的局部空间移动到该特定骨骼的骨空间。
顶点权重数组是事物开始变得有趣的地方, 该数组中的每个条目都包含aiMesh中顶点数组的索引(请注意,顶点分布在几个长度相同的数组中)和权重。 所有顶点权重的总和必须为1,但是要找到它们,您需要遍历所有骨骼,并将权重累加到每个特定顶点的列表中。
在我们的顶点级别构建骨骼信息之后,我们需要处理骨骼变换层级并生成将加载到着色器中的最终转换,下图显示相关数据结构: 再次,我们从aiScene开始, aiScene对象包含一个指向aiNode类对象的指针,该对象是一个节点层级的根(换句话说 -一棵树), 树中的每个节点都有一个指向其父项的指针以及指向其子节点的数组, 这样我们可以方便地来回遍历树。 另外,节点执行从节点空间变换到其父节点空间的变换矩阵。 最后,节点可能有也可能没有一个名字。 如果一个节点表示父进制中的骨骼,则节点名称必须与骨骼名称相匹配。 但是有时节点没有名称(这意味着没有相应的骨骼),而且他们的工作只是帮助模型分解模型并且沿着一些中间变换。
最后一块拼图是aiAnimation数组,它也存储在aiScene对象中, 单个aiAnimation对象表示一系列动画帧,例如“walk”,“run”,“shoot”等。通过在帧之间进行内插,我们得到与动画名称相匹配的所需视觉效果。 动画的持续时间为每秒钟的秒数(例如每秒100个刻度和25个刻度,代表4秒动画),这有助于我们对进程进行时间调整,以使动画在每个硬件上看起来相同。 另外,动画还有一个名为通道的aiNodeAnim对象的数组。 每个通道实际上都是骨骼,全部是它的转变。 该通道包含一个名称,该名称必须与其他一个节点在层级和三个转换数组中匹配。
为了计算特定时间点的最终骨骼变换,我们需要在这三个阵列中的每一个中找到与时间匹配的两个入口,并在它们之间插值。 那么我们需要将转换组合成一个矩阵。 做完之后,我们需要在根中找到相应的节点。 然后我们需要相应的通道为父,并进行相同的插值过程。 我们把这两个变化相乘合起来,直到我们达到根的层级。 加载模型的源代码实现如下: [cpp] view plain copy 在CODE上查看代码片派生到我的代码片 bool Mesh::LoadMesh(const string& Filename) { // Release the previously loaded mesh (if it exists) Clear();
// Create the VAO glGenVertexArrays(1, &m_VAO); glBindVertexArray(m_VAO);
// Create the buffers for the vertices attributes glGenBuffers(ARRAY_SIZE_IN_ELEMENTS(m_Buffers), m_Buffers);
bool Ret = false; m_pScene = m_Importer.ReadFile(Filename.c_str(), aiProcess_Triangulate | aiProcess_GenSmoothNormals | aiProcess_FlipUVs);
if (m_pScene) { m_GlobalInverseTransform = m_pScene->mRootNode->mTransformation; m_GlobalInverseTransform.Inverse(); Ret = InitFromScene(m_pScene, Filename); } else { printf("Error parsing '%s': '%s'\n", Filename.c_str(), m_Importer.GetErrorString()); }
// Make sure the VAO is not changed from the outside glBindVertexArray(0);
return Ret; } 这是更新到Mesh类的入口点,更改标记为粗体,有一些我们需要注意的变化。 一个是导入和aiScene对象现在是类成员,而不是堆栈变量。(关于阿Assimp模型的加载会在后面博客中讲解) 原因是在运行时,我们将一次又一次地返回到aiScene对象,因此我们需要扩展导入器和场景的范围。 在一个真实的游戏中,您可能想要复制所需的东西,并以更优化的格式存储。 第二个变化是提取,反转和存储了根的层级转换矩阵, 我们继续看下去。 请注意,矩阵逆的代码已从Assimp库复制到我们的Matrix4f类中。 源代码的实现如下所示:
[cpp] view plain copy 在CODE上查看代码片派生到我的代码片 (mesh.h) struct VertexBoneData { uint IDs[NUM_BONES_PER_VEREX]; float Weights[NUM_BONES_PER_VEREX]; } (mesh.cpp) bool Mesh::InitFromScene(const aiScene* pScene, const string& Filename) { ... vector Bones; ... Bones.resize(NumVertices); ... glBindBuffer(GL_ARRAY_BUFFER, m_Buffers[BONE_VB]); glBufferData(GL_ARRAY_BUFFER, sizeof(Bones[0]) * Bones.size(), &Bones[0], GL_STATIC_DRAW); glEnableVertexAttribArray(BONE_ID_LOCATION); glVertexAttribIPointer(BONE_ID_LOCATION, 4, GL_INT, sizeof(VertexBoneData), (const GLvoid*)0); glEnableVertexAttribArray(BONE_WEIGHT_LOCATION); glVertexAttribPointer(BONE_WEIGHT_LOCATION, 4, GL_FLOAT, GL_FALSE, sizeof(VertexBoneData), (const GLvoid*)16); ... } 上面的结构包含了我们在顶点级别所需要的一切, 默认情况下,我们有足够的存储空间用于四个骨骼(每个骨骼的ID和权重)。 VertexBoneData的结构就像这样,使之简单的传递给着色器。 我们已经分别在位置0,1和2处获得了位置,纹理坐标和法线。 因此,我们配置的VAO来绑定位置3处的骨骼ID和位置4处的权重。请注意,我们使用glVertexAttribIPointer而不是glVertexAttribPointer来绑定ID非常重要。 原因是ID是整数而不是浮点。 注意这一点,否则您将在着色器中收到损坏的数据。