模型的骨骼动画技术讲解
三维度模型的骨骼动画是如何融合的?

三维度模型的骨骼动画是如何融合的?一、骨骼动画的基本原理骨骼动画是一种基于骨骼及关节约束的动画技术,通过在三维模型上设置骨骼,使其能够模拟人体或物体的运动。
它的基本原理是通过对骨骼的运动路径进行插值计算,得到连续的运动轨迹,并将其应用于三维模型的每个顶点上,从而实现模型的动态变化。
二、骨骼动画的三维度融合1. 时序融合时序融合是指将多个骨骼动画的时间轴进行融合,使得它们能够在同一时间段内协同工作。
这样可以实现更加复杂的动画效果,例如一个人物同时进行走路和挥手的动作。
2. 动作融合动作融合是指将多个骨骼动画的具体动作进行融合,使得它们能够同时在一个三维模型上展现出来。
这种融合方式可以实现更加自然、流畅的动画效果,让角色的动作更加生动。
3. 形变融合形变融合是指将不同骨骼动画的模型形态进行融合,使得它们能够在一个三维模型上共同存在。
这种融合方式可以实现角色的形态变化,例如从一个人变成一只动物的过程。
三、骨骼动画的技术实现1. 关键帧插值算法关键帧插值算法是骨骼动画中最基本的技术之一,它通过在关键帧上设置骨骼的位置、旋转信息,再根据关键帧之间的时间差进行插值运算,得到平滑的动画过渡。
2. 蒙皮技术蒙皮技术是指将骨骼与三维模型表面进行绑定,使得骨骼运动能够影响到模型的形状。
通过蒙皮技术,三维模型可以根据骨骼的运动而产生相应的形变,从而实现逼真的动画效果。
3. 逆运动学算法逆运动学算法是一种用于计算关节角度的技术,它可以根据期望的末端位置,逆向计算出骨骼的旋转角度。
逆运动学算法在角色动作设计和动画控制方面起到了重要的作用。
四、骨骼动画的应用领域1. 游戏开发骨骼动画在游戏开发中得到了广泛的应用。
通过骨骼动画技术,游戏中的角色可以实现更加逼真的运动和互动,增强了游戏的可玩性和表现力。
2. 影视制作骨骼动画也是影视制作中不可或缺的一部分。
通过骨骼动画技术,可以为影视作品中的虚拟人物赋予生命,使其具有自然的动作和表情。
3DMAX技术中的角色绑定与骨骼动画

3DMAX技术中的角色绑定与骨骼动画3DMAX技术中的角色绑定与骨骼动画角色绑定是3DMAX中常用的技术之一,它能够将角色的骨骼系统与模型绑定在一起,使角色能够实现更加真实的动作表达。
骨骼动画则是通过对角色骨骼进行动画控制,制作出流畅自然的动作效果。
本文将探讨3DMAX技术中的角色绑定与骨骼动画的相关知识与应用。
一、角色绑定的基本原理与步骤角色绑定是将角色模型与骨骼系统进行关联的过程。
在3DMAX中,角色模型一般由多个网格对象构成,每个网格对象代表角色的一个部位,如头、身体、手臂等。
而骨骼系统则由多个节点组成,每个节点代表一个骨骼,它们的层级关系与真实人体的骨骼系统相似。
角色绑定的基本步骤如下:1. 导入角色模型和骨骼系统:首先需要导入创建好的角色模型和骨骼系统,确保它们位于同一场景中。
2. 设置角色模型的权重:在3DMAX中,每个网格对象都可以设置权重值,用于控制该部位与骨骼之间的关联程度。
通常,与骨骼距离较近的网格对象应该设置较高的权重值,以实现更加真实的动作效果。
3. 绑定角色模型与骨骼系统:通过选中网格对象和对应骨骼节点,进入绑定操作界面,将每个网格对象与骨骼进行关联。
绑定完成后,角色模型就能够跟随骨骼系统的动作而变化。
二、骨骼动画的制作过程骨骼动画是通过对角色骨骼进行动画控制来实现的,其制作过程如下:1. 创建关键帧:在时间轴上选择合适的时间点,设置角色骨骼的姿态,并创建关键帧。
关键帧是指在动画中起到关键作用的帧,通过设置多个关键帧,就可以实现角色骨骼在不同时间点上的不同姿态。
2. 设置插值方式:在关键帧之间,需要通过插值方式来平滑地过渡。
3DMAX中常用的插值方式有线性插值、贝塞尔插值等。
不同的插值方式会产生不同的动画效果,可以根据需求进行选择。
3. 调整动画曲线:在关键帧上,可以通过调整动画曲线的形状来改变角色骨骼的运动轨迹和速度。
通过对曲线的调整,可以制作出更加流畅自然的动画效果。
unity 骨骼蒙皮 原理

unity 骨骼蒙皮原理Unity是一款强大的游戏引擎,它支持多种开发平台和技术,其中骨骼蒙皮是其重要功能之一。
骨骼蒙皮是一种常见的角色动画技术,通过将3D模型的骨骼与皮肤进行绑定,实现角色的动态变换和变形。
本文将介绍Unity中骨骼蒙皮的原理及其实现方式。
在Unity中,骨骼蒙皮是通过骨骼动画系统来实现的。
骨骼动画系统由两个主要组件组成:骨骼和蒙皮。
骨骼是模型的骨骼结构,它由一系列关节和骨骼连接而成。
蒙皮是模型的皮肤,它定义了模型的外观和形状。
骨骼蒙皮的原理是将骨骼和蒙皮进行绑定,并通过骨骼动画系统来控制骨骼的变换,从而实现模型的动态变形。
具体步骤如下:1. 创建骨骼:首先需要创建模型的骨骼结构。
在Unity中,可以使用骨骼工具或者通过导入模型文件来创建骨骼。
2. 绑定骨骼和蒙皮:将模型的蒙皮与骨骼进行绑定。
在Unity中,可以通过选择模型和骨骼,然后使用"蒙皮"工具来进行绑定。
3. 设置权重:为了实现模型的平滑变形,需要为每个顶点设置与骨骼关联的权重。
权重决定了每个顶点受到骨骼变换的影响程度。
在Unity中,可以使用"蒙皮"工具来设置权重。
4. 控制骨骼变换:通过骨骼动画系统来控制骨骼的变换。
可以通过在时间轴上设置关键帧来控制骨骼的位置、旋转和缩放等属性。
5. 更新蒙皮:当骨骼变换时,需要更新蒙皮以反映模型的变化。
在Unity中,可以通过脚本或动画控制器来实现蒙皮的更新。
骨骼蒙皮在游戏开发中具有广泛的应用。
它可以用于实现角色的动态变形、骨骼动画和物理模拟等效果。
通过调整骨骼和权重的设置,可以实现各种复杂的动画效果,如角色行走、跳跃、攻击等。
此外,骨骼蒙皮还可以与其他技术相结合,如粒子系统、光照和特效等,以增强游戏的视觉效果。
总结来说,Unity中的骨骼蒙皮是一种重要的角色动画技术,通过将骨骼和蒙皮进行绑定,并通过骨骼动画系统来控制骨骼的变换,实现模型的动态变形和动画效果。
骨骼动画具体解释

⾻骼动画具体解释近期,再次研究其⾻骼动画,发现这篇⽂章讲的相当不错,通俗易懂,⾮常好的学习资源。
⾻骼蒙⽪动画(Skinned Mesh)的原理解析(⼀)⼀)3D模型动画基本原理和分类3D模型动画的基本原理是让模型中各顶点的位置随时间变化。
主要种类有Morph动画,关节动画和⾻骼蒙⽪动画(Skinned Mesh)。
从动画数据的⾓度来说,三者⼀般都採⽤关键帧技术,即仅仅给出关键帧的数据,其它帧的数据使⽤插值得到。
但因为这三种技术的不同,关键帧的数据是不⼀样的。
Morph(渐变,变形)动画是直接指定动画每⼀帧的顶点位置,其动画关键中存储的是Mesh全部顶点在关键帧相应时刻的位置。
关节动画的模型不是⼀个总体的Mesh,⽽是分成⾮常多部分(Mesh),通过⼀个⽗⼦层次结构将这些分散的Mesh组织在⼀起,⽗Mesh带动其下⼦Mesh的运动,各Mesh中的顶点坐标定义在⾃⼰的坐标系中,这样各个Mesh是作为⼀个总体參与运动的。
动画帧中设置各⼦Mesh相对于其⽗Mesh的变换(主要是旋转,当然也可包含移动和缩放),通过⼦到⽗,⼀级级的变换累加(当然从技术上,假设是矩阵操作是累乘)得到该Mesh在整个动画模型所在的坐标空间中的变换(从本⽂的视⾓来说就是世界坐标系了,下同),从⽽确定每⼀个Mesh在世界坐标系中的位置和⽅向,然后以Mesh为单位渲染就可以。
关节动画的问题是,各部分Mesh中的顶点是固定在其Mesh坐标系中的,这样在两个Mesh结合处就可能产⽣裂缝。
第三类就是⾻骼蒙⽪动画即Skinned Mesh了,⾻骼蒙⽪动画的出现攻克了关节动画的裂缝问题,并且效果很酷,发明这个算法的⼈⼀定是个天才,由于Skinned Mesh的原理简单的难以置信,⽽效果却那么好。
⾻骼动画的基本原理可概括为:在⾻骼控制下,通过顶点混合动态计算蒙⽪⽹格的顶点,⽽⾻骼的运动相对于其⽗⾻骼,并由动画关键帧数据驱动。
⼀个⾻骼动画通常包含⾻骼层次结构数据,⽹格(Mesh)数据,⽹格蒙⽪数据(skin info)和⾻骼的动画(关键帧)数据。
3Dmax角色动画教程:使用骨骼系统制作动画

3Dmax角色动画教程:使用骨骼系统制作动画3Dmax是一款常用的三维建模和动画制作软件,骨骼系统是其中一个重要的功能,它使用户能够创建逼真的角色动画。
下面将为大家介绍使用骨骼系统制作动画的步骤和方法。
1. 准备工作在开始制作动画之前,首先需要准备好所需的角色模型。
可以使用已有的模型,也可以自己创建一个新的模型。
确保模型的骨骼结构是正确的,可以顺利进行动画制作。
2. 创建骨骼结构打开3Dmax软件,选择角色模型并切换到编辑模式。
在“创建”菜单中选择“系统”并选择“骨骼”。
在视图窗口中,用鼠标点击角色模型的关节位置来创建骨骼。
3. 设置骨骼约束为了使骨骼能够正确控制角色模型的各个部分,需要设置骨骼约束。
选择一个骨骼,在属性编辑器中找到“IK Solver”选项。
将其设置为“Position-Only”或者“Full-Body”,这取决于你的需要。
然后设置骨骼的旋转约束来确保角色模型的部分只能在特定的角度范围内移动。
4. 添加控制器为了更方便地控制角色模型的动作,可以为骨骼添加控制器。
选择一个骨骼,在“创建”菜单中选择“系统”并选择“器官”。
在视图窗口中,用鼠标点击控制器的位置来创建一个控制器。
将控制器与骨骼相连,可以通过拖拽的方式将它们连接起来。
这样,就可以通过控制器来控制骨骼的运动。
5. 动画制作完成骨骼系统的设置后,就可以开始制作动画了。
在时间轴上选择一个合适的起始帧,然后对角色模型的各个骨骼进行调整,产生所需的动画效果。
可以使用旋转、位移、缩放等功能来调整骨骼的位置和姿态。
通过逐帧的调整和变换,产生出一个完整的动画序列。
6. 添加关键帧为了保持动画的流畅性,还需要添加一些关键帧。
选择一个合适的帧,在时间轴上对角色模型的骨骼进行调整,并在时间轴上添加关键帧。
然后再选择另一个帧,继续对骨骼进行调整,并添加关键帧。
通过在关键帧之间插入中间帧,可以让动画过渡更加自然。
7. 调整动画曲线在制作动画过程中,可能会出现一些不符合预期的效果,例如动作太快或者太慢。
制作角色动画 Blender中的骨骼绑定技术

制作角色动画:Blender中的骨骼绑定技术Blender是一款功能强大的开源三维建模和动画软件。
在Blender中,骨骼绑定技术是制作角色动画的关键步骤之一。
骨骼绑定技术通过将角色的模型与骨骼系统连接起来,使得我们可以对角色进行骨骼控制,实现自然流畅的动作。
1. 导入角色模型打开Blender软件,选择文件-导入-选择你要使用的角色模型文件。
在导入之前,确保你已经准备好了你的角色模型文件。
导入后,你会看到角色的静态模型出现在Blender的视窗中。
2. 创建骨骼系统现在,我们将创建骨骼系统。
点击3D视图的左上角,选择“Create”菜单然后选择“Armature”。
然后,你将会看到一个骨骼显示在视窗中。
可以通过平移、旋转和缩放工具对骨骼进行调整,使其与你的角色模型匹配。
3. 绑定骨骼到角色模型一旦你创建了骨骼系统,接下来就是将骨骼绑定到角色模型上。
选择你的角色模型,然后按住Shift键再选择骨骼。
最后,点击右键选择“Parent”菜单中的“Armature Deform”选项。
4. 调整权重绑定之后,你可能会发现角色模型在一些部分出现扭曲或变形。
这是因为骨骼在影响模型时,默认权重并不完美。
要修复这个问题,你需要调整权重。
选择角色模型,然后切换到“Weight Paint”模式。
这个模式下,你可以使用画刷工具设置每个顶点的权重。
通过画刷来涂抹不同强度的权重,使得骨骼对模型的影响更加平滑和自然。
你可以使用不同的画刷大小和强度,在不同的部位绘制不同的权重。
在权重调整期间,你可以通过使用快捷键“Tab”来在编辑和对象模式之间切换。
这样你可以方便地切换回来查看效果。
5. 进行骨骼动画一旦你完成了权重调整,你就可以开始制作角色动画了。
通过选择骨骼系统,然后切换到“Pose”模式,你就可以对骨骼进行动作变换了。
通过对骨骼进行旋转、平移、缩放等操作,你可以设置关键帧,逐步创建角色的动作。
在每个关键帧上,你可以调整角色的姿势,并设置适当的过渡效果以实现平滑的动画。
让模型动起来 Blender骨骼动画基础教程

让模型动起来:Blender骨骼动画基础教程骨骼动画是Blender软件中一项重要的功能,可以为模型添加生动的动作效果。
通过在模型上创建骨骼系统,并将骨骼与模型关联起来,我们可以实现各种各样的动画效果。
本文将介绍Blender软件中骨骼动画的基础知识和使用技巧。
首先,打开Blender软件并导入你的模型。
在选择模式下,选择骨骼模式,创建一个新的骨骼系统。
你可以使用Shift + A组合键或点击菜单中的“添加”按钮来添加骨骼。
在编辑模式下,你可以对骨骼进行调整和修改。
接下来,将骨骼与模型关联起来。
在选择模式下,选择你的模型并按住Shift键选择骨骼。
然后点击菜单中的“关联”按钮或使用Ctrl + P组合键来关联骨骼和模型。
你可以选择不同的关联方式,例如空间或权重等。
现在,你可以开始创建动画了。
切换至动画模式,选择你需要调整的关节,例如腿或手臂。
通过选择关节,你可以对其进行旋转、平移或缩放等操作。
使用关键帧来记录关节的不同状态。
在时间轴上选择一个关键帧,然后对关节进行调整,再次点击“关键帧”按钮或使用I键来生成新的关键帧。
你可以使用时间轴和关键帧来控制动画的时间和播放速度。
在时间轴上选择关键帧并拖动它,可以调整动画中关键帧的位置和时间。
通过增加和删除关键帧,你可以调整动画的长度和细节。
除了基本的关节运动,你还可以为骨骼添加其他的效果和约束。
例如,你可以添加IK约束来实现更自然的运动,或者使用形变器来调整模型的外观。
在调整动画时,你可以使用Blender软件提供的各种工具和选项。
例如,你可以使用Graph Editor来调整关键帧之间的过渡效果,使用Dope Sheet来管理和编辑关键帧,使用Pose Library来保存和应用不同的关节姿势等。
当你完成了动画的创建和调整后,你可以导出它以便在其他项目或软件中使用。
Blender软件支持多种导出格式,例如FBX、OBJ和Collada等。
选择适合你需求的格式并导出动画,并确保选择正确的导出选项。
3Dmax中骨骼动画的调整与编辑技巧

3Dmax中骨骼动画的调整与编辑技巧骨骼动画是3Dmax中非常重要的一项技术,可以用于模拟人体或动物的运动,使得角色动画更加逼真。
在进行了骨骼绑定和动画制作之后,我们有时需要对动画进行调整和编辑,以使得动画效果更加自然和流畅。
下面将介绍一些在3Dmax中调整和编辑骨骼动画的技巧。
一、关键帧编辑1. 定义关键帧:在动画时间线上选择关键帧帧数,通过修改关键帧的属性值来调整动画效果。
可以使用虚线框选多个关键帧进行同时编辑。
2. 插入关键帧:在指定的帧上插入新的关键帧,通过移动或旋转骨骼来调整动画效果。
3. 删除关键帧:选中要删除的关键帧,按下Delete键,或者使用右键菜单中的删除选项来删除关键帧。
二、姿势编辑和调整1. 姿势编辑器:点击3Dmax界面上的“Motion”选项卡,在下拉菜单中选择“姿势编辑器”,可以打开姿势编辑器面板。
2. 多个关键帧之间的平滑过渡:在姿势编辑器中,选择多个关键帧,点击“Interpolation”按钮,选择“Smooth”来使得多个关键帧之间的过渡更加平滑。
3. 关键帧之间的过渡曲线调整:在时间线中选中多个关键帧,右键点击选择“曲线编辑器”来调整关键帧之间的过渡曲线。
可以通过调整曲线来改变动画的速度和平滑度。
三、动画的缩放和偏移1. 动画缩放:选中要缩放的关键帧或者骨骼,点击“Scale”工具,按住鼠标左键并向内或向外拖动,来缩放动画的时间。
可以将动画加快或者放慢。
2. 动画偏移:选中要偏移的关键帧或者骨骼,点击“Move”工具,按住鼠标左键并向左或向右拖动,来调整动画的开始时间。
可以使得动画开始的时间提前或者延后。
四、动画修复和糟粕删除1. 重新安排关键帧:选中需要重新安排的关键帧或者骨骼,点击“Move”工具,在时间线上选择一个新的位置来重新安排关键帧的顺序。
2. 删除糟粕关键帧:选中要删除的糟粕关键帧,按下Delete键,或者使用右键菜单中的删除选项来删除关键帧。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
模型的骨骼动画技术讲解骨骼动画实际上是两部分的过程。
第一个由美术执行,第二个由程序员(或者你写的引擎)执行。
第一部分发生在建模软件中,称为建模。
这里发生的是术定义了网格下面骨骼的骨架。
网格代表物体(无论是人类,怪物还是其他物体)的皮肤,骨骼用于移动网格物体,以模拟现实世界中的实际运动,这通过将每个顶点分配给一个或多个骨头来完成。
当顶点被分配给骨骼时,定义了权重,该权重确定骨骼在移动时对顶点的影响量。
通常的做法是使所有权重的总和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 VAOglGenVertexArrays(1, &m_VAO);glBindVertexArray(m_VAO);// Create the buffers for the vertices attributesglGenBuffers(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<VertexBoneData> 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和权重)。