织梦CMS - 轻松建站从此开始!

罗索

D3DMesh类:用于载入X文件,渲染模型

jackyhwei 发布于 2010-08-17 22:19 点击:次 
落鹤生:这是一个D3DMesh类:D3DMesh类,用于载入X文件,渲染模型。可以实现移动、缩放、旋转模型,可实现基本动画。实现的功能跟D3DImage差不多,但素材是3D的x文件,而非2D图片。
TAG:

头文件:

  1. // 文件: D3DMesh.h 
  2. // 描述: D3DMesh类的头文件,定义变量,函数。 
  3.  
  4. #pragma once 
  5. #include <d3dx9.h> 
  6. #pragma comment (lib, "d3d9.lib") 
  7. #pragma comment (lib, "d3dx9.lib") 
  8. enum RENDERTYPE 
  9. RT_INDEX = 0, 
  10. RT_ANIME = 1, 
  11. }; 
  12. class D3DMesh 
  13. public
  14. D3DMesh(LPDIRECT3DDEVICE9 _pd3dDevice); 
  15. ~D3DMesh(void); 
  16.  
  17. public
  18. HRESULT loadMesh(LPCTSTR  _pSrcFile); 
  19. VOID drawMesh(INT _mode, INT _parameter); 
  20. VOID setPosition(INT _index, FLOAT _x, FLOAT _y, FLOAT _z); 
  21. VOID setZoom(INT _index, FLOAT _zoomX, FLOAT _zoomY, FLOAT _zoomZ); 
  22. VOID setRotation(INT _index, FLOAT _rotationX, FLOAT _rotationY, FLOAT _rotationZ); 
  23. VOID move(INT _index, FLOAT _x, FLOAT _y, FLOAT _z); 
  24.  
  25. private
  26. VOID removePathFromFileName(LPSTR fullPath, LPWSTR fileName); 
  27. VOID autoExpand(); 
  28. VOID drawIndex(INT _parameter); 
  29. VOID drawAnime(INT _parameter); 
  30. VOID setTransForm(INT _mode); 
  31.      
  32. private
  33.     LPDIRECT3DDEVICE9 m_pd3dDevice;// D3D设备 
  34.     struct MESH 
  35.     { 
  36. LPD3DXMESH pMesh;// 网格模型对象 
  37. D3DMATERIAL9* pMeshMaterials;// 网格模型材质 
  38. LPDIRECT3DTEXTURE9* pMeshTextures;// 网格模型纹理 
  39. DWORD dwNumMaterials;// 网格模型材质数量 
  40. D3DXVECTOR3 vCenter;// 网格模型中心点  
  41. FLOAT fX;// 网格模型坐标 
  42. FLOAT fY;// 网格模型坐标 
  43. FLOAT fZ;// 网格模型坐标 
  44. FLOAT fZoomX;// 网格模型X轴方向缩放比率 
  45. FLOAT fZoomY;// 网格模型Y轴方向缩放比率 
  46. FLOAT fZoomZ;// 网格模型Z轴方向缩放比率 
  47. FLOAT fRotationX;// 网格模型X轴旋转角度 
  48. FLOAT fRotationY;// 网格模型Y轴旋转角度 
  49. FLOAT fRotationZ;// 网格模型Z轴旋转角度 
  50. D3DXMATRIX matTranslate;// 平移变换矩阵 
  51. D3DXMATRIX matScaling;// 缩放变换矩阵 
  52. D3DXMATRIX matRotationZ;// Z轴旋转变换矩阵 
  53. D3DXMATRIX matRotationX;// X轴旋转变换矩阵 
  54. D3DXMATRIX matRotationY;// Y轴旋转变换矩阵 
  55.     }; 
  56. MESH *m_mesh;// 模型数组 
  57. MESH *m_meshTemp;// 模型临时数组 
  58. INT m_iMaxIndex;// 最大帧数 
  59. INT m_iCurrentIndex;// 当前帧数 
  60. INT m_iDelay;// 延迟变量 
  61. #define ZOOM (1.0f/100.0f) 

源代码:

  1. // 文件: D3DMesh.cpp 
  2. // 描述: D3DMesh类,用于载入X文件,渲染模型。可以实现移动、缩放、旋转模型,可实现基本动画 
  3.  
  4. #include "D3DMesh.h" 
  5.  
  6. // 名称: D3DMesh() 
  7. // 描述: 自定义构造函数 
  8. D3DMesh::D3DMesh(LPDIRECT3DDEVICE9 _pd3dDevice) 
  9.     m_pd3dDevice = _pd3dDevice; 
  10.     m_iMaxIndex = 0; 
  11.     m_iCurrentIndex = 0; 
  12.     m_iDelay = 0; 
  13.     m_mesh = new MESH[m_iMaxIndex+1]; 
  14.     ZeroMemory(m_mesh,(m_iMaxIndex+1)*sizeof(MESH)); 
  15.     m_mesh[0].fZoomX = 1.0f; 
  16.     m_mesh[0].fZoomY = 1.0f; 
  17.     m_mesh[0].fZoomZ = 1.0f; 
  18.     // 初始化变换矩阵 
  19.     D3DXMatrixTranslation(&m_mesh[0].matTranslate, 0, 0, 0); 
  20.     D3DXMatrixScaling(&m_mesh[0].matScaling, 1.0f,1.0f, 1.0f); 
  21.     D3DXMatrixRotationZ(&m_mesh[0].matRotationZ, 0); 
  22.     D3DXMatrixRotationX(&m_mesh[0].matRotationX, 0); 
  23.     D3DXMatrixRotationY(&m_mesh[0].matRotationY, 0); 
  24. D3DMesh::~D3DMesh(void
  25.  
  26. // 名称: autoExpand() 
  27. // 描述: 自动扩展MESH数组 
  28.  
  29. VOID D3DMesh::autoExpand() 
  30.     m_meshTemp = new MESH[m_iMaxIndex+2]; 
  31.     ZeroMemory(m_meshTemp,(m_iMaxIndex+2)*sizeof(MESH)); 
  32.     m_meshTemp[m_iMaxIndex+1].fZoomX = 1.0f; 
  33.     m_meshTemp[m_iMaxIndex+1].fZoomY = 1.0f; 
  34.     m_meshTemp[m_iMaxIndex+1].fZoomZ = 1.0f; 
  35.     // 初始化变换矩阵 
  36.     D3DXMatrixTranslation(&m_meshTemp[m_iMaxIndex+1].matTranslate, 0, 0, 0); 
  37.     D3DXMatrixScaling(&m_meshTemp[m_iMaxIndex+1].matScaling, 1.0f,1.0f, 1.0f); 
  38.     D3DXMatrixRotationZ(&m_meshTemp[m_iMaxIndex+1].matRotationZ, 0); 
  39.     D3DXMatrixRotationX(&m_meshTemp[m_iMaxIndex+1].matRotationX, 0); 
  40.     D3DXMatrixRotationY(&m_meshTemp[m_iMaxIndex+1].matRotationY, 0); 
  41.     memcpy(m_meshTemp,m_mesh, (m_iMaxIndex+1)*sizeof(MESH)); 
  42.     delete m_mesh; 
  43.     m_mesh = m_meshTemp; 
  44.     m_meshTemp = NULL; 
  45.  
  46. // 名称: loadMesh() 
  47. // 描述: 载入模型 
  48.  
  49. HRESULT D3DMesh::loadMesh(LPCTSTR  _pSrcFile) 
  50.     // 自动扩展MESH数组 
  51.     autoExpand(); 
  52.     // 存储网格模型材质的缓冲区对象 
  53.     LPD3DXBUFFER pD3DXMtrlBuffer;   
  54.     // 从磁盘文件加载网格模型 
  55.     if( FAILED( D3DXLoadMeshFromX( _pSrcFile, D3DXMESH_MANAGED,
  56. m_pd3dDevice, NULL,
  57. &pD3DXMtrlBuffer, NULL, &m_mesh[m_iMaxIndex].dwNumMaterials,
  58. &m_mesh[m_iMaxIndex].pMesh ) ) )
  59.     { 
  60.         MessageBox(NULL, _pSrcFile, TEXT("以下模型加载失败"), MB_OK); 
  61.         return E_FAIL; 
  62.     } 
  63.     //从网格模型中提取材质属性和纹理文件名  
  64.     D3DXMATERIAL* d3dxMaterials = (D3DXMATERIAL*)pD3DXMtrlBuffer->GetBufferPointer(); 
  65.     m_mesh[m_iMaxIndex].pMeshMaterials = 
  66. new D3DMATERIAL9[m_mesh[m_iMaxIndex].dwNumMaterials]; 
  67.     if( m_mesh[m_iMaxIndex].pMeshMaterials == NULL ) 
  68.         return E_FAIL; 
  69.     m_mesh[m_iMaxIndex].pMeshTextures  = 
  70. new LPDIRECT3DTEXTURE9[m_mesh[m_iMaxIndex].dwNumMaterials]; 
  71.     if( m_mesh[m_iMaxIndex].pMeshTextures == NULL ) 
  72.         return E_FAIL; 
  73.     //逐块提取网格模型材质属性和纹理文件名 
  74.     forDWORD i=0; i<m_mesh[m_iMaxIndex].dwNumMaterials; i++ ) 
  75.     { 
  76.         //材料属性 
  77.         m_mesh[m_iMaxIndex].pMeshMaterials[i] = d3dxMaterials[i].MatD3D; 
  78.         //设置模型材料的环境光反射系数, 因为模型材料本身没有设置环境光反射系数 
  79.         m_mesh[m_iMaxIndex].pMeshMaterials[i].Ambient =
  80. m_mesh[m_iMaxIndex].pMeshMaterials[i].Diffuse; 
  81.         m_mesh[m_iMaxIndex].pMeshTextures[i] = NULL; 
  82.         if( d3dxMaterials[i].pTextureFilename != NULL &&  
  83.             strlen(d3dxMaterials[i].pTextureFilename) > 0 ) 
  84.         { 
  85.             //获取纹理文件名 
  86.             WCHAR filename[256]; 
  87.             removePathFromFileName(d3dxMaterials[i].pTextureFilename, filename); 
  88.             if( FAILED( D3DXCreateTextureFromFile( m_pd3dDevice, filename,  
  89. &m_mesh[m_iMaxIndex].pMeshTextures[i] ) ) ) 
  90.             { 
  91.                 MessageBox(NULL, TEXT("纹理加载失败"), TEXT("失败"), MB_OK); 
  92.             } 
  93.         } 
  94.     } 
  95.     //释放在加载模型文件时创建的保存模型材质和纹理数据的缓冲区对象 
  96.     pD3DXMtrlBuffer->Release(); 
  97.     m_iMaxIndex++; 
  98.     return S_OK; 
  99.  
  100. // 名称: RemovePathFromFileName() 
  101. // 描述: 从绝对路径中提取文件名 
  102.  
  103. VOID D3DMesh::removePathFromFileName(LPSTR fullPath, LPWSTR fileName) 
  104.     //先将fullPath的类型变换为LPWSTR 
  105.     WCHAR wszBuf[MAX_PATH]; 
  106.     MultiByteToWideChar( CP_ACP, 0, fullPath, -1, wszBuf, MAX_PATH ); 
  107.     wszBuf[MAX_PATH-1] = L'\0'
  108.     WCHAR* wszFullPath = wszBuf; 
  109.     //从绝对路径中提取文件名 
  110.     LPCTSTR pch = wcsrchr(wszBuf,'\\'); 
  111.     if (pch) 
  112.     { 
  113.         lstrcpy(fileName, TEXT("Mesh\\")); 
  114.         lstrcat(fileName, ++pch); 
  115.     } 
  116.     else 
  117.     { 
  118.         lstrcpy(fileName, TEXT("Mesh\\")); 
  119.         lstrcat(fileName, wszFullPath); 
  120.     } 
  121.  
  122. // 名称: setPosition() 
  123. // 描述: 设置模型位置 
  124.  
  125. VOID D3DMesh::setPosition(INT _index, FLOAT _x, FLOAT _y, FLOAT _z) 
  126.     m_mesh[_index].fX = _x; 
  127.     m_mesh[_index].fY = _y; 
  128.     m_mesh[_index].fZ = _z; 
  129.     D3DXMatrixTranslation(&m_mesh[_index].matTranslate,  
  130.         m_mesh[_index].fX, m_mesh[_index].fY, m_mesh[_index].fZ); 
  131.  
  132. // 名称: move() 
  133. // 描述: 移动模型位置 
  134.  
  135. VOID D3DMesh::move(INT _index, FLOAT _x, FLOAT _y, FLOAT _z) 
  136.     m_mesh[_index].fX += _x; 
  137.     m_mesh[_index].fY += _y; 
  138.     m_mesh[_index].fZ += _z; 
  139.     D3DXMatrixTranslation(&m_mesh[_index].matTranslate, 
  140.         m_mesh[_index].fX, m_mesh[_index].fY, m_mesh[_index].fZ); 
  141.  
  142. // 名称: setZoom() 
  143. // 描述: 设置模型缩放 
  144.  
  145. VOID D3DMesh::setZoom(INT _index, FLOAT _zoomX, FLOAT _zoomY, FLOAT _zoomZ) 
  146.     m_mesh[_index].fZoomX = _zoomX; 
  147.     m_mesh[_index].fZoomY = _zoomY; 
  148.     m_mesh[_index].fZoomZ = _zoomZ; 
  149.     D3DXMatrixScaling(&m_mesh[_index].matScaling, 
  150.         m_mesh[_index].fZoomX, m_mesh[_index].fZoomY, m_mesh[_index].fZoomZ); 
  151.  
  152. // 名称: setRotation() 
  153. // 描述: 设置图片旋转 
  154.  
  155. VOID D3DMesh::setRotation(INT _index, FLOAT _rotationX, FLOAT _rotationY,
  156. FLOAT _rotationZ) 
  157.     m_mesh[_index].fRotationX = _rotationX; 
  158.     m_mesh[_index].fRotationY = _rotationY; 
  159.     m_mesh[_index].fRotationZ = _rotationZ; 
  160.     _rotationX = _rotationX * D3DX_PI /180.0f; 
  161.     _rotationY = _rotationY * D3DX_PI /180.0f; 
  162.     _rotationZ = _rotationZ * D3DX_PI /180.0f; 
  163.     D3DXMatrixRotationX(&m_mesh[_index].matRotationX, _rotationX); 
  164.     D3DXMatrixRotationY(&m_mesh[_index].matRotationY, _rotationY); 
  165.     D3DXMatrixRotationZ(&m_mesh[_index].matRotationZ, _rotationZ); 
  166.  
  167. // 名称: setTransForm() 
  168. // 描述: 设置变换 
  169.  
  170. VOID D3DMesh::setTransForm(INT _mode) 
  171.     D3DXMATRIX matWorld; 
  172.     if( _mode < 0 ) 
  173.     { 
  174.         D3DXMATRIX matTranslate; 
  175.         D3DXMATRIX matScla; 
  176.         D3DXMATRIX matRotationZ; 
  177.         D3DXMATRIX matRotationX; 
  178.         D3DXMATRIX matRotationY; 
  179.          
  180.         D3DXMatrixScaling(&matScla, ZOOM, ZOOM, ZOOM); 
  181.         D3DXMatrixTranslation(&matTranslate, 0, 0, 0); 
  182.         D3DXMatrixRotationZ(&matRotationZ, 0); 
  183.         D3DXMatrixRotationX(&matRotationX, 0); 
  184.         D3DXMatrixRotationY(&matRotationY, 0); 
  185.          
  186.         D3DXMatrixMultiply(&matWorld, &matScla, &matRotationZ); 
  187.         D3DXMatrixMultiply(&matWorld, &matWorld, &matRotationX); 
  188.         D3DXMatrixMultiply(&matWorld, &matWorld, &matRotationY); 
  189.         D3DXMatrixMultiply(&matWorld, &matWorld, &matTranslate); 
  190.     } 
  191.     else 
  192.     { 
  193.         D3DXMATRIX matScla; 
  194.         D3DXMatrixScaling(&matScla, ZOOM, ZOOM, ZOOM);       
  195.         D3DXMatrixMultiply(&matWorld, &m_mesh[_mode].matScaling,
  196. &m_mesh[_mode].matRotationX); 
  197.         D3DXMatrixMultiply(&matWorld, &matWorld, &m_mesh[_mode].matRotationY); 
  198.         D3DXMatrixMultiply(&matWorld, &matWorld, &m_mesh[_mode].matRotationZ); 
  199.         D3DXMatrixMultiply(&matWorld, &matWorld, &m_mesh[_mode].matTranslate); 
  200.         D3DXMatrixMultiply(&matWorld, &matWorld, &matScla); 
  201.     } 
  202.     m_pd3dDevice->SetTransform(D3DTS_WORLD, &matWorld); 
  203.  
  204. // 名称: drawMesh() 
  205. // 描述: 绘制模型 
  206.  
  207. VOID D3DMesh::drawMesh(INT _mode, INT _parameter) 
  208.     switch(_mode) 
  209.     {     
  210.     case RT_INDEX: 
  211.         drawIndex(_parameter); 
  212.         break
  213.     case RT_ANIME: 
  214.         drawAnime(_parameter); 
  215.         break
  216.     } 
  217.  
  218. // 名称: drawIndex() 
  219. // 描述: 绘制单帧模型 
  220.  
  221. VOID D3DMesh::drawIndex(INT _index) 
  222.     forDWORD i=0; i<m_mesh[_index].dwNumMaterials; i++ ) 
  223.     { 
  224.         //设置材料和纹理 
  225.         m_pd3dDevice->SetMaterial( &m_mesh[_index].pMeshMaterials[i] ); 
  226.         m_pd3dDevice->SetTexture( 0, m_mesh[_index].pMeshTextures[i] ); 
  227.         //渲染模型 
  228.         setTransForm(_index); 
  229.         m_mesh[_index].pMesh->DrawSubset( i ); 
  230.     } 
  231.  
  232. // 名称: drawAnime() 
  233. // 描述: 绘制切帧模型 
  234.  
  235. VOID D3DMesh::drawAnime(INT _delay) 
  236.     if (m_iDelay < _delay) 
  237.         m_iDelay++; 
  238.     else  
  239.     { 
  240.         if (m_iCurrentIndex < m_iMaxIndex-1) 
  241.         { 
  242.             m_iCurrentIndex++; 
  243.         } 
  244.         else 
  245.         { 
  246.             m_iCurrentIndex = 0; 
  247.         } 
  248.         m_iDelay = 0; 
  249.     } 
  250.     forDWORD i=0; i<m_mesh[m_iCurrentIndex].dwNumMaterials; i++ ) 
  251.     { 
  252.         //设置材料和纹理 
  253.         m_pd3dDevice->SetMaterial( &m_mesh[m_iCurrentIndex].pMeshMaterials[i] ); 
  254.         m_pd3dDevice->SetTexture( 0, m_mesh[m_iCurrentIndex].pMeshTextures[i] ); 
  255.         //渲染模型 
  256.         setTransForm(m_iCurrentIndex); 
  257.         m_mesh[m_iCurrentIndex].pMesh->DrawSubset( i ); 
  258.     } 

 

(秩名)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201008/9991.html]
本文出处:网络博客 作者:秩名
顶一下
(6)
100%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容