,用一个D3DXFRAME结构或者X文件中的Frametemplate来表示帧对象。下面看一下Frametemplate和D3DXFRAME结构的定义:
templateFrame3D82AB4662DA11cfAB390020AF71E433FrameTra
sformMatrixframeTra
sformMatrixmatrixMeshmesh骨骼的Mesh骨骼相对于父节点的坐标变换矩阵,就是一个
ftypedefstruct_D3DXFRAMELPSTRD3DXMATRIXNameTra
sformatio
Matrix骨骼名称相对与父节点的坐标变换矩阵
LPD3DXMESHCONTAINER
pMeshCo
tai
erLPD3DXMESHCONTAINER对象,
用来加载MESH,还有一些附加属性见SDK
struct_D3DXFRAME
pFrameSibli
g
兄弟节点指针,和下面的子节点指针
一块作用构成骨骼的层次结构。struct_D3DXFRAMEpFrameFirstChild子节点指针
D3DXFRAMELPD3DXFRAME
注意D3DXFRAMEpFrameSibli
g和D3DXFRAMEpFrameFirstChild,主要是利用这两个指针形成骨层级。pFrameSibli
g把一个骨头连接到兄弟层级,相对的,pFrameFirstChild把一个骨头连接到子层级。通常,你需要用建模软件为你的程序创建那些骨骼结构,输出骨层级到X文件以便使用。Microsoft有3DStudioMax和Maya的输出插件(exporter),可以输出骨骼和动画数据到X文件。很多建模程序也都有这样的功能。
X文件包含了帧数据,用一个帧(frame)模版的数据对象层级代表骨骼层级。如下图:
注意上面的图,利用D3DXFRAMEpoi
ters指针形成了一个兄弟帧和孩子帧的链表。
在前面templateFrame中已经提及过每个Frame数据对象中存放着一个变换矩阵,这个矩阵描述了该骨骼相对于父骨骼的位置。另外在根Frame数据对象中内嵌了一个标准的Mesh数据对象。Frame定义了骨骼的层级,而Mesh中的Ski
Weights数据对象定义了Frame代表的骨头。我们用D3DXFRAME结构容
f纳从X文件加载进来的Frame数据对象。为了更好的容纳Frame数据对象,我们需要扩展下D3DXFRAME结构:
structD3DXFRAME_EXD3DXFRAME
D3DXMATRIXmatCombi
ed
组合变换矩阵,用于储存变换的骨骼矩阵
D3DXMATRIXmatOrigi
al
从X文件加载的原始变换矩阵
D3DXFRAME_EX
NameNULL
pMeshCo
tai
erNULL
pFrameSibli
gpFrameFirstChildNULL
D3DXMatrixIde
titymatCombi
ed
D3DXMatrixIde
titymatOrigi
al
D3DXMatrixIde
tityTra
sformatio
Matrix
fD3DXFRAME_EX
deleteName
NameNULL
deletepFrameSibli
g
pFrameSibli
gNULL
deletepFrameFirstChildpFrameFirstChildNULL
利用我们以前介绍的cXParse类可以遍历X文件的数据对象,从而加载出Frame数据对象。下面的代码都是写在方法ParseObject中,如下:
判断当前分析的是不是Frame节点ifobjGUIDTID_D3DRMFrame
引用对象直接返回,不需要做分析。一个数据段实际定义一次r