毕业设计(论文)-MAYA建模游戏设计.doc_第1页
毕业设计(论文)-MAYA建模游戏设计.doc_第2页
毕业设计(论文)-MAYA建模游戏设计.doc_第3页
毕业设计(论文)-MAYA建模游戏设计.doc_第4页
毕业设计(论文)-MAYA建模游戏设计.doc_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

maya建模游戏设计摘要:建模是动画制作的基础,就maya软件来说,它提供了大多数三维软件所拥有的建模方法包括:1)nurbs建立角色;2)多边形建立角色;3)细分建模;4)雕刻建模。多边形模型就好比点阵图像,nurbs模型就好比矢量图形,建模时,主要在于自己的熟练程度和习惯。关键词:建模;多边形建模;游戏设计abstract: modeling is the basis of animation, maya software, it provides a majority of three-dimensional modeling software owned by the methods include: 1) nurbs role in the establishment, 2) the establishment of polygons role 3) sub-modeling; ) sculpture modeling. polygon model can be compared to dot-matrix image, nurbs model can be compared to vector graphics, modeling, mainly in their own proficiency and habits. key words: modeling, polygon modeling; game design第一章 绪 论maya是目前世界上最为优秀的三维动画和特效制作软件之一,被广泛使用于电影电视、游戏设计等领域。1998年以来,maya开发工程师不断完善开发软件包,使其成为全球许多顶级动画工作室和制作公司首选的三维设计平台之一。与其他的开发平台不同,maya应用平台采用开放式的框架体系结构,设有许多三维组件(对象、动画、动力学等等),可以重新设定这些组件的用途,以实现用户所需的特定功能,即开发maya插件。开发maya插件的编程方法有两种,一是mel(maya embedded language,maya嵌入式语言)脚本,二是c+api(application programming interface,应用程序编程接口)程序。maya的c+api开发是maya高级编程方法,与mel脚本开发相比,c+api开发的maya插件具有代码执行速度快和安全性高的优点,还可以方便的应用指针对内存进行访问和操作。但maya的c+编程接口具有平台相关性,跨平台性能欠佳。本文应用的编程平台是目前较流行的microsoft vc+.net。maya的节点(node)是用户与底层maya引擎dg(dependency graph)通信的特殊构件。把一系列节点链接在一起,进行数据传递,可以完成很多3d任务。maya自定义节点也是一种maya插件,创建自定义节点最好的方法是利用maya的c+api,并且这些自定义的节点可以直接集成到maya中,与其他节点无缝链接。但通常情况下,开发maya自定义节点比较繁琐, 不光要求开发者具备一定编程能力,而且必须深入理解maya的底层结构。本文通过对maya c+api的深入剖析的基础上,将整个开发过程的步骤简化,并用maya比较简单的命令脚本和表达式来代替一些比较复杂的编程过程,从而提出了一种开发maya自定义节点的简易方法,大大降低开发难度。节点开发是maya插件开发的高级应用,因此该方法对其他maya插件的开发也具有一定的借鉴意义。第二章maya建模建模是动画制作的基础,现今的三维动画软件都有独立的建模系统,建模的方法很多,但归结起来大多有三大类型:nurbs建模,polygon(多边形)建模,面片建模方法。就maya软件来说,它提供了大多数三维软件所拥有的建模方法包括:1)nurbs建立角色;2)多边形建立角色;3)细分建模;4)雕刻建模。多边形建模是历史最悠久的,也是应用最广泛的建模方法,顾名思义,它是由三角形和四边形的拼接而成的,因为我们在屏幕上看到的三维模型都是由被称为“面”的相互连接的多边形组成。每个“面”有不同的尺寸和方向,通过排列这些面,可以用非常简单的方法建立起非常复杂的三维模型。多边形模型还可以很容易得制作成动画。通过改变面的尺寸和方向,便可以制成弯曲,扭转等,简单的动画或更复杂的动画等。模型细节的原则也很明了,给定位置内的面数越多所表现的细节也就越多,通过增加更多的细节,会使模型更加具体化。如图一,两个球体两种不同的方式表现出来的差异,同时要注意,模型对象的这种差异,在与你的距离增加的时候,这种差异会逐渐缩小,这一点在你参与大的模型制作时会用到的。图一中,多边形是一组由顶点和顶点(节点)之间有序的边构成的n边形,多边形模型是由多边形面组成的模型,比较适合建立结构穿插关系复杂的模型。多边形模型的构造实质是一系列节点的连接。如果模型中的每一个面都与至少其他三个面共享一条边,那末,该模型就是“闭合”的。如果模型中包括不与其他面共享边的面,则该模型被认为是“开放”的,日常处理的大多数都是“闭合”的,只有当我们打算用另一个对象去填充开放区域时,才需要一个开放的模型。图二是一个多边形角色模型大家注意这个人物的面部基本上都是由四边形和三角形组成的。我们可以用多边形为任何事物建模,事实上,没有多少事物不能使用多边形建模,通过使用足够的细节,你可以创建任何表面,其中有些模型,更适合于用多边形方法建立,例如趋于正方形的模型使用多边形建模是最有效的。建筑模型是最常见的多边形建模。由于许多物体都有角,如窗,墙,门等,因而用多边形建模最合适。同时对于游戏和人物多边形方法尤为适用。但是,多边形建模也有它的不足,当表现细节过多时,随着面数的增加,机器的运行速度也会显著下降,这意味着在你创建多边形的时候不要为每个对象都创建过多的细节。伴随着细节问题出现的是编辑过多的细节模型的能力问题,在多边形模型中由于在细小的区域中存在大量的面,一个很小的变化需要很多的修改。有时我们会发现尽管使用了所有maya的选项工具来做模型,也很难完成想要的结果。这就需要大家在做角色等的建模时,要了解所设计的角色的生理结构,我们无论做的是多么夸张的角色模型,都有其生理结构的特点,那么在技术上的实现就明了了,例如图三一位老人,老人的形象非常的可爱,很吸引人,从中我们可以看到设计者深厚的美术功底。无论该角色夸张变形的程度如何,都可以看到角色的基本结构图。在这个作品中我们可以看到老人的交叉“手臂”强化了这个形象特征。所以我们要得到较好的变形效果,一般都是通过对基本结构某一部分的夸张变形得到的。这样变形的基础依赖于素描技能的培养。nurbs建模,是目前最流行的建模技术是nurbs方法,它不仅擅长于光滑表面,也适合于尖锐的边。似乎每个人都可以使用nurbs技术创建它们的三维模型-从电影角色到小汽车模型。nurbs建模允许你创建可以可被渲染但并不一定必须在现实的复杂细节,这意味着nurbs表面的构造和编辑都是相当简单的。nurbs表面是由一系列曲线和控制点确定的。编辑能力根据使用的表面或曲线的类型而有所不同。nurbs曲线可以由定位点或cv确定,定位点和节点类似,它位于曲线上,并直接控制着曲线的形状。cv点实际上不是正好在曲线上,而是属于栅格的一部分,它的作用像磁铁一样。当你在曲线附近移动cv时,cv就推拉曲线。cv的点控制着曲线上的点的响应。所有的cv都有既可以静态编辑,也可以动态编辑的点。曲面能充当nurbs表面的构件,但也能够象面片那样更直接的建立nurbs表面。如可以建立定位点表面或cv表面。使用哪一种方法取决于设计者喜欢怎样建模。cv点的作用就象用手指按压一团黏土而使之成型。定位点方式象用针尖去按充满胶的物体,它作用于点及与其接近的区域。凡是可以想象出来的东西都可以使用nurbs方法为其建模。nurbs方法最主要的好处是它具有多边形方法的建模及编辑的灵活性,但是不依赖于复杂的网格来细化表面。建模时你可以使用曲线来定义表面。这些表面在视口中看起来细节较少,但在渲染时却有更高层次的复杂度。许多动画设计者使用nurbs来建立人物角色,这主要是因为nurbs方法可以为你提供光滑的更接近轮廓的表面,并使网格保持相对较低的细节。由于人物角色一般比较复杂,因此与多边形方法相比使用nurbs可以提高性能。如图四,是一个nurbs人物模型,这里人物面的网格分布和接缝与多边形的建模方法是不一样的。谈起nurbs的弱点,很难指出它有什么严重的问题,至少目前是这样的。实际上,nurbs建模几乎可以用于任何场合。尽管如此,nurbs还是有一点不能和多边形建模相比,那就是简单。nurbs模型的最终设计比较复杂。用nurbs方法建模很难创建直角的nurbs曲面,大部分的nurbs模型需要有弯曲部分。这就是说,尽管一个模型看起来有直角,近距离看就会发现实际上在边的周围是光滑的。另外,nurbs模型的接缝问题在制作动画时也比复杂。nurbs建模方法比较适合无机类物体,maya的nurbs工具多来源于alias studio tools,但不包括一些用于精确计算的工具,所以不适合工业造型,只适合于视频动画的制作,它只重视不标准模型的塑造,精确性不高,最好不要从事专业的工业设计。细分曲面建模可以简化复杂物体的制作过程,他吸取了polygon和nurbs两种建模方法的技术优势,不但拥有多边形建模的灵活多变的强大功能,而且还能象nurbs模型一样保持模型的圆滑。对多边形进行多次细分,从而达到光滑细腻的效果,也就是说可以对局部区域的多边形进行细分,并能通过控制模型的渲染精度,是多边形建模的强有力的升级。但是细分技术出现的较晚,虽然其功能强大,但现在角色建模中还是以多边形的方法居多。maya软件还有独创的雕刻建模,直接使用雕刻建模,直接使用雕刻刀工具对表面进行雕刻,是建模过程更加形象化。maya同时还独创了立体绘图技术,可在模型表面直接绘制三维物体,如羽毛,胡须等。这些都是角色动画的重要工具,目前立体绘图技术仅局限于nurbs模型。另外还有纹理置换建模,是使用纹理贴图的黑白值去映射表面的几何体,常用于制造一些立体花纹,山脉地形等模型。综合这些建模技术。多边形模型就好比点阵图像,nurbs模型就好比矢量图形,支持无级缩放,但是无论是什么类型,最终进入渲染时都会以多边形方式进行解释和计算。寻找开始点的时候,首先要自问“哪儿是根基?”对于角色来说,通常是从人体重心开始然后向外扩展。从根基出发是开始建模过程的最可靠的方法。在选定使用哪一种建模方法后,开始应该考虑如何为自己的设计建模。无论选择选择的是多边形建模方法,nurbs建模方法或者是其它的方法,还是它们的组合,都要根据需要确定在模型中,哪儿是建模开始的最佳位置。以上介绍了有关maya的几种建模方法,同样适用于角色建模,具体选择哪一种,主要在于自己的熟练程度和习惯。第三章maya的c+应用程序编程接口maya的开发体系是一个三层体系结构,底层是maya核心,中间层是c+api,高层是用户或开发人员。maya核心由alias wave front开发的所有内部函数和数据组成,用户及普通开发人员不能直接访问。与maya核心的所有通信,包括创建、操纵或删除数据,都必须通过c+api层进行。c+api层又称为maya抽象层,是由一组c+类组成的,这些类的成员函数定义了用于访问和控制maya核心的全部方法。用户或开发者可以调用中间层c+api的函数来创建、获取和操纵maya数据。三层体系结构的好处是显著的。第一,开发人员不必详细了解maya核心当前实现的细节;第二,maya工程师对maya核心的改进不会直接影响原先的api插件的正常运行;第三,c+api作为中间层,对致命性错误有过滤作用,这些致命性错误往往会导致maya关键数据的丢失。maya c+api可以创建的maya功能插件,除了dg节点以外,还有maya命令、变形器、着色器、操纵器、定位器、动力场、发射器等。3改进的maya自定义节点的创建方法在自定义节点创建之前,需要先建立场景,确定所有需要控制的场景属性,如某物体的位置属性,速度属性,甚至更复杂的材质、灯光等等。这些场景属性将与节点的属性关联,实现数据的交互,以实现节点的个性化控制。3.1 maya的c+编程环境的搭建搭建maya编程环境是利用c+api开发maya插件(包括自定义节点)的基础。本文选用maya6.0和visual c+.net,在microsoft windows平台下建立编程开发环境。参考maya帮助或maya官方网站,完成maya的c+编程环境的搭建,在vc.net中将会生成maya plug-in wizard(maya插件向导)。通过该向导会自动生成开发所必需的工作区、项目和一些源代码文件,可以大大减轻开发者的工作量。3.2项目工程组的建立使用vc.net的maya plug-in wizard向导来创建maya节点插件,并在向导中选取dependency graph node,以明确开发的插件是节点类型。完成工程创建后,在项目工程组里将自动生成plugin main. cpp和以节点为名的程序文件,如创建的节点为attraction,则将自动生成attraction node. cpp和attraction node.h。在文件plugin main. cpp中的initialize plugin()和uninitialize plugin()函数用于节点的注册和注销,以及一些错误检查,保留其默认内容完全可以满足一般节点的要求。attraction node.h中定义了以mpx node为基类的节点类,如class attraction:public mpxnode。节点类的成员变量中包含了所有的节点属性(node attribution),可根据节点的实际需求增加或修改。节点类在默认情况下,定义了三个的成员函数,缺一不可,一是creator()函数,用于创建节点时,实例化自身;二是compute()函数,用于节点计算的具体实现;三是initialize()函数,用于节点属性的初始化设置。这三个成员函数的函数体均在attractionnode.cpp中得到具体实现。在节点类中,除了computer()以外的所有成员变量和函数均是静态的,即所有实例对象共享这些数据。3.3节点属性的增加和修改一个节点可以有多个输入属性和多个输出属性,作为节点类的成员变量存在,如:static mobject inat,inav,inbt,inbv,outat,outav,outbt,outbv,frame,id;输入/输出属性变量均是mobject的实例对象,对于c+api来说,输入/输出属性的数据都是具有maya数据结构的,属性变量的输入/输出性由具体程序操作使用决定。程序从输入属性中获取数据,经过计算,将新的数据传给输出属性。所有maya节点都具有唯一的标识号,mtypeid类的实例对象id就是自定义节点的标识号,其值定义在区间(00x7ffff)内,以区别maya内部节点,避免产生节点冲突。3.4算法实现节点属性的计算是在函数computer()中完成的,该函数带有两个参数,一个是mplug类型的plug,用于指示哪个节点属性需要重新计算,另一个是m dat-a block类型的data,包含了节点当前要使用的所有数据。其函数声明方法是“mstatus compute(const m plug & plug, m data block & data)”。需要指出的是,节点的属性与属性数据是有区别的,属性是创建节点所需使用的属性数据的结构和蓝图,而具体的属性数据存储在mdatablock类的对象data中,并通过mplug类的对象plug来获取和设置其状态和其他信息。(1)发出重新计算请求利用对象plug来监视属性的状态,仅当属性处于未更新状态时,才进入具体的算法模块计算新的数据,并更新属性数据。如,代码块if(plug=outat|plug=outav).,就实现了对输出属性out at和out av的监视。(2)输入属性数据的获取和设置当监视到某个属性需要更新时,首先要获得输入属性的数据,以用于具体计算。具体方法是通过参数data,调用mdata block类的input value()函数获取输入属性句柄对象,此函数将返回一个m data handle类型的对象,该对象为只读,不能改写。如,mdatahandledatinat=data.inputvalue(inat,&returnstatus);对象datinat具有只读性,需调用mdatahandle类相应的函数进行数据转换。如,mvector at=datinat.asvector();即,将对象datinat的数据赋予maya向量类型变量at。不同类型的数据可调用相应的as方法转换,常用的还有asint(),asfloat(), asdouble() ,aslong()等。上述操作使节点属性inat的当前属性数据传递给了变量at,而变量at才是实际算法中真正可使用的属性值。(3)具体算法不同的自定义节点有不同的算法,但最根本的就是根据所得到的输入数据产生新的有用数据。比如,模拟两物体(a和b)之间的引力作用,可用以下代码实现,mvector oat,obt;/记录新数据if(f=1)/第一帧,通常做初始化工作/按节点实际需求初始属性变量else/其他帧/通常是具体的算法内容attractive(at,bt,oat,obv);/计算函数上述代码的算法非常简单,功能效果也略显单调,但只要开发者融入自己的思想,就可以开发出个性化功能。(4)更新节点的当前输出属性数据通过计算,新的数据已经产生了,需要将这些数据传递给当前输出属性,以实现数据更新。同输入属性数据的获取一样,需先通过mdatablock类的out-putvalue函数获取节点的输出属性的mdatahandle类对象,该对象不可读,只可写。如,mdatahandle datoutat=data.outputvalue(attraction:outat,&returnstatus);然后,调用mdatahandle类set()函数进行数据更新,当然更新数据的类型必须与输出属性数据一致或兼容。如,datoutat.set(oat);最后,还要清除plug标记,即说明属性已被重新计算,如,data.setclean(outat);3.5节点的初始化定义initialize()函数定义了节点属性的初始化设置,分为三步操作。(1)属性创建和设置。在c+api中,一个属性的创建和编辑是通过mattribute类及其派生类完成的,有mfnnumericattribute、mfnunitattribute、mfntype-dattribute等等。其中mfnnumericattribute类是最常用的,在该类中定义了两种create()函数来实现节点属性的创建。如:mfnnumericattribute nattr;frame=nattr.create(frame,f,mfnnumericdata:kint,1);其参数依次是maya长名,maya短名,数据类型,默认值为1,状态返回(缺省);inat=nattr.create(ina_position,iat,inatx,inaty,inatz);其参数依次是长名,短名,子属性1,子属性2,子属性3,状态返回(缺省)。上述代码将实现属性frame和inat的创建,其中子属性inatx是inat的x分量,也是节点的属性,需在节点类的成员变量中事先声明。(2)属性添加。属性创建和设置完之后,所有的属性需调用mpxnode类的addattribute()函数添加到节点中去。如,addattribute(inat);addattribute(frame);(3)属性影响。属性虽然已经添加到了自定义的节点中去了,但该节点仍然不能正常工作,还需定义属性之间的影响,确定输入属性与输出属性的关系。建立属性影响需调用mpxnode类的attributeaffects()函数。如,attributeaffects(inat,outat);attributeaffects(frame,outat); 这样,输出属性outat就受到输入属性inat和frame的影响,当inat和frame变化时,outat就需要更新计算。3.6编译链接和节点加载完成上述步骤,则节点类已被创建,随后调试程序,并编译链接生成动态链接文件,如attraction.mll,该文件名称由vc.net在新建工程组时,利用maya plug-in wizard插件向导自定义的,默认文件名mycmd.mll。这些mll文件类似于windows的dll文件,区别在于mll文件只能由maya调用。进入maya总菜单栏的windo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论