X文件解析.doc_第1页
X文件解析.doc_第2页
X文件解析.doc_第3页
X文件解析.doc_第4页
X文件解析.doc_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

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

文档简介

在三维图形程序设计中,网格模型占有非常重要的地位,而且也是比较复杂的部分,特别是包含动画和蒙皮信息的网格模型。.x文件格式分析.x文件格式最初是为传统的Direct3D保留模式而设计的,在DirectX 6.0问世后,针对立即模式对它作过一次扩展。要想在Direct3D程序中灵活自如地使用网格模型,应当深入理解.x文件格式。.x文件是由模板(template)驱动的,模板定义了如何存储一个数据对象,这样用户便可以自己定义具体的格式。Direct3D预定义了许多模板,这些预定义的模板位于rmxftmpl.h中,模板标识符都在rmxfguid.h中,通用文件DXUTMesh.cpp包含了这两个头文件。模板所允许的数据类型称为可选成员(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.000000;,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告诉程序,它加载的文件是一个.x文件,0302表示它使用的是DirectX 3.2 版本的模板,txt表示这些数据是以文本形式存储的,0064定义了浮点数的位数是64位。文件头后面的一个数据块涉及了模板和数据对象等内容。一个模板和一个数据对象之间的差异在于所有的模板都是以一个template单词开始,模板看起来很像一个C语言的结构定义,数据对象就是那些模板的实例。使用模板定义包含在.x文件里的数据对象(一个模板定义了数据对象的布局),每个模板都可以通过一个数据类型的集合去定义并容纳任何类型的数据。同时,任何数据类型的组合都可以在一个模板里使用。模板header的定义如下:template Header WORD major; WORD minor; DWORD flags;各成员分别表示.x文件最大版本,最小版本,以及定义方式。.x文件中涉及模板的概念,它由四部分组成:第一部分是模板的名字,可是由数字、字符、下划线构成,但不能以数字开头,第二部分是GUID(Global Unique Identifier,全局唯一标识符),第三部分由各个数据项构成,最后一部分用于控制模板的限制程度,一个模板可以是开放的、闭合的或受限的。开放模板的定义在结束部位有一个待展开的方括号.表示它可以包含其他数据类型,封闭模板不能包含其他任何数据类型,受限模板只能包含特定的数据类型。模板的使用与结构体有相似之处。一般情况下,.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 - 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 MeshFace DWORD nFaceVertexIndices; array DWORD faceVertexIndicesnFaceVertexIndices; Where: nFaceVertexIndices - Number of indices. array DWORD faceVertexIndicesnFaceVertexIndices - Array of indices. 因为没有为网格模型设置材质和纹理等信息,所以该文件显示效果是一个黑色立方体,接下来将为该立方体添加材质、法线和纹理信息。我们在cube_1.x的基础上添加材质、法线和纹理,构成cube_2.x:效果图如下:可以看到在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. faceIndexesnFaceIndexes - 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. 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:Material RedMaterial /第一块材料1.000000;0.000000;0.000000;1.000000; / R = 1.0, G = 0.0, B = 0.00.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.00.000000;0.000000;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 /第二块材质,引用前面定义的GreenMaterial材质其中,RedMaterial和GreenMaterial是对上面定义的材质模板对象的引用。在光照模型运算时需要用到法向量,法向量分为面法向量和顶点法向量。在基于逐顶点计算的光照模型中,需要使用顶点法向量。通常顶点法向量的计算过程是:先将共享该顶点的几个面的面法向量相加并除以共享该顶点的面的个数,接着归一化这个结果。模板MeshNormals用来指定法向量:template MeshNormals DWORD nNormals; array Vector normalsnNormals; DWORD nFaceNormals; array MeshFace 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.666667;-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;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 Coords2d 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; /定义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)对一个网格模型的不同部分进行组织和管理。框架仅仅是一个外壳,在框架中通常需要包含具体的网格和一个框架变换矩阵,其中框架变换矩阵用于指定该框架包含的部分在整个模型中的初始位置。模板Frame和FrameTransformMatrix的定义如下:template Frame . template FrameTransformMatrix Matrix4x4 frameMatrix; template Matrix4x4 array float matrix16; 框架可以嵌套,即一个框架可以由许多子框架构成。例如为了模拟一个人的网格模型,整体可以由头部、胸部、左臂、右臂、左腿、右腿等框架组成,而左、右臂又可以由上臂、下臂和手三个框架组成,而手又可以由五指和手掌6个框架组成,甚至每个手指还可以继续细分。我们在cube_2.x的基础上添加框架构成cube_3.x:为了使一个.x文件产生动画,必须至少提供一个动画集,每个动画集都应具有一个对某个框架的引用。模板 AnimationSet用来定义动画集:template AnimationSet Animation 模板Animation的定义如下:template Animation .很显然,Animation是一个完全开放的模板,一般情况下,用模板AnimationKey来填充它,模板AnimationKey的定义如下:template AnimationKey DWORD keyType; DWORD nKeys; array TimedFloatKeys 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来存储,也就是说,此时变换数组的大小是4,它依次存储四元数的4个分量。1表示缩放键,可以使用这种类型的关键帧实现模型的缩放,此时变换数组的大小是3,它们分别对应x、y、z轴的缩放值。2表示平移键,使用3个分量实现模型的平移,此时变换数组的大小是3,它们分别对应沿x、y、z轴的平移值。4表示变换矩阵键,此时关键帧的变换数组使用16个浮点数来实现该模型的各种变换。因为矩阵可以实现模型的平移、旋转、缩放以及它们的组合变换。模板AnimationKey用来定义一组动画关键帧,而模板TimeFloatKeys用来定义每个动画关键帧:template TimedFloatKeys DWORD time; FloatKeys 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 /引用上面的立方体框架,表示下面的动画是针对立方体框架的AnimationKey /动画键 沿Y轴旋转网格0; / Rotation keys10; / 9 keys1000; 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;,5000; 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 keys9; / 9 keys1000; 3; 1.000000, 1.000000, 1.000000;,2000; 3; 0.800000, 0.800000, 0.800000;,3000; 3; 0.600000, 0.600000, 0.600000;,4000; 3; 0.400000, 0.400000, 0.400000;,5000; 3; 0.200000, 0.200000, 0.200000;,6000; 3; 0.400000, 0.400000, 0.400000;,7000; 3; 0.600000, 0.600000, 0.600000;,8000; 3; 0.800000, 0.800000, 0.800000;,9000; 3; 1.000000, 1.000000, 1.000000;效果图:我们也可以在cube_3.x的基础上添加一个沿y轴移动的动画形成cube_6.x:AnimationSet AnimationSet0 /动画集Animation Animation0 /动画CubeFrame / Use the frame containing the cube.AnimationKey /动画键 沿Y轴方向移动网格2; / Position keys19; / 9 keys1000; 3; 0.000000, -5.000000, 0.000000;,2000; 3; 0.000000, -4.000000, 0.000000;,3000; 3; 0.000000, -3.000000, 0.000000;,4000; 3; 0.000000, -2.000000, 0.000000;,5000; 3; 0.000000, -1.000000, 0.000000;,6000; 3; 0.000000, 0.000000, 0.000000;,7000; 3; 0.000000, 1.000000, 0.000000;,8000; 3; 0.000000, 2.000000, 0.000000;,9000; 3; 0.000000, 3.000000, 0.000000;,10000; 3; 0.000000, 4.000000, 0.000000;,11000; 3; 0.000000, 5.000000, 0.000000;,12000; 3; 0.000000, 4.000000, 0.000000;,12000; 3; 0.000000, 3.000000, 0.000000;,13000; 3; 0.000000, 2.000000, 0.000000;,14000; 3; 0.000000, 1.000000, 0.000000;,15000; 3; 0.000000, 0.000000, 0.000000;,16000; 3; 0.000000, -1.000000, 0.000000;,17000; 3; 0.000000, -2.000000, 0.000000;,18000; 3; 0.000000, -3.000000, 0.000000;,19000; 3; 0.000000, -4.000000, 0.000000;,效果图:包含在.x文件中的动画通常用来实现模型不同部分之间的相对运动,对于一个模型整体上的运动,应该是在程序中通过其世界变换矩阵来实现。蒙皮信息一个动画网格模型很多情况下可能涉及到蒙皮信息,模板XSkinMeshHeader仅对于具有蒙皮信息的网格模型有效,它用来记录网格模型的蒙皮信息,该模板的定义如下:template XSkinMeshHeader WORD nMaxSkinWeightsPerVertex;

温馨提示

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

最新文档

评论

0/150

提交评论