【Visual C++】游戏开发笔记四十四 浅墨DirectX教程十二 格模型和X文件使用面面观

 

文章链接: http://blog.csdn.net/zhmxy555/article/details/8586540



在本篇文章中,我们一起详细探索了Direct3D 格相关的知识,对当前两款主流的三维建模软件(3DS Max和Maya)进行了介绍,了解了如何从3DS Max 中导出X文件,以及如何从X文件加载三维模型到DirectX游戏程序中。文章最后,我们依旧配了一个比较好玩的demo来让大家对本篇文章所学的知识融会贯通,最后提供了这个demo详细注释的源代码下载。


首先我们复习一个之前讲过的概念。

在计算机所描绘的3D世界中,所有的物体模型(如树木,人物,山峦)都是通过多边形 格来逼近表示的,就像这幅DOTA中的英雄幻影刺客(PA)的对比图一样:

幻影刺客镇文~嗯,我们开讲~

 


一、 格模型技术的前生今世


格模型是一种将物体模型的顶点数据、纹理、材质等信息存储在一个外部文件中的3D物体模型。对于那些简单的图元描述的图形,比如点,线,三角形等等,我们可以通过写代码指定顶点数据,索引数据,法线向量,纹理和材质等等信息。但对于复杂的3D物体的话,采用这种方式显然是不现实的。因此,Direct3D提供了一种称作 格模型的技术,可以从各种特定的文件格式中读取和绘制3D图形,极大地方便了游戏的开发。

使用 格模型最普遍的方式是从外部的3D模型文件中加载一个 格。而这些3D模型通常都是由3D建模软件生成的,比较复杂的 格数据。目前市面上主流的3D建模软件有3DS Max和Maya。而目前流行的3D模型文件格式有.3ds、.max、.obj以及.mb。其中.3ds、.max为3DS Max常用的格式,.mb为Maya常用的格式,而.obj为3DSMax和Maya通用的文件格式。

 

 


二、认识三维建模软件


再不厌其烦地说一遍,我们在通常的三维游戏开发中,常常要涉及到非常复杂的三维物体数据模型,如果用我们之前讲的知识,顶点缓存索引缓存,通过写代码来构造这些三维模型,显然是不合实际的。

这些复杂物体的模型通常需要利用专业的三维建模软件来制作。目前市面上主流的3D建模软件有3DS Max和Maya。这两款在三维建模行业作为竞争对手的软件,目前同为Autodesk公司所有,这倒是有些令人匪夷所思。下面我们先来分别介绍一下当前市场上主流的三维建模软件(当然,不仅仅是用于三维建模这么简单)3DS Max和Maya。

Ⅰ、3DS Max软件简介


Ⅱ、Maya软件简介

 

 

Ⅲ、Maya和3ds Max的区别与联系


MAYA和3d Max都是高端3D软件,两者之间都有很多相同的功能,像创建模型,渲染材质,动画制作等等.但就运用实际情况而言,Max更加适合于游戏,建筑学,室内设计等等,而MAYA可以说是专门为影视特效而生的一款软件,这也是当初Alias设计MAYA的意图.MAYA在如角色动画/运动学模拟/以及完美的材质系统,使得MAYA所创造出来的3维效果如此逼真,可以说全世界的电影特效工作室都必须用到MAYA

MAYA 的用户界面也比3dsmax要人性化点,Maya 是 Alias|Wavefront ( 2003 年 7月 更名为 Alias )公司的产品,作为三维动画软件的后起之秀,深受业界欢迎和钟爱。

MAYA软件应用主要是动画片制作、电影制作、电视栏目包装、电视广告、游戏动画制作等。3dsmax软件应用主要是动画片制作、游戏动画制作、建筑效果图、建筑动画等。 MAYA的基础层次更高,3dsmax属于普及型三维软件,有条件当然学MAYA。

Maya的CG功能十分全面,建模、粒子系统、毛发生成、植物创建、衣料仿真等等。可以说,当3dsmax用户匆忙地寻找第三方插件时,Maya用户已经可以早早地安心工作了。可以说,从建模到动画,到速度,Maya都非常出色。Maya主要是为了影视应用而研发的。

3d MAX和Maya都是功能强大的三维制作软件,各有很大优点,但是,不同的行业用不同的软件会让制作比较轻松,所以说,3d MAX和Maya究竟哪个好,哪个更好用与所从事的行业有着一定联系。

3d MAX在建筑动画效果上要强于Maya,而Maya在影视动画上又略胜于3d max,两款软件没有太大的本质性区别,只是看个人掌握哪个软件比较顺手罢了。

目前,业内已开始对软件使用做了一些细分。3d max主要用来做建筑,国内多数公司喜欢拿他做游戏,附带着可以做影视动画,建模比较方便。Maya主要用来做影视动画,在动画和动力学模块上很强大,国内不少游戏公司慢慢将max转Maya了。其他的栏目包装,广告等两者都可用到。最终没有谁好谁坏之分,只有用处不同,两软件都是相通的。以前国内学Maya的不多,因为没有中文版,教程也少,现在不一样了,教程也是不少了。

3d MAX和Maya各有其优势,用户可以根据自身的项目需求自主选择软件,其最大的区别就是3d MAX可以不费力气得到你想要的东西,Maya可能要花很多精力但是可以做出随心所欲的东西,灵活性要强。

Maya和3ds Max都可以做出如下效果(虽然这些模型本身是3ds Max做出来的):

擎天柱



三、对X文件的认识

 

在Direct3D中,我们一般都采用.X文件来存储 格数据。X文件格式是微软定义的3D模式文件格式,其中包括 格的纹理,动画以及用户定义对象的一些数据等。需要注意的是,.X文件通常并未存储具体的纹理数据,它只包含纹理贴图的文件名,所以我们常常会发现,X文件会和一些图片文件比如.BMP、.DDS一同出没,放在一起,比如本次demo中我们使用的初音模型,除了.X文件本身miki.X之外,还有数十张BMP位图纹理图片配合着miki.X。

3DS Max 2012版本的Panda插件浅墨已经为大家准备好了,链接如下:

点击转到下载页面

下载之后,打开压缩包,把里面的对应安装版本位数的dle文件(32位对应X86字样,64位对应X64字样)放到3ds Max安装目录下的plugins之中,然后重启3ds Max即可。

例如浅墨自己的3ds Max2012安装在D盘的D:Program FilesAutodesk目录之下,那么对应的就在D:Program FilesAutodesk3ds Max 2012plugins目录中添加dle插件文件,如图:

 

第三个要素,也就是导出X文件的具体步骤了。

首先,正所谓巧妇难为无米之炊,我们需要有一个导出的对象,也就是一个三维的模型。模型嘛,可以自己用3ds Max现场做(想做出个像模像样的模型一时半会儿显然不现实,而且这一般都是美工童鞋的工作,我们可是写程序的筒子们),也可以自己去 上下载,这里推荐一个论坛,有大量的3D模型资源:http://www.cgmodel.cn/。比如我们在这个论坛下载了Dota英雄幻影刺客的.max模型。(记住目前主流的格式分.max和.mb两种,我们3ds Max用的是.max,而Maya用的是.mb,而另外一种.obj是万金油格式,3ds Max和Maya两者都可用,所以想在3ds Max与Maya之间通用的话,就用.obj)

好了,继续讲,我们下载好了Dota英雄幻影刺客的.max模型,解压缩包,点击HeroWarden.max模型文件,于是就打开了这个模型,如图。

然后会弹出一个名为【PandaSoft DirectX Exporter】的窗口,在里面我们可以进行一些导出模型参数的设定和修改。如下:

 

这样,如果我们想要在我们写的游戏程序中使用这个幻影刺客(守望者)的三维模型,把这两个文件一起放到我们工程中相应的地方就可以了。


另外提一点,Maya中可以用cvXporter插件来导出X文件,对应于3ds Max中的Panda插件。

 

之前讲了那么多无非是在为.X文件的诞生造势,下面就开始隆重介绍如何在Direct3D程序中载入X文件的具体知识吧~

 

而想利用.X文件来在游戏程序中载入三维模型的话,首先就需要将.X文件中的各种数据分别加载到内存中,而这些数据主要包括顶点数据、材质数据和纹理数据等等。首先,我们需要介绍一下与 格模型相关的一个重要的接口——ID3DXMESH。

 


五、 格模型接口ID3DXMESH


在Direct3D中,微软为我们提供了ID3DXMesh接口表示 格,这个接口继承自ID3DXBaseMesh接口。 格模型接口ID3DXMesh实际上是三维物体的顶点缓存的集合,他将为我们创建顶点缓存、定义灵活顶点格式和绘制顶点缓冲区等功能封装在一个COM对象中,这样复杂三维物体的绘制就显得非常简便了。

其中,ID3DXMESH接口中的D3DXCreateMesh()可用于创建一个Direct3D 格模型对象,我们可以在MSDN中查到该函数声明是这样的:

 

     

然后开始介绍一下这个函数。

■ 第一个参数, DWORD类型的NumFaces,表示创建 格模型的多边形数目。

■ 第二个参数, DWORD类型的NumVertices,表示创建 格的顶点数目。

■ 第三个参数, DWORD类型的Options,表示创建 格时的附加选项,他的取值为D3DXMESH枚举体中的一个或者多个值。这个枚举体定义如下:

 


一般情况下,我们都把这个Options取为D3DXMESH_SYSTEMMEM或者D3DXMESH_MANAGED,表示对Direct3D顶点缓冲区和索引缓冲区使用D3DPOOL_SYSTEMMEM或者D3DPOOL_MANAGED内存。

■ 第四个参数, const LPD3DVERTEXELEMENT9类型的*pDeclaration,表示顶点包含哪些信息。这个参数的作用类似于我们之间一直在用的灵活顶点格式(FVF),表示顶点包含了哪些具体数据,但是它却高于灵活顶点格式。它的类型LPD3DVERTEXELEMENT9表示顶点元素,主要用于我们来没讲到的可编程渲染流水线之中,在此我们暂且不用去多做考虑。

■ 第五个参数, LPDIRECT3DDEVICE9类型的pD3DDevice,就是我们的金钥匙,Direct3D设备的指针了。

■ 第六个参数, LPD3DXMESH类型的*ppMesh,指向我们创建好的 格模型对象指针的地址,用于返回创建好的 格模型对象。可以说我们调用D3DXCreateMesh就是为了创建并得到这个指针地址。后面关于我们创建好的 格模型的访问,都靠这个ppMesh参数了。

 

需要注意的是,这个创建好 格模型对象的D3DXCreateMesh函数我们通常很少直接去用它,而且直接用它往往也意义不大。它总是“真人不露相”,被封装在了其他Direct3D函数之中,默默地为我们服务。

介绍完 格模型接口ID3DXMESH相关的知识,下面就来看看从X文件载入模型的具体步骤。

 

 

 

六、X文件模型载入三步曲

 

Ⅰ.三步曲之一:通过.X文件加载 格模型

 

上面讲到了D3DXCreateMesh函数很少去直接应用,因为我们常常都是通过载入.X文件来生成 格模型的,用到的函数是D3DXLoadMeshFromX。我们可以在MSDN中查到这个函数的声明如下:

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2013年1月15日
下一篇 2013年1月16日

相关推荐