面向自定义格式的动画角色数据转换工具

2014-07-09 01:16聂文超刘晓平
图学学报 2014年3期
关键词:蒙皮顶点骨骼

聂文超, 李 琳,刘晓平

(合肥工业大学计算机与信息学院,安徽 合肥 230009)

随着信息技术的飞速发展三维动画正在逐 渐成为继声音、图像、视频和三维模型之后的第5种多媒体类型[1]。作为三维动画的核心组成部分,动画角色在影视制作、网络游戏等应用领域占据越来越重要的地位。无论是拥有国内500万玩家的网络游戏《魔兽世界》中形形色色的怪物角色,还是创造了5亿国内票房的3D电影《阿凡达》中创意无限的外星生物,动画角色的外形设计和动作设计无一不是人们趋之若鹜的理由和效益神话的根本[2]。

动画角色的制作软件也非常之多,作为目前流行的三维建模、动画和渲染软件,3ds max成为首选工具[3]。然而其自身的.max文件格式难以被全部解析,因而难以通过解析文件的方式充分利用3ds max中强大的功能,而且随着系统的更新,依靠解析文件获取模型信息的方法始终无法获取最新最完整的模型信息[4]。3ds文件格式以密文存储,虽然能够部分解析,但是只包含 3D模型数据,无法实现对动画角色进行研究的要求。在虚拟现实系统里面进行动画角色算法研究,即需要有动画角色的运动数据又需要有动画角色模型数据。

动画角色主要包含两方面信息,动画角色的模型信息与动画角色的骨骼运动信息。模型文件格式有很多,这些格式的文件都是针对特定的情况而设计的,有些注重工业标准,有些注重通讯的简易性,还有些注重适宜性和可移植性[5]。为了方便研究人员进行动画角色相关算法的研究,本文提出了一种用于存储动画角色信息的文件格式,该格式包含了动画角色的模型信息和运动信息,以明文方式存储,使研究人员可以对动画角色算法进行全面的研究。同时,不同于OGRE与Unity3D所支持的三维模型格式包含全面的三维模型信息,此格式针对动画角色的特点,摒弃了常见三维模型软件的冗余信息,提高了算法的执行效率和稳定性。

为了增加该文件格式的通用性,还开发了此文件格式的动画角色数据转换工具,可用于与3ds max里的动画角色相互转换,减小了使用者对自定义文件格式的依赖性。该转换工具是通过对3ds max动画角色模型组织结构进行分析,基于max SDK,将max中的动画角色与自定义格式进行相互转换,从而可以充分利用3ds max中丰富的动画角色信息,进行动画角色算法的研究。

下面分别从动画角色数据结构分析,系统整体介绍、结果验证3个方面展开论述。

1 动画角色数据结构分析

1.1 已有动画文件格式分析

常用的模型文件格式有OBJ格式,目前几乎所有知名的3D软件都可以通过插件支持OBJ文件的读写,很适合用于3D软件模型之间的互导;Stanford大学开发的ply格式,是一种结构简单但是能满足大多数图形学应用需要的模型格式,在图形学的研究领域中,ply是种常用且重要的文件格式;还有OGRE引擎所支持的mesh格式,主要用在商业领域中。骨骼动画是随时间变化的,常用的运动格式有通用的人体特征动画文件格式bvh与3ds max cs特有格式bip。这些文件格式都只包含动画角色某一部分的数据,目前尚无标准的以明文格式存储的动画角色文件格式出台,既包含动画角色模型数据又包含骨骼运动数据的文件格式都是一些商业软件所用的,无法在其上进行动画角色相关算法的研究。

1.2 3ds max动画角色模型数据结构分析

作为目前流行的三维动画渲染和制作软件,3ds max拥有强大的功能。虽然其自身的.max文件格式难以被解析,无法提供动画角色数据,但max SDK提供了丰富的接口使我们可以有选择性地导出与导入自己需要的数据。

节点INode作为max SDK里最基本的数据结构,承载着其里面挂载数据的功能,节点有骨骼、网格等多种类型,不同类型的节点挂载着不同的数据。节点在场景中是以父子层次关系组织的。每个节点都会以子节点的身份关联到另一个节点上,一个节点可以有多个孩子节点,只能有一个父节点。节点INode与max场景中的对象存在着一一对应的关系,每一个出现在视口中的对象,包括骨骼、网格等,都关联一个节点。如图1所示。3ds max中的对象挂载在节点上,通过对节点的遍历判断节点挂载对象的类型,可以获取到场景中动画角色的骨骼数据与网格数据。

图1 max SDK动画角色数据结构

1.3 自定义文件格式介绍

为了使研究人员对动画角色进行算法研究,本文提出一种以明文存储的、用来存储动画角色信息的文件格式。动画角色是网格数据、运动数据和蒙皮约束数据的结合,该自定义动画角色文件格式包括5个部分:文件头、运动数据、蒙皮数据、网格数据以及纹理数据,如图2所示,其中文件头是对后四者的描述,介绍文件中包含哪几个数据模块,用于文件读取的预处理。

图2 自定义动画角色文件示例图

运动数据是动画角色骨架的数据表现形式,是动画角色随着时间变化姿态信息的存储形式。常用的运动数据表示方法有旋转矩阵、欧拉角和四元数3种,这3种运动数据的存储各有利弊,表1给出了对比结果。用户可根据需求选择对应的运动数据存储在自定义文件格式中。

表1 旋转矩阵、欧拉角和四元数的比较

蒙皮数据是联系骨架的动态信息与静态网格之间的桥梁,随着时间轴的前进,骨架的运动通过蒙皮使得每个网格顶点产生对应的位置变化,进而发生网格变形,即为动画。权重表是蒙皮数据的核心,它存储着每根骨骼对网格各顶点的约束权重,如表2所示。权重表由权重项组成,权重表的每一行代表了一个权重项,权重项包含了影响当前网格顶点的各骨骼信息以及对应的约束权重。

表2 权重表

网格给模型以最直观的显示,通过对网格表面顶点集合的绘制以及面片贴图的渲染,得到逼近真实的效果。网格主要包含以下信息:①顶点信息:网格的顶点三维坐标数组,用于标记顶点的空间位置;②法线信息:用于控制场景中光线的传播特性;③顶点颜色:顶点的渲染颜色;④纹理顶点信息:记录了网格顶点的纹理坐标信息,用于纹理映射;⑤面片信息:存储了网格的面片属性,主要存储每个面片的各顶点对应的顶点索引、法线索引以及纹理顶点索引等信息。

1.4 动画角色转换工具的优势

目前还没有找到即包含动画角色的运动数据又包含模型数据且以明文方式存储的文件格式,动画转换工具导出的自定义格式的文件包含有这两项数据,很大程度上方便了研究人员进行动画角色方面的算法研究。动画角色数据转换工具将动画角色从常用建模软件3ds max中导出为自定义格式的文件,经过动画角色算法操作后,产生新的文件,再通过动画角色数据转换工具导入回3ds max中。转换工具的这一功能使产生的新模型可以跟外界常用的模型文件格式进行相互转换,如图3所示。例如可以将产生的新模型通过3ds max为媒介转换为OGRE引擎所支持的mesh格式,从而将模型用于游戏制作中。

动画角色常用的运动数据表示方法有旋转矩阵、欧拉角和四元数3种,max SDK提供的标准的运动数据接口是以矩阵形式表示的,并且提供了矩阵与欧拉角、四元数相互转换的方法。动画角色数据转换工具支持这3种表示方法的导出与导入,这3种运动数据表示方法各有利弊,增加动画角色转换工具的通用性。

2 系统整体介绍

3ds max作为目前流行的三维动画渲染和制作软件,其SDK[6]提供了丰富的接口进行动画角色数据的导出与导入。动画角色的数据包括以下3个部分:骨骼运动数据,网格纹理数据,蒙皮数据。本文所提出的动画角色转换工具包括对这3个部分的导出与导入,整体结构如图3所示。

图3 动画角色数据转换工具

2.1 运动数据的导出与导入

Interface类是max SDK提供的获取3ds max中数据信息的一个接口,通过此接口可以导出与导入大部分动画角色数据。图4为与动画角色运动数据相关的一些主要方法。

图4 Interface类运动数据相关的一些方法

运动数据是动画角色骨架的数据表现形式,骨骼节点是运动数据的载体。通过max SDK的节点类提供的类层次关系的方法,对场景中的节点进行遍历,判断节点类型,获取到所有骨骼节点,进而获取到动画角色所有骨骼节点数据;也可以创建骨骼节点构建出这种父子层次关系结构,从而进行运动数据的导入。如图5为节点类层次关系的一些主要方法。

图5 INode类层次关系的一些主要方法

通过获取到的场景根节点 RootNode,根据节点的父子层次关系进行遍历,得到场景中所有的节点。3ds max里的对象存在对象标识符Class_ID,对象标识符用来标志节点属于哪种类型,例如三角网格节点用TRIOBJ_CLASS_ID标志,Bone骨骼节点用BONE_OBJ_CLASSID标志,bip骨骼节点用 BIPSLAVE_CONTROL_CLASS_ID或者BIPBODY_CONTROL_CLASS_ID标志。在3ds max中存在两种骨骼,Bone骨骼与bip骨骼,对遍历得到节点的对象标识符类型判断,可以获取到场景中所有的骨骼节点。从而得到场景中所有骨骼每一帧的运动数据。骨骼运动数据有3种表现形式,矩阵,四元数,欧拉角,这3种运动数据的存储都存在一定的利弊,用户可以根据自己的研究需要选择 1种进行导出。伪代码描述如下:

//获取骨骼节点

//获取3种类型运动数据

for (int time = 0;time <= numFrame;time++)

骨骼运动数据的导入主要是骨骼节点父子层次结构的创建与运动数据的录制。具体可以分为以下4个部分进行:

(1)调用CreateInstance()创建骨骼对象pBone,并通过CreateObjectNode(pBone)关联到节点;

(2)通过INode的方法构建出骨骼节点父子层次关系;

(3)调用AnimateOn()函数开启动画运动数据的录制;

(4)读取运动数据构建数据结构进行运动数据录制;

(5)录制完后调用函数ResumeAnimate()重新开启动画完成运动数据的录制。

2.2 网格纹理数据的导出与导入

网格在 max SDK中的代表的类为 Mesh,Mesh类有专门的Face类描述,Face类记录了1个面片的3个顶点在网格顶点数组、材质顶点、法线中的索引。而在 Mesh类中,面片数组为faces,它是一个 Face类型的数组。另外网格还有材质、法线等信息。纹理数据定义材质如何在网格上显示,使模型更加漂亮有真实感,文献[7]中很详细地介绍了网格模型的导出过程。图6给出了用来导出导入Mesh的主要方法。

图6 Mesh相关方法

网格对象Mesh通过Interface从场景中获得,通过Mesh的相关方法能够获取到网格对象的网格顶点、法线、材质、面片等信息,完成数据的导出。Mesh网格中的面片均为三角形,通过TriObject可以创建出网格对象,并调用网格类的setNumFace等方法完成网格数据的导入。

2.3 蒙皮数据的导出与导入

蒙皮是骨骼与网格模型之间的一座桥梁,使骨骼的运动能够驱动网格模型产生相应的变化。蒙皮在max SDK中以蒙皮类ISkin表示,蒙皮类中存在ISkinContextData与ISkinImportData两个对象。ISkinContextData对象提供了一个接口以获取蒙皮数据,这些数据以顶点蒙皮权重表的形式存储。每一个顶点都包含了影响这个顶点的骨骼索引及其对应的影响权重值。ISkinImportData接口用于向蒙皮修改器中导入蒙皮数据,包括添加蒙皮的骨骼节点、设置顶点的蒙皮权重等。通过蒙皮类的这两个对象即可完成蒙皮数据的导出与导入。

3 结果验证

本文设计动画角色数据转换工具的目的是方便研究人员进行对动画角色算法进行全面的研究。因此需要验证没有经过外部算法对数据文件影响的情况下,经过该工具转换的动画角色不会发生动作与网格模型的变化。图 7(a)为动画角色导出前的原始效果,图 7(b)为通过动画角色数据转换工具转换后的效果,其中数字代表当前帧号。

通过实验结果的前后对比可以看出动画角色经过转换后,动作数据与网格模型没有发生改变,因此该工具是正确有效的。

4 结 束 语

本文从方便三维动画角色算法研究的角度出发,定义了一种动画角色文件格式,开发了此文件格式动画角色数据转换工具,并对这一过程进行了详细的描述。此工具是针对做动画角色算法研究人员所开发的,使用该工具可以帮助研究人员很方便的从常用建模软件导出动画角色的骨骼运动数据与模型数据,使研究人员可以集中时间在算法的研究上,大大减轻了研究人员的负担。

图7 经过数据转换工具转换的动画角色前后对比图

[1] 王 鑫,孙守迁,柴春雷. 3维人体运动编辑与合成技术综述[J]. 中国图象图形学报,2009,14(2):233-242.

[2] 吴 正. 基于样例的动画角色多样化研究[D]. 合肥:合肥工业大学,2011.

[3] 翟旭峰,朱杰杰,潘志庚. 3ds MAX建模及其在虚拟现实中的应用[J]. 计算机仿真,2004,21(4): 94-97.

[4] Lloyd L,Skiena S. Parsing without a grammar:making sense of unknown file formats[C]//Pata mining,2003. ICDM2003. Third IEEE International Conference on,2003: 195-202.

[5] Zhang Congzhe,Zhou Mengchu,Gao Jianlin.Conversion between discrete images and organized 3D file formats [C]//2001. Systems,Man,and Cybernetics,IEEE International Conference on,2001: 2835-2839.

[6] Sdk M帮助文档[EB/OL] [2014-04-02]. http://sparks.discreet. com/downloads/downloadshome.cfm.2006.11.20.

[7] 余 烨,刘晓平. 面向 VR系统的三维模型转换工具[J]. 工程图学学报,2008,29(5): 72-78.

猜你喜欢
蒙皮顶点骨骼
做家务的女性骨骼更强壮
过非等腰锐角三角形顶点和垂心的圆的性质及应用(下)
过非等腰锐角三角形顶点和垂心的圆的性质及应用(上)
三减三健全民行动——健康骨骼
运载火箭框桁蒙皮结构铆接壳段多余物分析与控制
金属加筋壁板蒙皮有效宽度分析方法
飞机蒙皮上的幽默
益宝打造骨骼健康产业
基于模线样板飞机蒙皮类零件的逆向建模
数学问答