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

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

在Blender中使用骨骼动画的方法Blender是一款功能强大的开源三维建模和动画软件,它为用户提供了丰富的工具和功能。
其中,使用骨骼动画是Blender中非常重要的一部分,它可以使模型在动画过程中拥有更加自然和流畅的动作。
本文将介绍如何在Blender中使用骨骼动画的方法。
首先,我们需要导入一个具有骨骼结构的模型。
在Blender中,支持多种格式的模型导入,例如.obj和.fbx等。
选择一个你喜欢的模型,并将其导入到Blender中。
接下来,我们需要为模型添加骨骼。
在Blender中,骨骼是由一系列相互连接的骨节组成的。
我们可以通过选择模型中的一部分,然后按下Shift + A键来添加一个新的骨节。
重复此步骤,直到我们为模型添加完整的骨骼结构。
一旦我们添加了骨骼,我们需要将模型的各个部分与相应的骨骼关联起来。
在编辑模式下选择一个骨骼,然后选择我们想要关联的模型部分。
点击Ctrl + P键,选择"Armature Deform",然后选择"Automatic Weights"。
Blender将自动创建骨骼与模型之间的权重,以使模型的动作与骨骼相对应。
现在,我们可以开始动画制作的过程。
切换到动画模式,在时间轴上选择我们想要添加关键帧的时间点。
选择骨骼中的一个或多个关节点,并对其进行旋转、位移或缩放等操作。
然后点击"I"键,选择适当的关键帧类型(例如,Rotation、Location或Scale)。
这样就会在选择的时间点上创建一个关键帧。
我们可以通过在时间轴上选择其他时间点并对骨骼进行适当操作来创建更多的关键帧。
Blender将在不同的时间点自动插值并创建平滑过渡的动画效果。
此外,我们还可以使用图形编辑器来微调动画。
在图形编辑器中,可以看到每个关键帧的曲线图,以及动画的细节。
我们可以通过调整曲线图上的控制点来改变动画的速度和流畅度。
在进行骨骼动画制作时,还有一些额外的技巧可以提升动画效果。
3DMAX技术中的角色绑定与骨骼动画

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

Maya 4.0 骨骼动画-基本概念直线网通过激活具有大量关节的复杂模型,根据决定运动的几个主关节的最终角度可以确定骨架的运动,从而创建精确灵活的人物动画。
这是一项高级的动画技术。
这项动画技术要求运动的三维模型必须建成“分级结构”。
骨骼就是一种特定类型的“分级结构”,由不同运动约束墓亟诹映闪醋吹姆旨豆羌芙峁谷缤?13-1 所示。
这种分级骨架结构由许多采用分级方式分组的关键链构成,骨架与其周围的皮肤表面也是相连的。
骨骼的所有部分同时运动,但必须遵循特定的等级关系。
当对骨骼进行变换时,骨骼的等级关系阻止了部件向各个方向散开。
骨骼由根关节、一定数目的关节和反向运动学等级关系(IK Handles) 组成。
关节是骨骼中骨头与骨头之间的连接点。
每个关节可以有一个或多个骨头与之连接。
根关节(Root Joint) 是关节链第1 段的第 1 个关节,是关节链所有分段和关节的父母结构;父关节(Parent Joint) 可以是任意的关节,只要其下带有子关节(Child Joint) ,关节图示如图13-2 所示。
图13-1 骨骼图13-2 骨骼结构骨骼机构中的反向动力学手手柄,也称为末端效应器。
当移动骨骼中的反向动力学手手柄并实施了高级运动学技术时,就可以自动算出关节的转动。
例如,就胳膊伸出去操作按钮而言,运动的反向运动学手手柄应该放置在手上或者伸出的指尖上,这与事实是基本相符的。
● Joints Chains( 关节链) :关节链由一定数量的关节和连接于其上的骨头(Bone) 组成。
关节链中的关节是线性连接的,关节链的第 1 个关节是整个关节链中层次最高的关节如图13-3 所示。
图13-3 基本关节链形式● Limbs( 肢体链) :肢体链由一个或多个连接的关节链组成,肢体是一种树状结构,其中的骨节并不是线性的,而且链一般是从链中层次最高的关节开始的,如图13-4 所示。
图13-4 肢体链基本结构● Joint Tool( 关节工具) :该工具主要用于创建复杂的骨骼结构。
动设计中的角色骨骼动与变形技术

动设计中的角色骨骼动与变形技术在动画设计中,角色骨骼动与变形技术是非常重要的一种技术手段。
它通过对角色的骨架进行调整来实现角色的自然动作和变形,大大提升了动画的逼真度和表现力。
本文将详细介绍角色骨骼动与变形技术的原理和应用。
一、角色骨骼动与变形技术的原理在传统的动画制作中,角色的动作和变形是由动画师一帧一帧绘制完成的,耗时费力。
而角色骨骼动与变形技术则能够通过数学模型和计算机算法实现角色的动作和变形,极大地减少了制作成本和时间。
角色骨骼动与变形技术的原理主要基于以下几个要素:1. 骨骼结构:角色的骨骼结构是由一系列的骨骼节点构成的,每个节点有自己的位置和旋转信息。
这些节点组成了一个层级结构,根据节点之间的连接关系形成一个骨架。
2. 权重绑定:角色的骨骼与角色模型的各个顶点进行关联,通过权重绑定的方式确定每个顶点受到哪些骨骼的影响,进而确定顶点的运动方式。
3. 动画关键帧:角色的动作是通过关键帧的方式描述的,每个关键帧包含了角色在某个时间点上的位置和姿态信息。
4. 插值计算:通过对关键帧之间的插值计算,可以得到每一帧的角色位置和姿态信息,进而实现动画的平滑过渡。
角色骨骼动与变形技术在动画制作中有着广泛的应用,下面将介绍其中的几个方面。
1. 角色动作制作角色动作制作是角色骨骼动与变形技术的主要应用之一。
通过设置关键帧和插值计算,动画师可以制作出各种各样的角色动画,包括行走、跳跃、奔跑等各种动作。
同时,还可以通过改变骨骼节点的位置和旋转来制作更加复杂的动作,如角色的挥动手臂、转动腰部等。
2. 角色变形角色的变形是角色骨骼动与变形技术的另一个重要应用领域。
通过调整角色骨骼节点的位置和旋转,可以实现角色的各种变形效果,如人物的拉伸、收缩、扭曲等。
这为角色的表现力提供了更多可能性。
3. 特殊效果制作角色骨骼动与变形技术还可以用于制作各种特殊效果,如爆炸、变身等。
通过调整角色的骨骼节点,可以高效地制作出各种精彩的特效,增加动画的视觉冲击力和观赏性。
骨骼动画具体解释

⾻骼动画具体解释近期,再次研究其⾻骼动画,发现这篇⽂章讲的相当不错,通俗易懂,⾮常好的学习资源。
⾻骼蒙⽪动画(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在电影、游戏、建筑和广告等领域有着广泛的应用。
在创作三维角色和动画时,角色绑定和骨骼动画是至关重要的环节,能够使角色动作更加自然、流畅。
本文将详细介绍3Dmax中的角色绑定和骨骼动画的步骤和技巧。
一、角色绑定的步骤:1. 导入模型:首先,将角色模型导入3Dmax软件中。
可以通过点击“文件”菜单中的“导入”选项来实现此操作。
2. 创建骨架:接下来,需要在角色模型上创建骨架。
选择“创建”菜单中的“帮助器”选项,然后选择“骨骼”。
在模型上点击鼠标左键,依次创建骨骼的关节。
3. 调整骨骼:创建骨骼之后,需要根据角色的需要对骨骼进行调整。
可以通过移动、旋转或缩放关节来实现。
这样可以使骨骼更加符合角色的形态和动作。
4. 精细调整:在进行更精确的调整时,可以使用“层脚手架”和“Apose”工具。
层脚手架是一种工具,可以对骨骼进行更复杂的调整和修建,使其更准确地匹配角色模型。
而Apose工具则可以帮助用户对骨骼进行更精细的动作调整。
二、角色骨骼动画的技巧:1. 动画关键帧的设置:通过设置关键帧来定义角色的动画行为。
在时间轴中选择一个时间点,然后调整角色的姿势或位置。
接着,点击时间轴上的红色圆形按钮,将该姿势或位置设为关键帧。
可以通过添加多个关键帧来形成连续的动画效果。
2. 动画曲线调整:通过调整动画曲线,可以让角色的动作更加流畅自然。
最常用的曲线是曲线编辑器中的“欧拉角度曲线”。
在欧拉角度曲线中,可以对角色的旋转和姿势进行调整,使动作更加流畅。
3. 人物运动的物理模拟:对于角色的物理模拟,可以使用3Dmax中的“动力学系统”来达到更真实的效果。
通过给角色添加物理属性和限制器(如碰撞体和刚体关系),可以让角色的运动更加逼真,并与其他对象进行交互。
4. 动画渲染:在完成角色骨骼动画后,需要将其渲染成最终的动画效果。
在“渲染设置”中,可以选择渲染的分辨率、图像格式等参数。
使用Blender进行角色动画制作 骨骼和约束技术详解
使用Blender进行角色动画制作:骨骼和约束技术详解在动画制作领域,Blender是一个功能强大且广受欢迎的软件。
本文将深入介绍Blender中的角色动画制作过程,重点关注骨骼和约束技术。
骨骼是角色动画制作的核心组成部分。
它们为角色提供了骨架和运动控制。
在Blender中,骨骼通过一系列的骨头(bone)连接起来,形成一个完整的骨架。
要创建骨骼系统,首先需要选择一个角色,并在“物体数据”选项卡中添加一个“骨骼”(Armature)。
当骨骼添加完成后,可以通过选择骨骼中的一个骨头,进入编辑模式。
在编辑模式下,可以对骨头进行移动、旋转和缩放等操作,以构建出具体的骨骼形状。
通过这样的操作,可以根据角色的需要定制出独特的骨骼系统。
接下来,需要将角色的模型与骨骼系统进行绑定。
在3D视图中选择角色的模型,然后选择骨骼,按下Ctrl+P键,选择“自动权重(Automatic Weights)”。
Blender会基于角色的几何形状和骨骼的位置自动分配权重,使得模型与骨骼形成绑定关系。
一旦完成骨骼的设置和绑定,就可以开始进行角色的动画制作。
在Blender中,可以通过关键帧(Keyframe)来记录角色在不同时间点上的动作。
要创建关键帧,首先需要选择角色的某个骨头,然后进入动画编辑器(Animation Editor)。
在动画编辑器中,可以查看和编辑角色的动画曲线。
通过在时间轴上选择不同的时间点,然后对角色进行移动、旋转或缩放等操作,可以创建关键帧。
Blender会自动根据关键帧之间的差异计算并插入中间帧,形成流畅的动画效果。
除了基本的关键帧动画,Blender还提供了丰富的约束(Constraint)技术,用于进一步控制角色的动作。
约束可以将一个对象的动作限制在一定的范围内,或者将一个对象的动作与另一个对象关联起来。
在Blender中,可以使用各种约束来实现复杂的动画效果。
例如,“限制跟随”(Limit Location)约束可以限制某个骨头的移动范围,避免超出设定的边界。
3DMAX技术中角色动画的骨骼绑定与控制方法
3DMAX技术中角色动画的骨骼绑定与控制方法3DMAX技术中角色动画的骨骼绑定与控制方法在3DMAX软件中,角色动画是一项重要的技术应用,其中骨骼绑定与控制方法起着关键作用。
本文将详细介绍使用3DMAX进行角色动画时的骨骼绑定与控制方法,帮助读者进一步了解和掌握这一技术。
一、概述骨骼绑定是将角色模型的骨骼系统与其相应的皮肤或模型网格进行关联的过程。
而控制方法则指的是通过对骨骼进行控制,使角色模型在动画中实现不同的动作效果。
二、骨骼绑定1. 创建骨骼系统在3DMAX中,首先需要创建骨骼系统。
可以通过选择“Create”菜单中的“Systems”子菜单,然后选择“Bones”选项来创建一个骨骼。
接着,在视图中点击鼠标左键来设置骨骼的位置和方向,将骨骼连接成需要的层次结构。
2. 绑定皮肤或模型网格在创建完骨骼系统后,需要将其与相应的皮肤或模型网格进行绑定。
选中骨骼系统,然后选择菜单栏上的“Modify”选项,找到“Skin”或“EditPoly”选项,点击“Attach to Object”按钮,选择相应的皮肤或模型网格进行绑定。
3. 调整骨骼权重一般情况下,绑定后的角色模型可能会出现一些畸变现象,需要调整骨骼的权重,使其更贴合模型。
可以通过调整骨骼的权重值来实现,权重值越大,模型对该骨骼的运动越敏感。
在3DMAX中,可以使用“Edit Envelopes”或“Edit Polygons”工具来进行调整。
三、控制方法1. 使用关键帧动画法关键帧动画法是最基础且常用的控制方法之一。
通过在动画的起始和结束位置设置关键帧,然后在关键帧之间进行插值计算,使得角色模型能够流畅地完成动作过渡。
2. 使用路径动画法路径动画法是一种基于路径运动的控制方法。
可以通过创建路径曲线,然后将角色模型与路径进行绑定,使得角色沿着路径进行运动。
在3DMAX中,可以使用“Path Constraint”选项进行路径动画的设定。
3. 使用IK反向动力学IK反向动力学是一种模拟人体关节运动的控制方法。
骨骼动画原理
骨骼动画原理骨骼动画是一种基于骨骼系统的动画技术,它可以模拟人体或其他生物的运动,使得角色在动画中更加真实和生动。
骨骼动画原理是指通过对角色的骨骼结构进行建模和控制,实现角色的动作和表情。
在本文中,我们将深入探讨骨骼动画的原理及其应用。
首先,骨骼动画的核心是骨骼系统。
骨骼系统由骨骼、关节和控制器组成,它们共同构成了角色的骨骼结构。
骨骼是角色的骨架,关节连接了不同的骨骼,而控制器则用于控制骨骼的运动。
通过对骨骼系统的建模和控制,可以实现角色的各种动作,如行走、奔跑、跳跃等。
其次,骨骼动画的原理是基于关键帧动画。
关键帧动画是一种基于关键帧的动画技术,它通过设置关键帧来控制角色的动作。
在骨骼动画中,动画师首先确定角色在动画序列中的关键动作,然后在这些关键帧上设置角色的姿势和表情。
系统会根据这些关键帧自动计算出中间帧,从而实现角色的流畅运动。
另外,骨骼动画还涉及到皮肤绑定技术。
皮肤绑定是将角色的皮肤与骨骼系统进行绑定,使得角色的皮肤能够跟随骨骼的运动而变形。
这种技术可以使角色在动画中呈现出更加真实的外观,同时也方便动画师对角色的表情和姿势进行调整。
最后,骨骼动画的应用非常广泛。
它被广泛应用于电影、电视、游戏等领域,成为了现代动画制作的重要技术之一。
通过骨骼动画,动画师可以轻松地制作出各种生动的角色动画,为观众带来更加精彩的视听体验。
总之,骨骼动画是一种基于骨骼系统的动画技术,它通过对角色的骨骼结构进行建模和控制,实现角色的动作和表情。
骨骼动画的原理是基于关键帧动画和皮肤绑定技术,它的应用非常广泛,成为了现代动画制作的重要技术之一。
希望本文能够帮助读者更加深入地了解骨骼动画的原理及其应用。
- 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 V AOglGenVertexArrays(1, &m_V AO);glBindVertexArray(m_V AO);// 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 V AO is not changed from the outsideglBindVertexArray(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);glEnableV ertexAttribArray(BONE_ID_LOCATION);glVertexAttribIPointer(BONE_ID_LOCA TION, 4, GL_INT, sizeof(VertexBoneData), (const GLvoid*)0);glEnableV ertexAttribArray(BONE_WEIGHT_LOCATION);glVertexAttribPointer(BONE_WEIGHT_LOCATION, 4, GL_FLOAT, GL_FALSE, sizeof(VertexBoneData), (const GLvoid*)16);...}上面的结构包含了我们在顶点级别所需要的一切,默认情况下,我们有足够的存储空间用于四个骨骼(每个骨骼的ID和权重)。