`
isiqi
  • 浏览: 16498752 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

D3D中.X文件的解析

阅读更多

一个完整的.X文件类似这样的结构:
xof 0303txt 0032
//定义模板
template FVFData {
<b6e70a0e-8ef9-4e83-94ad-ecc8b0c04897>
DWORD dwFVF;
DWORD nDWords;
array DWORD data[nDWords];
}

template EffectInstance {
<e331f7e4-0559-4cc2-8e99-1cec1657928f>
STRING EffectFilename;
[...]
}

template EffectParamFloats {
<3014b9a0-62f5-478c-9b86-e4ac9f4e418b>
STRING ParamName;
DWORD nFloats;
array FLOAT Floats[nFloats];
}

template EffectParamString {
<1dbc4c88-94c1-46ee-9076-2c28818c9481>
STRING ParamName;
STRING Value;
}

template EffectParamDWord {
<e13963bc-ae51-4c5d-b00f-cfa3a9d97ce5>
STRING ParamName;
DWORD Value;
}

//主框架
Frame BoxFrame{

FrameTransformMatrix {
1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,-22.441198,0.000000,-15.434750,1.000000;;
}

//Mesh对象
Mesh {
20;
-28.216623;0.000000;-55.879185;,
28.216623;0.000000;-55.879185;,
-28.216623;0.000000;55.879185;,
28.216623;0.000000;55.879185;,
-28.216623;54.767735;-55.879185;,
28.216623;54.767735;-55.879185;,
-28.216623;54.767735;55.879185;,
28.216623;54.767735;55.879185;,
-28.216623;0.000000;-55.879185;,
28.216623;54.767735;-55.879185;,
28.216623;0.000000;-55.879185;,
-28.216623;54.767735;-55.879185;,
28.216623;0.000000;55.879185;,
28.216623;54.767735;-55.879185;,
28.216623;0.000000;55.879185;,
-28.216623;54.767735;55.879185;,
-28.216623;0.000000;55.879185;,
28.216623;54.767735;55.879185;,
-28.216623;0.000000;55.879185;,
-28.216623;54.767735;-55.879185;;
12;
3;0,3,2;,
3;3,0,1;,
3;4,7,5;,
3;7,4,6;,
3;8,9,10;,
3;9,8,11;,
3;1,7,12;,
3;7,1,13;,
3;14,15,16;,
3;15,14,17;,
3;18,19,0;,
3;19,18,6;;

MeshNormals {
6;
0.000000;-1.000000;0.000000;,
0.000000;1.000000;0.000000;,
0.000000;0.000000;-1.000000;,
1.000000;0.000000;0.000000;,
0.000000;0.000000;1.000000;,
-1.000000;0.000000;0.000000;;
12;
3;0,0,0;,
3;0,0,0;,
3;1,1,1;,
3;1,1,1;,
3;2,2,2;,
3;2,2,2;,
3;3,3,3;,
3;3,3,3;,
3;4,4,4;,
3;4,4,4;,
3;5,5,5;,
3;5,5,5;;
}

MeshMaterialList {
1;
12;
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0;

Material {
0.341176;0.878431;0.560784;1.000000;;
0.000000;
0.341176;0.878431;0.560784;;
0.000000;0.000000;0.000000;;
}
}

MeshTextureCoords {
20;
1.000000;1.000000;,
0.000000;1.000000;,
1.000000;0.000000;,
0.000000;0.000000;,
0.000000;1.000000;,
1.000000;1.000000;,
0.000000;0.000000;,
1.000000;0.000000;,
0.000000;1.000000;,
1.000000;0.000000;,
1.000000;1.000000;,
0.000000;0.000000;,
1.000000;1.000000;,
0.000000;0.000000;,
0.000000;1.000000;,
1.000000;0.000000;,
1.000000;1.000000;,
0.000000;0.000000;,
0.000000;1.000000;,
1.000000;0.000000;;
}

EffectInstance tt{
"fdsfds";
}
}
}
1.其中的xof 0303txt 0032解释为:xof表示这是一个真正的X文件。0303txt表示通知程序使用Directx的X文件,版本为3.3的模版,其中txt表示此文件为文本文件,可读,并非是一个2进制文件。0032表示一个浮点数的位数为32,如果想要用64位的浮点数,可以写成0064。
2.模板的声明有三种类型:
template ClosedTemplate {
<4C9D055B-C64D-4bfe-A7D9-981F507E45FF>
DWORD ClosedData;
}
template OpenTemplate {
<4C9D055B-C64D-4bff-A7D9-981F507E45FF>
DWORD OpenData;
[...]
}
template RestrictedTemplate {
<4C9D055B-C64D-4c00-A7D9-981F507E45FF>
DWORD RestrictedData;
[ClosedTemplate]
[OpenTemplate]
}
ClosedTemplate是标准的模版声明。
OpenTemplate中包含一个[...],表示这是一个开放模版。开放模版允许在[]中内嵌任何数据对象。例如
,你可以实例化OpenTemplate,在里面定义一个OpenData变量和内嵌一个ClosedTemplate的实例。
RestrictedTemplate为约束模版。约束模版实例化时只允许包含它列出的数据对象,如,不能在
RestrictedTemplate包含[ClosedTemplate],[OpenTemplate]以外的数据对象。
3.访问.X文件:
访问任何X文件首先要调用DirectXFileCreate函数创建一个IDirectXFile接口。
IDirectXFile *pDXFile = NULL;
HRESULT Result = DirectXFileCreate(&pDXFile);//用&pDXFile返回指向接口的指针。用SUCCEEDED或者
FAILED宏判断返回值是否有效。
4.注册一个定制或者标准模版:
你可以把X文件中的模版移除,直接在代码里定义那些模版。IDirectXFile接口支持这样的特性。需要调用IDirectXfile::RegisterTemplates函数。
HRESULT IDirectXfile::RegisterTemplates(
LPVOID pvData, // 一个定义模版数据的缓存,应该精确无误。
DWORD cbSize); // pvData缓存的字节数。
可以如下定义一个模版数据的缓存:
char *Templates = "
"xof 0303txt 0032 \ //标准X文件头。
template CustomTemplate { <4c944580-9e9a-11cf-ab43-0120af71e433> DWORD Length; array DWORD values[Length]; }";
之后再用RegisterTemplates将其注册:
pFile->RegisterTemplates(Templates, strlen(Templates));
注册标准模版:
首先需要在代码中包含rmxfguid.h和rmxftmpl.h。rmxfguid.h定义了各个标准模版的GUDI,rmxftmpl.h以
2进制数据形式定义了标准模版数据的缓存和其字节数。然后调用RegisterTemplates将其注册:
pFile->RegisterTemplates(D3DRM_XTEMPLATES, D3DRM_XTEMPLATE_BYTES);
5.打开X文件:
创建完IDirectXFile接口,注册模版之后需要打开X文件,枚举其数据对象。调用
IDirectXfile::CreateEnumObject函数。
HRESULT IDirectXfile::CreateEnumObject(LPVOID pvSource, // .X filename
DXFILELOADOPTIONS dwLoadOptions, // Load options
LPDIRECTXFILEENUMOBJECT* ppEnumObj); // Enum interface
当调用CreateEnumObject函数,用pvSource指定一个文件的名字,用ppEnumObj返回一个枚举对象接口指
针。用dwLoadOptions指定load操作方式。当指定DXFILELOAD_FROMFILE值,告诉DirectX从磁盘载入一个
文件。还有DXFILELOAD_FROMRESOURCE,DXFILELOAD_FROMMEMORY和DXFILELOAD_FROMURL分别表示从一个资
源,内存缓冲和Internet上加载X文件。当从Internet加载文件时,需要为其指定完整的网址。
下面代码从磁盘加载X文件:
strcpy(Filename,"test.x");
IDirectXFileEnumObject *pEnum;
pFile->CreateEnumObject((LPVOID)Filename, DXFILELOAD_FROMFILE, &pEnum);
Filename指向一个有效的文件名,pEnum返回一个枚举对象接口指针。
6.枚举数据对象:
注册完模版,打开X文件并且得到一个枚举对象接口,下面需要从X文件读出数据。枚举对象接口指针指向
文件的第一个数据对象,因为每一个数据对象可能包含内嵌数据对象或者引用的数据对象,所以与第一个
数据对象同在一层级的其它数据对象为同层级数据对象。至于包含的子数据对象的类型,需要对其分别的
行进询问。
可以用 HRESULT IDirectXFileEnumObject::GetNextDataObject(LPDIRECTXFILEDATA*ppDataObj)得到一
个IDirectXFileData接口。它只有一个参数,如下:
IDirectXFileData *pData;
HRESULT hr = pEnum->GetNextDataObject(&pData);
利用此函数,可以不断地访问同一层级的数据对象接口,具体代码如下:
while(SUCCEEDED(pEnum->GetNextDataObject(&pData))) {
// 这里可以对pData数据对象进行操作。
ParseResult = ParseXFileData(m_pDXData); //ParseXFileData为解析函数
pData->Release();//释放接口。
}
当返回值为FAILED,表示已经访问完所有的接口。当访问值为SUCCEEDED,你需要继续判断这个数据对象
7.解析函数:
判断数据对象是否包含子对象。利用接口IDirectXFileObject,和HRESULT IDirectXFileData::GetNextObject(
LPDIRECTXFILEOBJECT* ppChildObj)函数,代码如下:
IDirectXFileObject *pObject;
while(SUCCEEDED(pData->GetNextObject(&pObject)))
{
// 如果一个子对象存在,需要继续询问它,判断出它的类型为内嵌数据对象或者引用的数据对象。

pObject->Release();// 释放接口。
}

接下来询问接口,看其是否为内嵌数据对象:
IDirectXFileData *pSubData;
if(SUCCEEDED(pObject->QueryInterface( IID_IDirectXFileData, (void**)&pSubData))) {
// 如果询问内嵌数据对象成功,可以对pSubData数据对象进行操作
ParseXFileData(pSubData);
pSubData->Release();//释放接口。
}

看其是否为引用数据对象:
IDirectXFileDataReference *pRef;
IDirectXFileData *pSubData;
if(SUCCEEDED(pSubObj->QueryInterface( IID_IDirectXFileDataReference, (void**)&pRef))) {
// 如果询问引用的数据对象成功,解析出引用的原型。
pRef->Resolve(&pSubData);
//这里可以对pData数据对象进行操作。
ParseXFileData(pSubData);
pRef->Release();
pSubData->Release();//释放接口。
}
现在总结下整体思路:大体的思路其实很简单,首先枚举最顶层的数据对象,然后判断其是否有子对象,这个子对象可能是内嵌对象或者引用对象二者之一,分别询问其接口,就可以判断出具体的类型。

分享到:
评论

相关推荐

    D3D中.X模型文件

    在D3D中,`.X`模型文件是一种常用的3D模型格式,它包含了用于描述三维对象的各种数据,如顶点、索引、纹理坐标、动画帧以及法线等信息。 `.X`模型文件的核心组成部分包括: 1. **顶点**:顶点是3D模型的基本构建块...

    D3D.X文件attack

    《D3D.X文件在游戏开发中的应用及攻击解析》 D3D.X文件,全称为Direct3D eXtended文件,是微软Direct3D框架下的一种资源格式,主要用于存储3D模型、动画以及相关的视觉效果数据。这种文件格式在游戏开发中尤其常见...

    04_模型和.x文件结构

    在Direct3D编程中,模型和.x文件结构是至关重要的组成部分,它们对于创建复杂的3D图形和游戏场景至关重要。.x文件格式是Microsoft为DirectX设计的一种通用3D模型存储格式,广泛应用于早期的Direct3D应用中。下面将...

    微软X文件读写程序

    2. 数据解析:正确解析X文件中的每个元素,如顶点、索引、纹理坐标等,并将其转换为D3D可使用的数据结构。 3. 动画处理:处理X文件中的动画序列,这可能涉及到关键帧提取、时间插值算法(线性插值、贝塞尔插值等)...

    Nikon D3X SDK

    在尼康D3X SDK中,"Module"可能是指不同的功能模块,这些模块可能包含了相机硬件控制、图像处理、通信协议等方面。开发者可以通过这些模块来构建自定义的摄影解决方案,比如远程控制拍摄、实时预览、批量下载照片等...

    D3.js json数据设置时间轴

    在D3.js中,JSON数据可以轻松地被解析并用于创建各种图表。对于"数据为json",我们需要先加载JSON文件,使用`d3.json()`方法,并通过回调函数处理数据。例如: ```javascript d3.json("data.json").then(function...

    多动画集在D3D下的渲染

    本篇文章将详细解析如何在D3D中实现多动画集的渲染。 首先,理解D3D中的动画渲染基础是必要的。在D3D中,3D模型通常由多个关键帧组成,这些关键帧定义了模型在不同时间点的位置、旋转和缩放。动画控制器(ID3...

    O3D学习笔记[一]素材准备*.3ds转成*.o3dtgz

    在提供的文件列表中,"NOV2007_d3dx9_36_x86"和"NOV2007_d3dx9_36_x64"看起来是DirectX 9的库文件,它们在3D图形编程中用于处理图形硬件加速。这些库对于运行依赖DirectX的应用,如3ds Max或O3D本身,可能是必要的。...

    jdk-8u251-windows-x64.exe

    《深入解析JDK 8u251 for Windows x64》 JDK(Java Development Kit)是Oracle公司提供的用于开发Java应用程序的核心工具集,它包含了Java编译器、Java运行环境、Java类库以及各种实用工具。在本文中,我们将深入...

    D3D11NormalMap

    1. **D3DClass.cpp**: 这个文件可能包含了Direct3D对象的创建和管理,包括设备(Device)、上下文(Device Context)以及交换链(Swap Chain)。这些是DirectX 11程序的核心部分,用于处理图形渲染和显示。 2. **...

    信息化办公模拟选择题参考答案.pdf

    21. Word表格中的不合法公式可能是`=ABS(B3:D)`,因为单元格引用应包含列字母和行数字,例如`B3:D3`。 22. Excel的【合并及居中】按钮通常显示为中间带有一个字母的图标,如A选项所示,用于合并单元格并居中内容。 ...

    动态生成组织结构树型图

    2. 使用D3.js构建树形图:接下来,我们需要编写JavaScript代码来解析数据并绘制树形图。D3.js提供了一种叫做`d3.tree()`的布局函数,它可以自动计算节点的位置。然后,我们可以使用`d3.hierarchy()`处理数据,生成一...

    redis-5.0.8-x64-for-windows-bin.rar

    提交60870d3a中的antirez: 解析错误时跳转到右标签。 1个文件更改,6个插入(+),4个删除(-) 提交d90f599b: 在错误发生时释放错误信号。 1个文件改变,11个插入(+),3个删除(-) WuYunlong in commit 8ee3bddf: ...

    使用activiti工作流引擎显示流程图时高亮显示流程图中已执行节点和已执行路径方法源代码

    接下来,我们需要解析流程图的 XML 文件(*.bpmn20.xml),从中获取节点和连接线的信息。这可以通过 Activiti 的 BpmnModel 类来完成。BpmnModel 对象包含了流程图的所有元素,我们可以根据历史数据找到对应的节点和...

    xfileloading

    这个过程会解析X文件的内容,将3D模型的信息加载到内存中。 4. **处理模型数据**:加载完成后,开发者可以访问模型的顶点缓冲、索引缓冲、材质和纹理等信息。这些数据可以用于渲染模型。例如,可以使用`ID3DXMesh::...

    D3-challenge:使用JavaScript的D3库进行数据可视化挑战

    在本项目"D3-challenge:使用JavaScript的D3库进行数据可视化挑战"中,我们将深入探讨如何利用D3.js(Data-Driven Documents)这一强大的JavaScript库来创建动态、交互式的数据可视化作品。D3.js是一个基于Web的开源...

    kb4474419和kb4490628系统补丁.rar

    在下载的压缩包文件中,有两个MSU(Microsoft Update)格式的文件:windows6.1-kb4474419-v3-x64_b5614c6cea5cb4e198717789633dca16308ef79c.msu和windows6.1-kb4490628-x64_d3de52d6987f7c8bdc2c015dca69eac96047...

    数据结构习题集与实验指导.pdf

    从内容片段中,也出现了类似于图的表示,例如 "D={d1,d2,d3,d4} R={(d1,d2),(d2,d3),(d3,d4)}",这可能是在讨论图的顶点集(D)和边集(R),以及图的邻接矩阵或邻接表的表示方法。 代码片段中还包含了函数的定义,...

    STM32F429驱动SD卡【STM32F42X系列单片机_寄存器驱动】.zip

    它遵循SD卡协议,通过CMD线发送命令,D0-D3线进行数据传输,以及CLK线提供时钟信号。 3. 协议层:在硬件接口之上,我们需要实现SD卡协议的软件层,这包括命令的构造和解析,错误处理,以及数据传输的管理。例如,...

    cocos creator的寻路demo

    2. `jsconfig.json`:这是JavaScript配置文件,定义了项目的编译和构建规则,比如模块解析、源文件路径等,对项目中JavaScript代码的编译和运行至关重要。 3. `project.json`:Cocos Creator的项目配置文件,包含了...

Global site tag (gtag.js) - Google Analytics