zfxSkinMesh.h
上传用户:junlon
上传日期:2022-01-05
资源大小:39075k
文件大小:3k
源码类别:

DirextX编程

开发平台:

Visual C++

  1. //--------------------------------------------------------------------------------------
  2. // 头文件: zfxSkinMesh.h , 作者:曾凡喜
  3. //
  4. // 骨骼动画类,支持蒙皮骨骼动画
  5. //
  6. // 版权归作者所有,未经允许不得利用源代码进行任何商业活动
  7. //
  8. // 完成时间:2008-05-03
  9. //--------------------------------------------------------------------------------------
  10. #ifndef __zfxSkinMesh_H__
  11. #define __zfxSkinMesh_H__
  12. #include "zfxd3dUtility.h"
  13. #include "AllocateHierarchy.h"
  14. //-----------------------------------------------------------------------------
  15. // 骨骼动画类,注意播放骨骼动画时,帧刷新率不能过高,否则会出现闪烁现象
  16. // 控制最高帧刷新率的方法:将 d3dpp.PresentationInterval 设置为 D3DPRESENT_INTERVAL_DEFAULT
  17. //-----------------------------------------------------------------------------
  18. class CZFXSkinMesh
  19. {
  20. //-------------------------私有变量------------------------//
  21. private:
  22. CAllocateHierarchy*         m_pAlloc;    // CAllocateHierarchy类
  23. LPDIRECT3DDEVICE9 m_pd3dDevice;// 设备接口
  24. LPD3DXFRAME m_pFrameRoot;// 根框架
  25. //-------------------------私有函数------------------------//
  26. private:
  27. // 以递归的方式建立各级组合变换矩阵
  28. HRESULT SetupBoneMatrixPointers( LPD3DXFRAME pFrame );
  29. // 被SetupBoneMatrixPointers()调用
  30. HRESULT SetupBoneMatrixPointersOnMesh( LPD3DXMESHCONTAINER pMeshContainerBase );
  31. // 私有函数,被OnCreate(....)调用,先加载动画数据和层次框架(D3DXLoadMeshHierarchyFromX),
  32. // 然后建立各级组合变换矩阵(SetupBoneMatrixPointers),然后计算包围球(D3DXFrameCalculateBoundingSphere)
  33. HRESULT LoadFromXFile(WCHAR* strFileName);
  34. // 内部递归调用,更新各级框架的世界矩阵
  35. void UpdateFrameMatrices( LPD3DXFRAME pFrameBase, LPD3DXMATRIX pParentMatrix ); 
  36. // 内部递归调用,渲染框架
  37. void DrawFrame(LPD3DXFRAME pFrame);
  38. // 渲染属于框架pFrameBase的模型容器
  39. void DrawMeshContainer(LPD3DXMESHCONTAINER pMeshContainerBase, LPD3DXFRAME pFrameBase);
  40. public:
  41. // 以下两个变量用于计算包围球
  42. D3DXVECTOR3   m_vObjectCenter;//包围球中心点
  43. float         m_fObjectRadius;//包围球半径
  44. // 将下述变量设置为FALSE,以禁止动画播放,默认为TRUE,即开启动画播放
  45. BOOL   m_bPlayAnim;
  46. // 动画控制器,通过它可以控制动画播放的进度
  47. LPD3DXANIMATIONCONTROLLER m_pAnimController;
  48. public:
  49. // 从动画文件(文件名为strFileName)中加载动画数据和层次框架,
  50. // 在该函数中将调用私有函数LoadFromXFile(strFileName)。
  51. HRESULT OnCreate(LPDIRECT3DDEVICE9 pD3DDevice, WCHAR* strFileName);
  52. // 渲染骨骼模型,模型的世界矩阵由matWorld指定,fElapsedAppTime指定消逝的时间,
  53. // fElapsedAppTime的值不能太小,即帧刷新率不能太高,可以通过限制最高刷新率来达到这个目的,
  54. // 方法:将  d3dpp.PresentationInterval 设置为 D3DPRESENT_INTERVAL_DEFAULT。
  55. HRESULT Render(D3DXMATRIX* matWorld, float fElapsedAppTime);
  56. // 销毁骨骼动画数据
  57. HRESULT OnDestory();
  58. public:
  59. CZFXSkinMesh();
  60. virtual ~CZFXSkinMesh();
  61. };
  62. #endif  //__zfxSkinMesh_H__