Maya的模型信息提取

时间:2024-03-07 点赞:46441 浏览:89768 作者原创标记本站原创

该文为数据结构方面有关开题报告范文,与Maya的模型信息提取相关毕业论文格式,可作为论文格式专业数据结构论文写作研究的大学硕士与本科毕业论文开题报告范文和职称论文参考文献资料。免费下载教你怎么写数据结构及模型及信息方面的优秀学术论文范文。

摘 要 Maya是Autodesk公司中和3dMax并列的三维建模和动画软件,而且在模型的细节渲染方面有着更为突出功能,随着技术的进步和用户对三维图形动画要求的提高,Maya已经广泛的应用到电影、电视、游戏等领域.因此,如果能将Maya中的模型信息从Maya软件中提取出来,并按照一定的渲染方法重新组建,就能将依赖Maya的图形文件用于其他设备上进行三维展示,例如平板电脑,智能手机等移动设备上.这样,就能在很大程度上提高产品模型的展示效果.本文将介绍如何利用Maya的Api 将Maya模型中的信息提取出来,并按照OpenGl的模型渲染格式进行储存.

关 键 词 Maya;node;mesh;face;vertex;OpenGL

中图分类号TP31 文献标识码A 文章编号 1674-6708(2012)58-0157-02

0 引言

要成功的提取Maya模型中的信息,必须要知道Maya中的数据结构,知道Maya中的Api运行模式,掌握Maya模型的类别,模型的构成方式,模型属性组成等等信息.当掌握了这些信息之后,就能实现模型重构和再实现,以完成模型在其他显示平台的迁移.

1.Maya的核心数据结构Dependency Graph

1.1 概述

我们可将整个Maya 系统拆分为3个主要组成部分: 图形用户界面,MEL Command Engine ,Dependency Graph .

Maya用户可以与Maya Gui进行交互,可以选择菜单项,更改参数,使对象动画化以及移动对象等等,当与用户界面进行交互时,Maya实际是再发出MEl命令,这些命令呗发送到Command Engine,并在这里被解释并执行.

大部分的MEL命令运行与Dependency Graph直接交互.这样做是因为Dependency Graph可以被直观地看做是一个完整的场景,这个场景是组成3D世界的所有重要数据和信息.Dependency Graph不仅定义当前场景中有什么数据,还定义了数据的处理方式.Dependency Graph 实际就像Maya的心脏和大脑.

1.2 Dependency Graph 与 节点

我们将Dependency Graph简称为DG,DG是Maya的核心,它包括Maya模型的所有基本构建,它允许你创建任意的数据,这些数据进行一系列的操作处理后,最终生成一些经过加工的数据.在DG中,数据及其操作被封装为节点,一个节点含有任意数目的插槽,其中还有Maya使用的数据,节点也包含一个操作符,用于对其数据进行处理以生成一些其他的数据.

由图1所示节点实际是Maya的基本构件,每个节点都有一个或者多个与其相关的特性,这些特性通常呗成为属性,每个节点根据其属性的不同实现对数据的不同操作.

2.Maya 模型的组成结构

Maya中有多种模型类型,但最常用的静态模型主要使用的是 nurb,polygon 和subdiv.

2.1 Mesh 与 Polygon

Mesh 英文翻译为网格,在Maya中则用于代表一个三维实体,例如一个立方体、圆锥体、球体,这些都是Mesh.而模型中的每个面则就是polygon,如下图的球体模型则更能体现出mesh和polygon的关系,图中的每个四边形方格就是一个polygon.

2.2 Polygon的组成

Polygon主要有3个主要元素:vertices , edges, faces除此之外还有两个有助于理解和分析polygon如何工作和运行的元素 Face-vertices 和 UVs.

Polygon的Vertices元素是一个表示3d的浮点型数组,每个点都有自己的元素id,每条边和每个面都是基于这个数组产生的.如表1.

3D Float Point 行中每一个元素都是一个三维坐标(x,y,z)

Edge元素储存在一个边数组中,数组中的每个元素储存着两个整型变量,储存着vertices的id,第一个表示边的起始点,第二个表示结束点,这样储存数据就能表示边的点组成,点边的方向以及边的编号.如表2.

Edge行中的每个元素都是一个二维的点,表示边的起始点和结束点的id Faces的元素储存在一个整数型数组中,每个面被一系列数字表示,每个数字都表示一个边的索引.与之相应的的是face offset 数组,这个数组标示了每个面在face数组中每个面的起始点,具体格式如表3,表4.

如表4中所示,face 1 的起始点在 EdgeId的Index 3 即,Face 1是由,0,1,2三条边组成的三角面.

Face-vertices 是将一个Mesh中的每个面的相对vertices 索引,就是说,他们都是以0为起始的整数数列.并不是以整个Mesh为基础的全局索引坐标.UV uv是专门用于描绘纹理信息的元素,其对应着每个每个点都有与之相对应的uv,我们要把二维贴图与3d模型想匹配,必须找到每个3d坐标对应的uv.

3.提取Mesh Polygon 的信息的程序实现

3.1 选取模型目标

在Maya的C++ Api 中,选取模型有两种形式,第一种选取指定模型信息,第二种选取全部模型信息.

选取指定模型需要用到的变量类型 : MSelectionList .顾名思义,这个变量类型储存了用户的模型选择信息,即用户在软件界面选择的图像(单选或者多选).然后利用MGlobal类里面的成员函数getActiveSelectionList函数将MSelectionList变量进行赋值,如此我们设置的MSelectionList类型变量就得到了赋值.

得到了选取列表之后,就需要利用选择迭代器对选择列表里面的内容进行遍历.MItSelectionList ,MItSelectionList 也是一个类,里面有丰富的函数可以对选择列表里面的内容进行操作,利用里面的next()函数 和isDone()函数可以对他储存的变量进行遍历MItSelectionList遍历的内容其实就是我们上面提到的Dependency Graph 中所提到的节点DagNode,但是MItSelectionList类中并没有直接提取节点的函数,它值提供了每个节点的路径DagPath,通过DagPath我们就可以定位到相应的节点对模型操作.

3.2 获取模型信息

要实现模型的转移,就需要知道模型的点信息,面信息,点信息包括 点的空间坐标,点的模型序列,点法线信息.面信息包括面个数,每个面的组成,在模型构成中,任何一个面都可以分解成若干个三角面,而Maya中的模型构成也是按照这个原则,因此,我们提取面的信息的时候是将模型中的面都分解为若干个三角面,并将每个面的点和点的索引相联系.

3.2.1 提取点的坐标以及索引

通过上面一步我们得到了dagpath,这里我们就以polygon模型为例提取上面提到过的模型信息首先创建mesh类的实力 MFnMesh这个类 ,通过这个类我们就可以直接得到点的信息以及三角面的信息,这里我们得到的点是以一定顺序储存的point序列.以立方体为例,point序列的索引为0-7,分别记录了空间坐标的点,通过GetPoints函数我们就可以得到这个数列.


3.2.2 提取每个三角面的索引

通过MFnMesh类之中我们通过getTriangles函数就可以得到面的信息,主要得到两变量,一是我们这个立方体的三角面的个数,因为六面体是六个四边形,因此我们得到的三角面是十二个,而另一个变量就是每个三角面的点与我们得到的点的对应索引,以这个立方体为例,我们得到的数列如下(0,1,2,2,1,3,2,3,4,4,3,5,4,5,6,5,7,6,7,0,0,7,1,1,7,3,3,7,5),这些点每3个对应一个面,因为我们以立方体为对象,所以每六个点为同一个四边形的两个三角面,而且可以看出每个四边形的组成.

通过上面的步骤我们成功的得到了每个三角面的信息,通过这些单独的三角面信息我们就能通过opengl进行仿真对每个面配上颜色我们就能实现模型结构的提取.

3.2.3 提取每个点的法线

为了使一个细分度很高的Polygon Mesh 在转移的情况下表现的更加平缓和光滑,即表现的和软件中更加相似,就需要提取每个点的法线.

这里我们用到的是MItMeshVertex类来对Mesh的每个点进行遍历,然后通过getNormals函数得到一个MVectorArray变量,里面储存了每个点相对于每个面的法线值,通过计算我们可以得到每个点的实际法线.


下面是具体程序实现:

MItDag dagIter( MItDag::kBreadthFirst, MFn::kMesh, &stat ),

for ( , !dagIter.isDone(), dagIter.next())

{ MDagPath dagPath,

stat 等于 dagIter.getPath( dagPath ),

if ( stat )

{ MFnDagNode dagNode( dagPath, &stat ), }

MFnMesh fnMesh( dagPath ),

MIntArray triangleCounts,

MIntArray triangleVertices,

MPointArray vertexList, fnMesh.getTriangles(triangleCounts,triangleVertices ),

fnMesh.getPoint(vertexList);

MVectorArray vtxNormals,vtxTestNormals,vtxFaceVatexNormals,

int lGetNormals,

for ( , !vtxFn.isDone(), vtxFn.next() )

{ vtxFn.getNormals(vtxNormals ,MSpace::kWorld ),

MVector add,

lGetNormals等于vtxNormals.length(),

for (int i等于0,i

{ add.x 等于 add.x+vtxNormals[i].x,

add.y 等于 add.y+vtxNormals[i].y,

add.z 等于 add.z+vtxNormals[i].z,}

add.normalize(),

vtxTestNormals.append(add), }

通过以上几步,我们将成功得到所需要的点的空间坐标,点的个数,面的个数,每个面与相应点的索引,每个点的点法线通过归一化之后的信息.通过这些信息,我们就能成功的利用OpenGl模拟出模型的体信息

4.OpenGl仿真

通过OpenGl中的glBegin(GL_TRIANGLES)函数我们可以将得到的数据重新组合成图形,因为我们只提取了基本模型信息,对于纹理和材质并没有提取,所以,只能生成模型本体,通过设置glPolygonMode可以将我们形成线框实体化.如图2是软件中的图形,图3是仿真后的图形.

5.结论

我们从Maya的数据结构入手,分析了他的模型信息储存结构,通过得到正确的模型信息我们就能将模型从Maya中迁移出来,利用openGl将这些信息重现,我们就能让3d模型脱离那些消耗系统资源巨大的软件,而在我们希望的平台展示.

相关论文

基于C#的网页正文信息提取

本文是一篇节点论文范文,关于节点方面毕业论文开题报告范文,关于基于C 的网页正文信息提取相关专科毕业论文范文。适合节点及参考文献及信息。

一个新的信息传播模型其模拟pdf

此文是一篇计算机模拟论文范文,关于计算机模拟论文范本,与一个新的信息传播模型其模拟pdf相关学年毕业论文。适合不知如何写计算机模拟及吸。

利用C#通过串口提取GPS定位信息

此文是一篇信息论文范文,信息方面论文范文,与利用C 通过串口提取GPS定位信息相关毕业论文题目。适合不知如何写信息及数据及信号方面的论文。