武器悬挂系统,其实就是读取骨骼节点的变换矩阵, 把它作为武器的变换矩阵.
当然武器上各点的坐标是相对于节点的坐标,所以在导出前,应该看看要悬挂的部位的本地坐标系是怎样的,例如,手掌面向的一面是那个轴,拇指在那个轴,那么导出前应该把武器调整到挂上去正好是手握武器的状态.
以下是读取骨骼节点变换矩阵的函数:
LRESULT GetFrameMatrix(LPD3DXFRAME pFrameBase, char *strFrameName,D3DMATRIX *pMat)
{
D3DXFRAME *pFrame ;
if(pFrameBase!=NULL)
pFrame = pFrameBase;
else
pFrame = m_pFrameRoot;
if(pFrame->Name!=NULL && 0==strcmp(pFrame->Name,strFrameName))
{
*pMat=((D3DXFRAME_DERIVED*)pFrame)->CombinedTransformationMatrix;
return S_OK;
}
if (pFrame->pFrameSibling != NULL)
{
if(S_OK== GetFrameMatrix(pFrame->pFrameSibling,strFrameName,pMat))
return S_OK;
}
if (pFrame->pFrameFirstChild != NULL)
{
if(S_OK== GetFrameMatrix(pFrame->pFrameFirstChild,strFrameName,pMat))
return S_OK;
}
return E_FAIL;
}
{
D3DXFRAME *pFrame ;
if(pFrameBase!=NULL)
pFrame = pFrameBase;
else
pFrame = m_pFrameRoot;
if(pFrame->Name!=NULL && 0==strcmp(pFrame->Name,strFrameName))
{
*pMat=((D3DXFRAME_DERIVED*)pFrame)->CombinedTransformationMatrix;
return S_OK;
}
if (pFrame->pFrameSibling != NULL)
{
if(S_OK== GetFrameMatrix(pFrame->pFrameSibling,strFrameName,pMat))
return S_OK;
}
if (pFrame->pFrameFirstChild != NULL)
{
if(S_OK== GetFrameMatrix(pFrame->pFrameFirstChild,strFrameName,pMat))
return S_OK;
}
return E_FAIL;
}