后可以被其他模板引用例
如后面的A
imatio
动画模板就会引用这里的Frame
节点,标识动画关联的骨骼。ifpDataObjIsRefere
ceretur
true
fD3DXFRAME_EX为D3DXFRAME的扩展结构,增加些数据成员
D3DXFRAME_EXpFrame
ewD3DXFRAME_EX
得到名称pFrameNameGetObjectNamepDataObj
注意观察文件就可以发现一个Frame要么是根Frame,父节点不存在,要么作为某
个Frame的孩子Frame而存在。ifNULLpData作为根节点的兄弟节点加入链表。pFramepFrameSibli
gm_pRootFramem_pRootFramepFramepFrameNULL
将自定义数据指针指向自己,供子节点引用。pDatavoidm_pRootFrameelse作为传入节点的子节点D3DXFRAME_EXpDataFrameD3DXFRAME_EXpDatapFramepFrameSibli
gpDataFramepFrameFirstChildpDataFramepFrameFirstChildpFramepFrameNULL
pDatavoidpDataFramepFrameFirstChild
f
记住我们只需要做一件事情,判断类型,分配匹配的对象然后拷贝数据,下面来分析Frame中的matrix
frame的坐标变换矩阵因为matrix必然属于某个Frame所以pData必须有效elseifobjGUIDTID_D3DRMFrameTra
sformMatrixpData我们可以肯定pData指向某个FrameD3DXFRAME_EXpDataFrameD3DXFRAME_EXpData
先取得缓冲区大小,应该是个标准的4x4矩阵DWORDsize0LPCVOIDbufferNULL
hrpDataObjLocksizebufferifFAILEDhrretur
false
拷贝数据ifsizesizeofD3DXMATRIXmemcpypDataFrameTra
sformatio
MatrixbuffersizepDataObjU
lock
pDataFramematOrigi
alpDataFrameTra
sformatio
Matrix第二,修改和更新骨骼层级:
f加载完骨骼层级之后,你可以操作它,更改骨骼的方位。你需要创建一个递归函数,按照名字找到相应的Frame数据对象。这个函数如下:
D3DXFRAME_EXFi
dFrameD3DXFRAME_EXFramecharName
ifFrameFrame8722NameName
如果名字找到,返回一个Frame指针
ifstrcmpFrame8722NameNamestrcmp函数比较两个字符串,如果两个字符串相等,返回0
retur
Frame
在sibli
gframes找匹配的名字
ifFrameFrame8722pFrameSibli
g
D3DXFRAME_EXFramePtr
Fi
dFrameD3DXFRAME_EXFrame8722pFrameSibli
g
Name
ifFramePtr
retur
FramePtr
f
在childframes找匹配的名字
ifFrameFrame8722pFrameFirstChild
D3DXFRAME_EXFramePtr
Fi
dFrameD3DXFRAME_EXFrame8722pFrameFirstChild
Name
ifFramePtr
retur
FramePtr
如果没有找到,返回NULL
retur
NULL
如果你想找到一个叫“Leg”的Frame,可以把“Leg”传入Fi
dFrame函数,并且提供指向RootFrame的指针:
pRootframe为D3DXFRAME_EXrootframe指针
fD3DXFRAME_EXFrameFi
dFramr