骨骼动画

2024-10-10

骨骼动画(共5篇)

骨骼动画 篇1

骨骼动画(bones animation)的基本原理就是通过改变原有动画骨骼位置以及移动原动画朝向的方式生成新动画模型的模式。在骨骼动画当中,骨骼是一切的基础点,并且该技术随着近年来的不断完善,已经成为使用率最高且范围最广的一种动画技术。

一、骨骼动画的优缺点

随着科学技术的不断发展,骨骼动画已经悄然成为渲染3D角色模型的关键技术之一,并且在实际使用中,骨骼运动角色造型的真实感比较强。骨骼动画对处理器性能的要求极高,磁盘空间占用量比较小,所以可以更加便捷地创造模型。与传统的单一网格模型动画相比,骨骼动画更加灵活、逼真,克服了关节动画当中存在的接缝问题。骨骼动画只需要储存骨骼的变换数据即可,不必在所有帧当中储存顶点数据,不同骨骼动画都可以放到一起使用,部分引擎可以实现单体骨骼操作,使角色与环境更好地融入到一起[1]。

虽然骨骼动画的优点比较多,但是技术难度也相对比较高,但只要掌握了骨骼动画技术,在创建个人角色动画时,都不需要再次地模拟几何图形数据。骨骼动画的产生打破了传统工作模式,不需要提前进行预处理,可以在游戏运行过程中对动画进行计算,让动画效果在游戏中显得更加真实。并不是所有的引擎都支持骨骼动画,因为骨骼动动画必须要有大量的计算,所以给中央处理器带来的负担比较大,容易产生系统利用率不均衡等问题,降低骨骼动画绘制效率。该问题可以伴随CPU技术的不断发展而解决[2]。

二、CPU 视角下的骨骼动画技术难点

骨骼动画包含了骨骼动画原理、骨骼动画创作、骨骼动画载入、骨骼动画实时驱动、骨骼动画优化处理以及骨骼动画设计实现等多方面内容,本文将对设计实现进行研究。

(一)顶点结构体

骨骼空间顶点的局部坐标数组当中所有的记录都应当记载在骨骼子空间局部坐标位置,相对应的骨骼空间顶点法线数组也应该记录在法线的坐标中。保存这两种数据,可以便于后期预处理,因为在骨骼动画计算时,单个骨骼的变换运算均是由局部坐标衍生而来的,所以可以通过预处理的方式保存这些数据,减少运算步骤[3]。将属性相同的顶点作为一个子对象,再将相同材质顶点放在相同的索引组当中,对其中所有骨骼点进行记录,记录父骨骼点,通过数组的方式来保存骨骼层次的信息。通常情况下骨骼点均在256个以下,所以可以用256单字节数组来实现骨骼设计[4]。

(二)关键函数与动画数据载入管理

在TSkeleton Mesh分类中,deform Bone是比较重要的函数之一,将其传入到当前骨骼信息中,更新顶点。动画数据不仅是关键帧当中的数据,还包含了所有帧的信息,通过自定义的方式来明确数据结构,保存所有帧当中存在的关键信息。对TBone Anim Channel类型的动画数据进行设计,保存骨骼当中存在的关键帧信息,使用关键帧插值的方式来实现计算功能。可以通过获取最接近关键帧或者是获取两个最接近关键帧插值获取的方式来收获关键帧。对于完整的动画来说,可以通过设计TSkeleton Anim来管理其中存在的所有单体动画。该种类当中存在的get Key Frm Bone Nearest和getKey Frm Bone Linear才是获取关键帧数据的关键点,通过调节所有TBone Anim Channel对象get Key Frame Nearest的方式来实现关键帧数据获取,提升骨骼动画质量[5]。

(三)驱动实现

想要保证驱动骨骼动画,首先要将相关结构使用在模型数据以及动画数据的管理当中。其中,_posture Linear、calu Bone Refs以及deform是最为关键的函数,两者的功能侧重于计算在当前发展情况下如何变换以及更新骨骼局部以及如何去改善全局变换矩阵能力,保证更新顶点功能的正常发挥。驱动流程需要从多个环节进行优化。可以通过prev Translate对是否要更新新平移信息进行研究,结合ahs Changed对信息内部产生的改变进行记录,以便于让顶点可以更好地进行简化运算,缩短运算环节与不必要工作时间,提升工作效率。

摘要:本文从骨骼动画技术在我国的发展情况入手,介绍一些与骨骼动画相关的知识,分析骨骼动画原理及其存在的优点与缺点,结合对骨骼动画的认识,浅谈骨骼动画技术。

关键词:网络模型,骨骼动画

骨骼动画 篇2

选点工具。可用鼠标点选也可以在工作区中拖出一个矩形框圈选多点,可以配合shift键进行多次选择。位移工具。对选择的点或是圈选的多点进行位置的位动,对单点的位动可以改矢量图形的外观形状。缩放工具。对圈选的矢量图形进行缩放变化。旋转工具。对圈选的矢量图形进行旋转变化。加点工具。增加矢量图形的关键点,也可用于描画矢量图形。删点工具。删除矢量图形的关键点。画矩形工具。在工作区中拖画出矩形矢量图形,

配合shift键可以画出标准的正方形画椭圆形工具。在工作区中拖画出椭形矢量图形。配合shift键可以画出标准的正圆正形。曲线调整。调整关键点或矢量图形中的曲线。噪声调整。对矢量图形进行随机的噪声曲线调整。水平扭曲。对矢量图形进行水平方向的扭曲调整。垂直扭曲。对矢量图形进行垂直方向的扭曲调整。freehand画笔工具。用于描绘矢量图形的外部轮廓。层位移工具。用于移动当前层位置的工具。层缩放工具。用于缩放当前层大小的工具层旋转工具。用于旋转当前层角度的工具。设置中心点。设置矢量图形的中心点。尖锐工具。使矢量图形的轮廓变得尖锐。圆滑工具。使矢量图形的轮廓变得光滑。水平翻转。对选定的矢量图形进行水平翻转。垂直翻转。对选定的矢量图形进行垂直翻转。手型工具。工作区域位移工具。注意与和相区别。放大镜工具。对选区进行放大或缩小观察的工具。注:对图形的放大或缩小时通过鼠标在屏幕中拖动实现的,这一点与其它软件使用有所不同。

★ 动画系工作计划书

★ 神奇的探险之旅作文

★ 工作区的工作总结

★ 神奇的探险之旅想象作文

★ 神奇的探险之旅优秀作文

★ 神奇的探险之旅五年级作文

★ 神奇的探险之旅小学作文

★ 神奇的探险之旅的作文400字

★ 神奇的探险之旅300字作文

骨骼蒙皮动画设计与实现 篇3

骨骼蒙皮动画技术是到目前为止使用最为广泛的实时角色动画技术。骨骼蒙皮动画技术的核心思想是用一系列的骨骼带动一张皮肤来产生动画, 实现的方法是用一个已定义的角色模型的骨骼序列驱动这个角色模型的网格以产生动画, 骨架层由人体关节以及关节之间的骨骼段构成, 它表示人体的基本结构, 一般使用树状关节链表示;皮肤层是用平面片或曲面片组成的三维表面网格, 即皮肤网格, 最常见的是由三角形面片组成的皮肤网格。

2. 骨骼蒙皮动画技术简介

在骨骼蒙皮动画中, 一个角色由作为皮肤的单一网格模型和按照一定层次组织起来的骨骼组成。骨骼层次描述了角色的结构, 就像关节动画中的不同部分一样, 骨骼蒙皮动画中的骨骼按照角色的特点组成一个层次结构。相邻的骨骼通过关节相连, 可以作相对运动。通过改变相邻骨骼间的夹角、位移, 角色就可以做出不同的动作, 实现不同的动画效果。皮肤则作为一个网格蒙在骨骼之上, 规定角色的外观。皮肤上每个顶点受到一块或多块骨骼的影响, 不同的骨骼按照与顶点的几何、物理关系确定对该顶点的影响权重, 这一权重可以通过建模软件计算, 也可以手工设置。通过计算影响该顶点的不同骨骼对它影响的加权, 就可以得到该顶点在世界坐标系中的正确位置。动画文件中的关键帧一般保存着骨骼的位置、朝向等信息。通过在动画序列中相邻关键帧之间进行插值可以确定某一时刻每根骨骼的方位, 然后按照皮肤网格各个顶点中保存的影响它的骨骼索引和相应权重信息求加权和, 便可以计算出该顶点的新位置。为了运转起来, 每个骨骼都有两个相关的变换, 其一是本地变换, 也就是在自己空间内的位置和角度, 在简单的模型里一般都是个单位矩阵。其二是积累变换, 它表示每个骨骼在整个骨架空间的摆放情况, 可能是旋转和位移的组合矩阵。有时为了节省空间, 这些矩阵通常用四元数向量存储 (四元数对关键帧的插值方便, 能产生更圆滑的动画效果) , 这样就实现了在骨骼驱动下的单一皮肤网格变形动画, 即骨骼蒙皮动画。

3. 骨骼蒙皮动画的设计

3.1 设计步骤

骨骼蒙皮动画包含三个主要的步骤:第一步是建模, 建立角色模型, 为参数化控制做准备。使用3D Max软件制作骨骼和皮肤网格, 使用MilkShape 3D导出MD5格式的数据文档;第二步是骨骼皮肤绑定, 创建骨骼节点的包围盒, 负责完成骨骼节点数据和皮肤数据的绑定;第三步是骨骼蒙皮动画的运动生成, 需要运用正向运动学、矩阵运算、四元数球面差值等基础理论。

3.2 设计思想

骨骼蒙皮动画的基本设计思想就是首先控制各个骨骼和关节, 再使附在上面的皮肤与其匹配。在一个典型的骨骼蒙皮动画模型文件中, 会保存如下信息:网格信息, 骨骼信息和动画信息。网格信息是角色的多边形模型, 该多边形模型一般由三角形面片组成, 每一三角形面片有三个指向模型的顶点表的索引。通过该索引, 可以确定该三角形的三个顶点。顶点表中的每一顶点除了带有位置、法向量、材质、纹理等基本信息外, 还会指出有哪些骨骼影响了该顶点, 影响权重又是多少。影响一个顶点的最大骨骼数一般取决于模型的设计和目标硬件平台的限制。在一个典型的骨骼蒙皮动画中, 一个动画文件里可能存储了多个动作动画集合, 这些动作动画集合对应由模型的骨骼采取各种变换而得, 在读取动作动画集合时需要给出动作动画集合的名字, 或者这个动作动画集合在动画文件中的存储序号, 才可以读取到这个动作动画集合。这些动作动画集合在动画存储文件中又被分为多个动作动画, 每个动作动画对应由模型的一块骨骼采取各种变换而得, 一个动作动画集合包含的动作动画的数目, 由骨架包含的骨骼的数目而定, 实际上, 一个动作动画集合包含的动作动画的数目和骨架包含的骨骼的数目是相等的。一个动作动画在动画存储文件中又被分为多个关键帧, 每个关键帧存储了具体的动作数据, 实际上这些数据是这个骨骼节点位置数据。每个骨骼节点都要判断是否有父节点, 需要乘上父骨骼节点的位置和旋转状态。网格顶点中保存了受到那些骨骼的影响和影响的权重值, 通过公式即可算出新顶点的位置和朝向。图1为实现的流程:

在播放动画序列中的任一时刻:

1) 首先确定该时刻之前和之后的两个关键帧, 然后按照该时刻与前后两个关键帧时刻的时间值插值计算出该时刻该骨骼相对于父骨骼的新位置、新朝向、新变换矩阵等等。

2) 然后从根骨骼开始遍历骨架, 计算每一个骨骼相对于世界坐标的变换矩阵。计算该矩阵是一个递归过程。

3) 对于皮肤网格中的每一个顶点, 计算它在世界坐标中新的位置和朝向。首先找到影响该顶点的所有骨骼节点, 然后计算每一骨骼对该顶点的影响 (也就是说, 计算在该骨骼独立作用下顶点的新位置) 。计算按照顶点计算公式顶点的新位置=骨骼的世界变换矩阵*最初状态骨骼世界变换矩阵的逆矩阵*最初状态顶点的位置

然后将所有这些新位置按照每一骨骼节点的影响权重加权求和。所有权重的和应该恰好为1。皮肤网格里所有的顶点是相对于一个原点存储的, 这个原点是网格皮肤的原点, 而不是骨骼的自身坐标系原点, 如果要得到骨骼对皮肤的影响, 应该把顶点转换到骨骼的局部坐标系统空间, 然后再用新的转换把它们转换回皮肤坐标空间。在公式中, 最初状态顶点的位置首先要与最初状态骨骼世界变矩阵的逆矩阵相乘, 就是把绑定姿势的皮肤空间的顶点转换到相应得的骨骼空间中, 然后利用骨骼的积聚变换矩阵把顶点从骨骼空间重新转换到皮肤空间。顶点朝向按照相同方式计算。

4) 根据网格模型顶点的新位置和朝向绘制角色皮肤网格。

4. 结论

设置骨骼的运动信息, 带动影响范围内的顶点运动, 从而形成动画。关键帧之间使用插值计算各个骨骼位置。动画信息文件都是用MD5 Anim格式文件保存的, MD5 Anim文件含有该动作所涉及到的骨骼关节的动画信息。

考虑到系统模型的复杂度高, 运算量大等问题, 如果将周期运动分解成多个必达的状态, 势必增大插值的运算量, 进而整个系统的运算复杂度都会增大。所以, 本文行走设计的关键帧为六帧, 第一帧是双脚支撑状态, 第二帧是右脚支撑, 左脚即将抬起状态, 第三帧是右脚支撑状态, 第四帧是双脚支撑状态, 第五帧左脚支撑, 右脚即将抬起状态, 第六帧是左脚支撑状态, 其余是过渡帧, 关键帧的示意图如图2所示:

经过处理的骨骼蒙皮动画运用于具体场景实现虚拟人的行走, 效果如图3所示:

参考文献

[1]Andre LaMothe.Tricks of the3D Game Programming Gurus[M].北京:人民邮电出版社, 2005.282-354.

[2]王海强.虚拟人运动状态下皮肤逼真变形方法的研究与实现[D].北京:华北电力大学, 2005.

[3]沈军行.运动编辑与合成技术研究[D].浙江大学计算机应用技术, 2004.

[4]秦可.数字娱乐若干关键技术研究[D].杭州:浙江大学, 2005.

[5]房晓溪.游戏引擎教程[M].北京:中国水利水电出版社, 2008.117-134.

骨骼动画 篇4

在当今游戏界或是虚拟应用环境, 随处可见3D技术的身影, 从以往风靡世界的游戏DOOM、CS到如今令人着迷的《魔兽世界》、《使命招呼》等, 角色动画几乎是不可缺少的游戏元素了。角色动画做得越来越精细和逼真, 每一款游戏的推出都给游戏玩家带来视觉的震撼与享受。在渲染技术突飞猛进的同时, 也看到了游戏角色动画必须基于骨骼动画这样的事实几乎成各大游戏厂家的共识, 当然这有游戏技术上的原因也有硬件限制的原因。不管怎样, 虽然如今骨骼动画已经相当成熟, 但在未来相当长的一段时间内, 它的应用还是不可缺少的。

假定读者对微软的X文件存储格式、骨骼动画原理和MaxScript脚本有基本的了解的基础上, 想通过实践的方式来讨论如何从3DS Max软件编辑器中导出骨骼动画数据的方法。当然要导出3DS Max中的场景数据, Max提供了两个工具, 一个是以dll文件为基础的插件形式的工具, 但决定选择另一个工具———MaxScript脚本语言, 其中主要原因是它便于调试。

2 坐标变换

现在导出工具已经选定, 接下来必须解决的是场景环境和导出环境的坐标系统的转换问题。为了方便理解, 假定场景的骨骼动画信息保存到微软的X文件的文本格式。在此要注意的是Max虽然用的是右手坐标系, 但它内部变换矩阵应用的是左乘法则, 这和Direct3D是一样的。

2.1 顶点坐标变换

分析图1、2, 在3DS Max场景中有一个圆柱体, 导出模型是为了使模式相对各自的坐标原点位置不变, 必选更改新模型的顶点坐标值, 即原顶点坐标的Y轴分量要变为新顶点坐标的Z轴分量, 而Z轴变Y轴, X轴的坐标分量不变。为此定义如下顶点坐标变换函数:

2.2 变换矩阵的转换

为把问题简单化, 先看旋转矩阵的变化, 看图3、4 (两图中坐标系的X轴都指向平面内) , 因为Max坐标系是右手坐标系, 图3中绕X轴逆时针方向为正方向, Direct3D坐标系是左手坐标系, 图4中绕X轴顺时针方向为正方向。因此A点在Max坐标系绕X轴旋转θ度, 等于它在D3D坐标系对应点B中绕X轴旋转负θ度。

因此得到两个对应点A, B点在两个坐标系中各自绕X轴的矩阵变换形式, 定义为:A1=A×X_MAX, B1=B×X_D3D

A绕X轴:相当于B绕X轴:

同理得:两个对应点A, B点在两个坐标系中各自绕Y轴或Z轴的矩阵变换形式, 定义为:A1=A×Y_MAX, B1=B×Z_D3D

A绕Y轴:相当于B绕Z轴:

同理得:两个对应点A, B点在两个坐标系中各自绕Z轴或Y轴的矩阵变换形式, 定义为:A1=A×Z_MAX, B1=B×Y_D3D

A绕Z轴:相当于B绕Y轴:

同时易得:

两个对应点A, B点在两个坐标系中平移矩阵的变换形式, 定义为:A1=A×T_MAX, B1=B×T_D3D

A平移 (x, y, z) 个单位:相当于B平移 (x, z, y) 个单位:

两个对应点A, B点在两个坐标系中缩放矩阵的变换形式, 定义为:A1=A×S_MAX, B1=B×S_D3D

A缩放 (a, b, c) 个单位:相当于B缩放 (a, c, b) 个单位:

最后, 在两个坐标系中用各自的变换矩阵来做综合变换, 为了化简问题, 取缩放、旋转、平移顺序进行变换, 得如下表达式:

在matlab软件中, 比较TM_MAX和TM_MAX矩阵, 可得如下关系:

即:TM_MAX矩阵通过交换元素21和31、元素12和13、元素42和43、元素22和33、元素23和32, 可得TM_D3D。读者可使用其他变换序列, 结果是一样的。数学证明这里从略。

于是我们可定义如下函数来转换MAX中的变换矩阵。

d3d_tm._11=max_tm.row1.x———注意:在Max中为了节约存储空间, 矩阵是以4行3列格式保存数据的。

2.3 四元数的转换

四元数实际是一个向量V加上一个旋转θ, 它有4个数值分量, 形式为Q=[sin (θ/2) X, sin (θ/2) Y, sin (θ/2) Z, cos (θ2) ], 前3个分量与X、Y、Z轴的坐标值有关, 且3DS Max环境和Direct3D环境中各自旋转正负值相反, 定义如下变换函数。

2.4 纹理坐标转换

由于Max的纹理坐标系原点在左下角, 而Direct3D的纹理坐标系原点在左上角, 在纹理坐标变换时, u坐标保持不变, v坐标要做如下函数中的变换:

3 数据提取

因为要导出的数据以X文件格式来保存, 为了方便阅读, 对每一个X文件的模板结构可以定义相应的存储变量, 并且定义相应的函数来提取这个数据。在后面, 先列出主要X文件的模板结构, 后定义相应的提取函数或函数说明。

上为X文件的最顶层模板, 将逐个提取其子模板的数据。

3.1 提取基本的网格数据

此函数的要点是如何提取网格的局部顶点坐标, 要注意的是不能直接用表达式getvert MeshObj i来提取坐标信息, 因为这样得来的坐标值是相对的网格的原始坐标原点的, 不是相对的网格的支点, 所以要用in coordsys world getvert MeshObj i来取得它的世界坐标值, 然后乘上网络对象的世界转换矩阵的转置矩阵 (用inverse函数) , 才能得到它真实的局部顶点坐标;至于提取网格的面信息用getface函数就行, 这可参考MaxScript的帮助文档。

3.2 提取网格法线向量

X文件中, 此结构体存储的是Mesh对象的顶点或面法向量个数和值, 对应在脚本中用MeshNormals变量表示, 定义函数fn GetMeshNormals MeshObj[2] (其中MeshObj为传入变量) 来返回MeshNormals值。在此函数中, nNormals赋予MeshObj numverts, nFaceNormals赋予MeshObj.numfaces, 网格顶点的法向量Normal可以用内置函数getnormal MeshObj i获得, 其中i为for i=1 to MeshObj.numverts do循环体中的循环变量。同样网格面的法向量FaceNormal可由另一个内置函数getfacenormal MeshObj j获得, 其中j为for j=1 to MeshObj.numfaces do循环体中的循环变量。最后把这些变量存入MeshNormals变量后, 作为返回值返回。

3.3 提取网格纹理坐标

提取函数:fn GetMeshTextureCoords MeshObj[1] (其中MeshObj为传入变量) 。

在此函数中, nTextureCoords赋予MeshObj.numTVerts, 注意, MeshObj.numTVerts一般等于属性MeshObj.Numverts, 即Mesh对象的纹理顶点个数本质上等于它的顶点个数, 它们之间其实是一一对应的关系。为了获得某顶点的纹理坐标可用右表达式:textureCoord=getTVert MeshObj i, i为对应的顶点索引。最后由于getTVert函数取得的纹理坐标textureCoord是Point3类型值, 存储有UVW坐标值, 为了只取UV值, 需作转换textureCoord as Point2。

3.4 提取网格材质

假定网格对象采用是的单材质, 即只有一个标准材质Standardmaterial, 可以用表达式if classof MeshObj.material==Standardmaterial them来判断, 因此nMaterials值赋予1;n FaceIndexes值赋予为网格对象面的数量, 即MeshObj.numfaces;faceIndexes数组序列全赋予0值, 因为网格只有一个材质, 所以每个面都采用了这个0号材质。对于Material结构体, 成员变量faceColor是带有4个分量的color类型, 其中faceColor.red、faceColor.green、faceColor.blue和faceColor.alpha对应如下网格属性:MeshObj.Material.diffuse.red、MeshObj.Material.Green、MeshObj.Material.diffuse.blue和MeshObj.Material.opacity;power值赋予MeshObj.Material.specularlevel;specularColor和emissiveColor值分别赋予MeshObj.Material.specular和MeshObj.Material.selfillumcolor;TextureFilename存储的是网格对象采用的贴图文件名, 在3DS max中标准材质一般都有十几个贴图通道, 这里假定贴图存储在diffuse color贴图通道, 因此可以使用右式取得贴图文件名TextureFilename=MeshObjMaterial.diffusemap.filename。

3.5 提取骨骼权重值

这个函数主要应用skin蒙皮修改器的一些方法, SkinOps.GetNumberBones返回蒙皮应用的骨骼数, SkinOps.GetNumberVertices返回应用蒙皮的网格顶点数, SkinOps.GetVertexWeightCount返回所有对指定顶点产生影响的骨骼数目, SkinOps.GetVertexWeightBoneID返回对指定顶点产生影响的第N个骨骼的序号, SkinOps.GetBoneName返回指定骨骼的名称, SkinOps.GetVertexWeight返回指定骨骼对指定顶点的影响权重值。

3.6 提取动画关键帧

上述模板结构可以看到一个AnimationSet可以包含多个Animation, 即动画序列, 如CS游戏中的跑、蹲、跳等动作, 每个Animation同时最多只能包含4种类型AnimationKey模板结构, 这4种类型由AnimationKey中的keyType值决定, keyType可取0、1、2、3, 分别指定AnimationKey中关键帧存储的是旋转、缩放、平移、矩阵类型。由于骨骼变换一般只有旋转变换, 所以Animation一般包含只有keyType为0值的AnimationKey结构。查看微软的MSDN, 可知旋转关键帧其实是由一个时间值和一个四元数组成, 四元数在MaxScript中用Quat类型表示。对于Max中每一个骨骼对象, 如果它应用了旋转帧动画, 其BoneObj.rotation.isAnimated一定等于True值, 这时可以分别通过BoneObj.rotation.controller.keys[i].time和BoneObj.rotation.controller.keys[i].value来取得它第i个关键点的时间值和一个四元数类型的旋转数据。

3.7 提取骨骼变换矩阵

从以上模板结构的递归定义, 可以看出骨骼变换矩阵在X文件中是以层次组织结构来存储的, 实际上就是个树形结构, 这有点像Windows资源管理器的左视图中的目录结构, 可以借助类似二叉树的先序遍历的堆栈的非递归算法来实现数据的保存算法, 这里从略。我们这里关心的是如何提取骨骼的变换矩阵FrameTransformMatrix, 可以定义如下函数获得。

这个函数传入值BoneObj的类型为bone、BoneGeometry和Biped_Object类型之一, 可以用if (classOf BoneObj===bone) or (classOf BoneObj==BoneGeometry) or (classO BoneObj=Biped_Object) then表达式来判断。Transform属性存储的是对象的最终的变换, 为了获得对象相对于父对象的局部变换矩阵, 需要和父对象的Transform的逆矩阵相乘。

4 数据保存

要保存数据, 主要应用如下几个maxscript函数[3]:

(1) fs=createfile--创建一个新文件, 返回FileStream类型值给fs变量。

(2) format{}to:--格式化输出数据到文件。

(3) close fs--将缓冲数据写入文件, 并关闭文件。

需要注意的是, 由于提取的数据是Max格式的, 在输出数据前应该应用相应的坐标转换函数进行坐标转换。具体的输出操作这里从略。

摘要:介绍了从3DS Max导出骨骼动画数据的理论和方法。详细讲解在Max环境与Direct3D环境中坐标系统的差别、坐标变换原理及其方法, 介绍用MaxScript以X文件格式提取Max中的网格、材质数据和骨骼动画关键帧数据, 并简要介绍了保存数据的基本方法。

关键词:3DS max,MaxScript,X文件模板,骨骼动画

参考文献

[1]金容俊.max2xml.ms源码.3D游戏编程.电子工业出版社, 2006.

[2]微软.http://msdn.microsoft.com/en-us/library/bb173015 (v=VS.85) .aspx, 2010.

骨骼动画 篇5

一、三维动画角色骨骼的基本组成

动画角色运动的支撑——骨骼, 关节是动画中的角色骨骼组成的基本点。关节点之间的以父子关系相联系的部分叫动画角色骨骼。其特点就是每一个部分对应着一个独立的网格模型, 不同的部分按照角色的特点组织成一个层次结构。

动画角色骨骼制作根据人体的结构和角色运动的基本原理一般情况下分为:上身骨骼的是设定, 一般从他的跨部进行设定, 让其作为全身骨骼的总控制点, 也是动画角色重心所在, 设定上身时要注意“腰部”的设定, 因为这里是全身扭动的关键点。上身骨骼一般设定4-5块骨骼;头部骨骼设定, 头部最主要的地方是额头和下颚, 因为我们的嘴巴的张合都和这个有关系, 头部骨骼不能太多, 太多会使头部出现断节、错位等现象;四肢骨骼的设定包括腿部骨骼设定和手臂骨骼。

二、骨骼系统的绑定技术研究

骨骼绑定是三维动画角色制作动作的基础, 是实现模型与骨骼一体化的重要方式, 是运用控制器来控制角色形体及运动的条件。骨骼绑定过程包含四个主要阶段:骨骼运动规律的预测、控制器的制作及极限量的测算、动力学及驱动器的创建、动作测试阶段和修正控制器的数据及错误。骨骼运动规律的测算, 运动轨迹的测算是控制器制作的基础, 从而可以判断骨骼运动的数据。控制器的制作及极限量测算, 控制器的多少及形状都是与角色模型有关系, 这个阶段也关系着创建的控制器能不能起到很好的控制作用。驱动分为驱动和被驱动, 通常用反转脚来控制脚部的左右或者上下运动的极限。测算数值。动作测试阶段是通过蒙皮将骨骼与模型进行绑定, 使骨骼带动模型顶点运动, 所以皮肤产生变形失真难免, 对绑定失真的模型部位可以运用权重来调解。最后是修改阶段, 是将以上测算数据进行整理, 对出现问题的地方进行修改。

三、三维动画角色骨骼设定技术实例制作

下面, 根据我导演的动画短片《偷马记》中的动画角色刘老汉为例, 结合人体结构进行骨骼的制作。

1. 腿部骨骼创建:

一定要注意骨骼的位置, 要根据模型调整骨骼的位置, 创建的关节点分别包括腿跟、膝盖、裸骨、脚掌。也可以创建反转脚, 这样更好的控制脚部的旋转, 反转教制作会产生许多数据, 可以通过打组来消除, 使组的通道参数归零。然后在将打组的骨骼重新命名。最后在根据人类运动的极限角度来创建驱动, 在设定脚部向上、下、左、右位置的最大数值, 这样就大大减少了角色动作制作的工作量, 创建手柄IK, 通过径向复制来制作另外一条腿, 从而保证了骨骼的一致性、完整性。

2. 躯干骨骼创建:

对于动画角色, 一般把重心的位置定在根关节位置, 由于人体中心的位置在直立的时候位于骨盆的附近, 所以躯干的骨骼创建应该也在盆骨位置。骨骼的创建应该由下而上, 通过腰部、胸部、颈部和头部。参照人类躯干骨骼的形状来创建骨骼系统, 由于人类腰部和颈部是人躯干最活跃的部位, 所以在创建骨骼的时候要密集, 而头部和胸部的骨骼尽量简化, 但是整个躯干骨骼要控制到6块以内。

3. 手臂骨骼创建:

制作模型的时候, 基本都以T字形来出现, 这样有利于骨骼位置的调整, 将手臂分为三个部分, 两个关节点, 但是到手指骨骼创建的时候, 要将骨骼数值改小, 便于更准确的调整手指骨骼在模型里始终处于中心位置, 最后将手指的关节与手臂的关节进行建立父子关系。因为手指的活动室非常灵活的, 所以要建立驱动器来驱动手指的数值来设置其动作极限。在创建Locator吸附到手腕的关节, 注意要把Locator信息通道清除为零, 最好为每个手指在创建新的信息通道来分开控制, 这样就非常方便来掌控手指的活动与变化, 手臂肘部关节的旋转可以通过设置IK手柄的Twist数值改变肘部的旋转。

最后把腿部骨骼、手臂骨骼的父关节与人体的盆骨骨骼及胸腔骨骼进行父子连接, 这样全身骨骼创建就完了, 如下图所示。

结束语

三维动画角色的动作行为是通过角色骨骼蒙皮后带动模型的姿势转换, 动画师根据剧情情感因素融入夸张变形艺术表现手法, 由此可见, 其动作及表情的本质是人的表演。所以, 骨骼系统的创建及绑定技术一定要要立足人体结构。

参考文献

【1】完美动力《兄弟连讲解分析》72数码设计.2010.1.

【2】丛永红《从豚鼠特工队简析三维动画技术》, 电影文学.23.

上一篇:加强实践教学下一篇:经济全球化探讨