ImageVerifierCode 换一换
格式:DOCX , 页数:14 ,大小:182.82KB ,
资源ID:7137050      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7137050.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(X文件解析.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

X文件解析.docx

1、X文件解析在三维图形程序设计中,网格模型占有非常重要的地位,而且也是比较复杂的部分,特别是包含动画和蒙皮信息的网格模型。.x文件格式分析.x文件格式最初是为传统的Direct3D保留模式而设计的,在DirectX 6.0问世后,针对立即模式对它作过一次扩展。要想在Direct3D程序中灵活自如地使用网格模型,应当深入理解.x文件格式。.x文件是由模板(template)驱动的,模板定义了如何存储一个数据对象,这样用户便可以自己定义具体的格式。Direct3D预定义了许多模板,这些预定义的模板位于rmxftmpl.h中,模板标识符都在rmxfguid.h中,通用文件DXUTMesh.cpp包含了

2、这两个头文件。模板所允许的数据类型称为可选成员(optional member),这些可选成员作为数据对象的子对象来保存,子对象可以是另一种数据类型或对先前数据对象的引用,或是一个二进制对象。来看一个.x文件(cube_1.x)的完整内容:xof 0302txt 0064Header 1; 0; 1;Mesh Cube /网格 8; /8个顶点,以下为8个顶点的坐标 1.000000;1.000000;-1.000000;, -1.000000;1.000000;-1.000000;, -1.000000;1.000000;1.000000;, 1.000000;1.000000;1.0000

3、00;, 1.000000;-1.000000;-1.000000;, -1.000000;-1.000000;-1.000000;, -1.000000;-1.000000;1.000000;, 1.000000;-1.000000;1.000000; 12; / 12个面, 以下为每个面三个顶点的索引 3;0,1,2;, 3;0,2,3;, 3;0,4,5;, 3;0,5,1;, 3;1,5,6;, 3;1,6,2;, 3;2,6,7;, 3;2,7,3;, 3;3,7,4;, 3;3,4,0;, 3;4,7,6;, 3;4,6,5;该模型的效果图如下:第一行文件头中的 xof告诉程序,它

4、加载的文件是一个.x文件,0302表示它使用的是DirectX 3.2 版本的模板,txt表示这些数据是以文本形式存储的,0064定义了浮点数的位数是64位。文件头后面的一个数据块涉及了模板和数据对象等内容。一个模板和一个数据对象之间的差异在于所有的模板都是以一个template单词开始,模板看起来很像一个C语言的结构定义,数据对象就是那些模板的实例。使用模板定义包含在.x文件里的数据对象(一个模板定义了数据对象的布局),每个模板都可以通过一个数据类型的集合去定义并容纳任何类型的数据。同时,任何数据类型的组合都可以在一个模板里使用。模板header的定义如下:template Header W

5、ORD major; WORD minor; DWORD flags;各成员分别表示.x文件最大版本,最小版本,以及定义方式。.x文件中涉及模板的概念,它由四部分组成:第一部分是模板的名字,可是由数字、字符、下划线构成,但不能以数字开头,第二部分是GUID(Global Unique Identifier,全局唯一标识符),第三部分由各个数据项构成,最后一部分用于控制模板的限制程度,一个模板可以是开放的、闭合的或受限的。开放模板的定义在结束部位有一个待展开的方括号.表示它可以包含其他数据类型,封闭模板不能包含其他任何数据类型,受限模板只能包含特定的数据类型。模板的使用与结构体有相似之处。一般情

6、况下,.x文件都至少包含一个Mesh模板,其定义如下:template Mesh DWORD nVertices; array Vector verticesnVertices; DWORD nFaces; array MeshFace facesnFaces; .Where: nVertices - Number of vertices. array Vector verticesnVertices - Array of vertices, each of type Vector. nFaces - Number of faces. array MeshFace facesnFaces -

7、Array of faces, each of type MeshFace. . - Any .x file template can be used here. This makes the architecture extensible. Material and TextureFilename templates are typically used. Mesh模板是一个开放的模板,同时它还用到了Vector模板和MeshFace模板,它们的定义如下:Defines a vector. template Vector float x; float y; float z; template

8、 MeshFace DWORD nFaceVertexIndices; array DWORD faceVertexIndicesnFaceVertexIndices; Where: nFaceVertexIndices - Number of indices. array DWORD faceVertexIndicesnFaceVertexIndices - Array of indices. 因为没有为网格模型设置材质和纹理等信息,所以该文件显示效果是一个黑色立方体,接下来将为该立方体添加材质、法线和纹理信息。我们在cube_1.x的基础上添加材质、法线和纹理,构成cube_2.x:效果图

9、如下:可以看到在Mesh模板中嵌套着一个子模板MeshMaterialList,它是Mesh模板的一部分,用来将每个面与材质相关联,其定义如下:template MeshMaterialList DWORD nMaterials; DWORD nFaceIndexes; array DWORD faceIndexesnFaceIndexes; Material Where: nMaterials - A DWORD. The number of materials. nFaceIndexes - A DWORD. The number of indices. faceIndexesnFaceI

10、ndexes - An arrray of DWORDs containing the face indices. MeshMaterialList是一个受限的模板,它只能包含Material模板,其定义如下:template Material ColorRGBA faceColor; FLOAT power; ColorRGB specularColor; ColorRGB emissiveColor; . Where: faceColor - Face color. A ColorRGBA template. power - Material specular color exponent

11、. specularColor - Material specular color. A ColorRGB template. emissiveColor - Material emissive color. A ColorRGB template. template ColorRGBA float red; float green; float blue; float alpha; template ColorRGB float red; float green; float blue; 在cube_2.x中,首先定义了两个材质RedMaterial和GreenMaterial:Materi

12、al RedMaterial /第一块材料 1.000000;0.000000;0.000000;1.000000; / R = 1.0, G = 0.0, B = 0.0 0.000000; 0.000000;0.000000;0.000000; 0.000000;0.000000;0.000000; TextureFilename Tex1.jpg; /纹理文件名 Material GreenMaterial /第二块材料 0.000000;1.000000;0.000000;1.000000; / R = 0.0, G = 1.0, B = 0.0 0.000000; 0.000000;

13、0.000000;0.000000; 0.000000;0.000000;0.000000; TextureFilename Tex2.jpg; /纹理文件名 在模板MeshMaterialList中则给出了各个面与材质的关联信息:/网格材质列表MeshMaterialList 2; /使用材质的数量:2块材质 12; /为12个面指定材质 0, /为前6个面使用第一块材质 0, 0, 0, 0, 0, 1, /为后面的6个面使用第二块材质 1, 1, 1, 1, 1; RedMaterial /第一块材质,引用前面定义的RedMaterial材质 GreenMaterial /第二块材质,引

14、用前面定义的GreenMaterial材质其中,RedMaterial和GreenMaterial是对上面定义的材质模板对象的引用。在光照模型运算时需要用到法向量,法向量分为面法向量和顶点法向量。在基于逐顶点计算的光照模型中,需要使用顶点法向量。通常顶点法向量的计算过程是:先将共享该顶点的几个面的面法向量相加并除以共享该顶点的面的个数,接着归一化这个结果。模板MeshNormals用来指定法向量:template MeshNormals DWORD nNormals; array Vector normalsnNormals; DWORD nFaceNormals; array MeshFac

15、e faceNormalsnFaceNormals; Where: nNormals - Number of normals. array Vector normalsnNormals - Array of normals. nFaceNormals - Number of face normals. array MeshFace faceNormalsnFaceNormals - Array of mesh face normals. 在文件cube_2.x中,法向量的定义以及为面指定法向量的内容如下:/顶点法线MeshNormals 8; /定义8个法线向量 0.333333;0.6666

16、67;-0.666667;, -0.816497;0.408248;-0.408248;, -0.333333;0.666667;0.666667;, 0.816497;0.408248;0.408248;, 0.666667;-0.666667;-0.333333;, -0.408248;-0.408248;-0.816497;, -0.666667;-0.666667;0.333333;, 0.408248;-0.408248;0.816497; 12; /为12个面的每个顶点指定法线 3;0,1,2;, 3;0,2,3;, 3;0,4,5;, 3;0,5,1;, 3;1,5,6;, 3;

17、1,6,2;, 3;2,6,7;, 3;2,7,3;, 3;3,7,4;, 3;3,4,0;, 3;4,7,6;, 3;4,6,5;模板TextureFilename用于引用纹理,它通常作为Material模板对象的子对象出现,其定义如下:template TextureFilename string filename; 在使用TextureFilename模板时,只需要使用字符串filename指定一个纹理文件名即可,但要将这幅纹理映射到网格模型中,还需要指定纹理坐标:template MeshTextureCoords DWORD nTextureCoords; array Coords2

18、d textureCoordsnTextureCoords ; Where: nTextureCoords - Number of texture coordinates. array Coords2d textureCoordsnTextureCoords - Array of 2D texture coordinates. template Coords2d float u; float v; u - u coordinate value. v - v coordinate value. 在cube_2.x中,定义纹理坐标的代码如下:/纹理坐标MeshTextureCoords 8; /定

19、义8对纹理坐标 0.000000;1.000000; 1.000000;1.000000; 0.000000;1.000000; 1.000000;1.000000; 0.000000;0.000000; 1.000000;0.000000; 0.000000;0.000000; 1.000000;0.000000;通过前面的介绍,可以建立起一个网格模型,但这个网格模型是浑然一体的,而在现实生活中,为了能独立对一个物体的不同部分进行变换,必须将模型分割成不同的模块,在.x文件中使用框架(frame)对一个网格模型的不同部分进行组织和管理。框架仅仅是一个外壳,在框架中通常需要包含具体的网格和一个

20、框架变换矩阵,其中框架变换矩阵用于指定该框架包含的部分在整个模型中的初始位置。模板Frame和FrameTransformMatrix的定义如下:template Frame . template FrameTransformMatrix Matrix4x4 frameMatrix; template Matrix4x4 array float matrix16; 框架可以嵌套,即一个框架可以由许多子框架构成。例如为了模拟一个人的网格模型,整体可以由头部、胸部、左臂、右臂、左腿、右腿等框架组成,而左、右臂又可以由上臂、下臂和手三个框架组成,而手又可以由五指和手掌6个框架组成,甚至每个手指还可以

21、继续细分。我们在cube_2.x的基础上添加框架构成cube_3.x:为了使一个.x文件产生动画,必须至少提供一个动画集,每个动画集都应具有一个对某个框架的引用。模板 AnimationSet用来定义动画集:template AnimationSet Animation 模板Animation的定义如下:template Animation .很显然,Animation是一个完全开放的模板,一般情况下,用模板AnimationKey来填充它,模板AnimationKey的定义如下:template AnimationKey DWORD keyType; DWORD nKeys; array T

22、imedFloatKeys keysnKeys;Where: keyType - Specifies whether the keys are rotation, scale, position, or matrix keys (using the integers 0, 1, 2, or 4, respectively). nKeys - Number of keys. keys - An array of keys. 在模板AnimationKey中,keyType可取的值是0、1、2、4。0表示旋转键,在.x文件中,用一个四元数来实现模型的旋转,旋转值使用4个分量w、x、y、z来存储,也

23、就是说,此时变换数组的大小是4,它依次存储四元数的4个分量。1表示缩放键,可以使用这种类型的关键帧实现模型的缩放,此时变换数组的大小是3,它们分别对应x、y、z轴的缩放值。2表示平移键,使用3个分量实现模型的平移,此时变换数组的大小是3,它们分别对应沿x、y、z轴的平移值。4表示变换矩阵键,此时关键帧的变换数组使用16个浮点数来实现该模型的各种变换。因为矩阵可以实现模型的平移、旋转、缩放以及它们的组合变换。模板AnimationKey用来定义一组动画关键帧,而模板TimeFloatKeys用来定义每个动画关键帧:template TimedFloatKeys DWORD time; Float

24、Keys tfkeys; Where: tfkeys - See FloatKeys. template FloatKeys DWORD nValues; array float valuesnValues; nValues - Number of floats. valuesnValues - Array of float values. 我们在cube_3.x的基础上添加动画部分形成cube_4.x,该动画集定义了立方体绕y轴旋转,增加部分如下:AnimationSet AnimationSet0 /动画集 Animation Animation0 /动画 CubeFrame /引用上面的

25、立方体框架,表示下面的动画是针对立方体框架的 AnimationKey /动画键 沿Y轴旋转网格 0; / Rotation keys 10; / 9 keys 1000; 4; 0.000000, 0.15643448, 0.000000, 0.98768836;, 2000; 4; 0.000000, 0.30901700, 0.000000, 0.95105654;, 3000; 4; 0.000000, 0.45399046, 0.000000, 0.89100653;, 4000; 4; 0.000000, 0.58778530, 0.000000, 0.80901694;, 500

26、0; 4; 0.000000, 0.70710671, 0.000000, 0.70710683;, 6000; 4; 0.000000, 0.80901694, 0.000000, 0.58778530;, 7000; 4; 0.000000, 0.89100653, 0.000000, 0.45399052;, 8000; 4; 0.000000, 0.95105654, 0.000000, 0.30901697;, 9000; 4; 0.000000, 0.98768836, 0.000000, 0.15643449;, 10000; 4; 0.000000, 1.0000000, 0.000000, 0.00000000; 这里一共定义了10个关键帧,在第10个关键帧时回到初始位置开始新一轮的动画。CubeFrame表示该动画集是对框架CubeFrame进行的操作。我们在cube_3.x的基础上添加缩放动画形成cube_5.x:AnimationSet AnimationSet0 /动画集 Animation Animation0 /动画 CubeFrame / Use the frame containing the cube. AnimationKey /动画键, 放大和缩小网格 1; / Scaling keys 9; /

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1