维爱迪-动画创作家园 >> 动画理论 >> 3D游戏角色动画 |
第二,修改和更新骨骼层级:
加载完骨骼层级之后,你可以操作它,更改骨骼的方位。你需要创建一个递归函数,按照名字找到相应的Frame数据对象。这个函数如下:
D3DXFRAME_EX *FindFrame(D3DXFRAME_EX *Frame, char *Name)
{
if(Frame && Frame−>Name && Name) {
// 如果名字找到,返回一个Frame指针
if(!strcmp(Frame−>Name, Name)) // strcmp函数比较两个字符串,如果两个字符串相等,返回0
return Frame;
}
// 在sibling frames找匹配的名字
if(Frame && Frame−>pFrameSibling) {
D3DXFRAME_EX *FramePtr = \
FindFrame((D3DXFRAME_EX*)Frame−>pFrameSibling, \
Name);
if(FramePtr)
return FramePtr;
}
// 在child frames找匹配的名字
if(Frame && Frame−>pFrameFirstChild) {
D3DXFRAME_EX *FramePtr = \
FindFrame((D3DXFRAME_EX*)Frame−>pFrameFirstChild, \
Name);
if(FramePtr)
return FramePtr;
}
// 如果没有找到,返回 NULL
return NULL;
}
如果你想找到一个叫“Leg”的Frame,可以把“Leg”传入FindFrame函数,并且提供指向RootFrame的指针:
// pRootframe 为D3DXFRAME_EX root frame 指针
D3DXFRAME_EX *Frame = FindFrame(pRootFrame, "Leg");
if(Frame) {
// 可以在这里做一些处理,比如旋转操作
// 你在这里可以稍微的旋转这个骨头
D3DXMatrixRotationY(&Frame−>TransformationMatrix, 1.57f);
}
一旦你修改变换骨头,你需要更新整个骨骼层级,也就是把变换的组合矩阵存入D3DXFRAME_EX结构的matCombined成员中,用于后面的渲染。下面的函数应该增加到D3DXFRAME_EX结构中,如下:
void UpdateHierarchy(D3DXMATRIX *matTransformation = NULL)
{
D3DXFRAME_EX *pFramePtr;
D3DXMATRIX matIdentity;
// 如果为空,用一个全同矩阵
if(!matTransformation) {
D3DXMatrixIdentity(&matIdentity);
matTransformation = &matIdentity;
}
// 把变换矩阵组合到matCombined中
matCombined = TransformationMatrix * (*matTransformation);
// 更新兄弟层级
if((pFramePtr = (D3DXFRAME_EX*)pFrameSibling))
pFramePtr->UpdateHierarchy(matTransformation);
// 更新孩子层级
if((pFramePtr = (D3DXFRAME_EX*)pFrameFirstChild))
pFramePtr->UpdateHierarchy(&matCombined);
}
现在matCombined储存着每个骨骼相对于原点的变换矩阵,然后只要把各个顶点附在相应的骨骼上,就能渲染了。