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

DirextX编程

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "zfxFrustum.h"
  3. CZFXFrustum::CZFXFrustum()
  4. {
  5. }
  6. CZFXFrustum::~CZFXFrustum()
  7. {
  8. }
  9. void CZFXFrustum::Construct(LPDIRECT3DDEVICE9 pd3dDevice)
  10. {
  11. D3DXMATRIX Matrix, matView, matProj;
  12. pd3dDevice->GetTransform( D3DTS_VIEW, &matView );
  13. pd3dDevice->GetTransform( D3DTS_PROJECTION, &matProj );
  14. D3DXMatrixMultiply( &Matrix, &matView, &matProj );
  15. // Calculate the planes
  16. m_planes[0].a = Matrix._14 + Matrix._13; // Near
  17. m_planes[0].b = Matrix._24 + Matrix._23;
  18. m_planes[0].c = Matrix._34 + Matrix._33;
  19. m_planes[0].d = Matrix._44 + Matrix._43;
  20. D3DXPlaneNormalize(&m_planes[0], &m_planes[0]);
  21. m_planes[1].a = Matrix._14 - Matrix._13; // Far 
  22. m_planes[1].b = Matrix._24 - Matrix._23;
  23. m_planes[1].c = Matrix._34 - Matrix._33;
  24. m_planes[1].d = Matrix._44 - Matrix._43;
  25. D3DXPlaneNormalize(&m_planes[1], &m_planes[1]);
  26. m_planes[2].a = Matrix._14 + Matrix._11; // Left
  27. m_planes[2].b = Matrix._24 + Matrix._21;
  28. m_planes[2].c = Matrix._34 + Matrix._31;
  29. m_planes[2].d = Matrix._44 + Matrix._41;
  30. D3DXPlaneNormalize(&m_planes[2], &m_planes[2]);
  31. m_planes[3].a = Matrix._14 - Matrix._11; // Righ
  32. m_planes[3].b = Matrix._24 - Matrix._21;
  33. m_planes[3].c = Matrix._34 - Matrix._31;
  34. m_planes[3].d = Matrix._44 - Matrix._41;
  35. D3DXPlaneNormalize(&m_planes[3], &m_planes[3]);
  36. m_planes[4].a = Matrix._14 - Matrix._12; // Top 
  37. m_planes[4].b = Matrix._24 - Matrix._22;
  38. m_planes[4].c = Matrix._34 - Matrix._32;
  39. m_planes[4].d = Matrix._44 - Matrix._42;
  40. D3DXPlaneNormalize(&m_planes[4], &m_planes[4]);
  41. m_planes[5].a = Matrix._14 + Matrix._12; // Bott
  42. m_planes[5].b = Matrix._24 + Matrix._22;
  43. m_planes[5].c = Matrix._34 + Matrix._32;
  44. m_planes[5].d = Matrix._44 + Matrix._42;
  45. D3DXPlaneNormalize(&m_planes[5], &m_planes[5]);
  46. }
  47. // 点监测
  48. BOOL CZFXFrustum::CheckPoint( D3DXVECTOR3 ptPos )
  49. {
  50. // Make sure point is in frustum
  51. for(int i=0;i<6;i++)
  52. {
  53. if( D3DXPlaneDotCoord(&m_planes[i], &ptPos) < 0.0f )
  54. return FALSE;
  55. }
  56. return TRUE;
  57. }
  58. // 立方体检测,只要有一个顶点在裁减体之内就认为可见
  59. BOOL CZFXFrustum::CheckCube( D3DXVECTOR3 centerPos, float size )
  60. {
  61. // 定义立方体的八个顶点
  62. float sizeDivd2 = size/2;
  63. D3DXVECTOR3 posVertices[8];
  64. posVertices[0] = centerPos + D3DXVECTOR3(-sizeDivd2,-sizeDivd2,-sizeDivd2 );
  65. posVertices[1] = centerPos + D3DXVECTOR3(-sizeDivd2,-sizeDivd2, sizeDivd2 );
  66. posVertices[2] = centerPos + D3DXVECTOR3(-sizeDivd2, sizeDivd2, sizeDivd2 );
  67. posVertices[3] = centerPos + D3DXVECTOR3(-sizeDivd2, sizeDivd2,-sizeDivd2 );
  68. posVertices[4] = centerPos + D3DXVECTOR3( sizeDivd2,-sizeDivd2,-sizeDivd2 );
  69. posVertices[5] = centerPos + D3DXVECTOR3( sizeDivd2,-sizeDivd2, sizeDivd2 );
  70. posVertices[6] = centerPos + D3DXVECTOR3( sizeDivd2, sizeDivd2,-sizeDivd2 );
  71. posVertices[7] = centerPos + D3DXVECTOR3( sizeDivd2, sizeDivd2, sizeDivd2 );
  72. for(int i=0;i<8;i++)
  73. {
  74. if( CheckPoint( posVertices[i] ))
  75. return TRUE;
  76. }
  77. return FALSE;
  78. }
  79. // 矩形检测,与立方体检测的区别是,它默认矩形与 XOY 平面平行,不考虑垂直(Y)方向上的因素
  80. // 只要有一个顶点在裁减体之内就认为可见
  81. BOOL CZFXFrustum::CheckRectangle( D3DXVECTOR3 centerPos, float size )
  82. {
  83. float sizeDivd2 = size/2;
  84. D3DXVECTOR3 posVertices[4];
  85. posVertices[0] = centerPos + D3DXVECTOR3(-sizeDivd2, 0,-sizeDivd2 );
  86. posVertices[1] = centerPos + D3DXVECTOR3(-sizeDivd2, 0, sizeDivd2 );
  87. posVertices[2] = centerPos + D3DXVECTOR3( sizeDivd2, 0, sizeDivd2 );
  88. posVertices[3] = centerPos + D3DXVECTOR3( sizeDivd2, 0,-sizeDivd2 );
  89. for(int i=0;i<4;i++)
  90. {
  91. if( CheckPoint( posVertices[i] ))
  92. return TRUE;
  93. }
  94. return FALSE;
  95. }
  96. // 球体检测
  97. BOOL CZFXFrustum::CheckSphere( D3DXVECTOR3 centerPos, float radius )
  98. {
  99. for(int i=0;i<6;i++)
  100. {
  101. if( D3DXPlaneDotCoord(&m_planes[i], &centerPos) < -radius )
  102. return FALSE;
  103. }
  104. return TRUE;
  105. }