游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3000|回复: 1

D3D怎么得到视距和视平面的宽高?

[复制链接]

13

主题

36

帖子

301

积分

中级会员

Rank: 3Rank: 3

积分
301
发表于 2014-9-2 08:54:04 | 显示全部楼层 |阅读模式
本帖最后由 书径尘 于 2014-9-2 09:14 编辑

未标题-2 拷贝.jpg
如图,黄色为视距,绿色为视平面的宽,红色为视平面的高
D3D如何得到?

13

主题

36

帖子

301

积分

中级会员

Rank: 3Rank: 3

积分
301
 楼主| 发表于 2014-9-3 13:55:03 | 显示全部楼层
找到答案了:
http://hi.baidu.com/laizhishen/item/bd0aedf1850316c9521c265e

贴下代码
  1.         class CFrustum
  2.         {
  3.         public:
  4.                 CFrustum() {}
  5.                 ~CFrustum() {}

  6.         public:
  7.                 void        InitFrustum(const D3DXMATRIX& aoViewMatrix,const D3DXMATRIX& aoProjMatrix);
  8.                 BOOL        PointInFrustum(float afX, float afY, float afZ);
  9.                 BOOL        SphereInFrustum(float afX, float afY, float afZ, float AfRadius );
  10.                 BOOL        CubeInFrustum(float afX, float afY, float afZ, float aiSize,BOOL& abIsCompletelyContained);

  11.         private:
  12.                 enum
  13.                 {
  14.                         FRUSTUM_PLANE_NEAR                = 0,
  15.                         FRUSTUM_PLANE_FAR                = 1,
  16.                         FRUSTUM_PLANE_LEFT                = 2,
  17.                         FRUSTUM_PLANE_RIGHT                = 3,
  18.                         FRUSTUM_PLANE_TOP                = 4,
  19.                         FRUSTUM_PLANE_BOTTOM        = 5,

  20.                         FRUSTUM_PLANE_COUNT,
  21.                 };

  22.         private:
  23.                 D3DXPLANE moFrustumPlane[FRUSTUM_PLANE_COUNT];
  24.         };


  25. void CFrustum::InitFrustum(const D3DXMATRIX& aoViewMatrix,const D3DXMATRIX& aoProjMatrix)
  26.         {
  27.                 D3DXMATRIX loComboMatrix;
  28.                 D3DXMatrixMultiply(&loComboMatrix,&aoViewMatrix, &aoProjMatrix);

  29.                 // calculate the planes

  30.                 // Near
  31.                 D3DXPLANE* lpPlane = &moFrustumPlane[FRUSTUM_PLANE_NEAR];
  32.                 lpPlane->a = loComboMatrix._14 + loComboMatrix._13;
  33.                 lpPlane->b = loComboMatrix._24 + loComboMatrix._23;
  34.                 lpPlane->c = loComboMatrix._34 + loComboMatrix._33;
  35.                 lpPlane->d = loComboMatrix._44 + loComboMatrix._43;
  36.                 D3DXPlaneNormalize(lpPlane,lpPlane);

  37.                 // Far
  38.                 lpPlane = &moFrustumPlane[FRUSTUM_PLANE_FAR];
  39.                 lpPlane->a = loComboMatrix._14 - loComboMatrix._13;
  40.                 lpPlane->b = loComboMatrix._24 - loComboMatrix._23;
  41.                 lpPlane->c = loComboMatrix._34 - loComboMatrix._33;
  42.                 lpPlane->d = loComboMatrix._44 - loComboMatrix._43;
  43.                 D3DXPlaneNormalize(lpPlane,lpPlane);

  44.                 //Left
  45.                 lpPlane = &moFrustumPlane[FRUSTUM_PLANE_LEFT];
  46.                 lpPlane->a = loComboMatrix._14 + loComboMatrix._11; // Left
  47.                 lpPlane->b = loComboMatrix._24 + loComboMatrix._21;
  48.                 lpPlane->c = loComboMatrix._34 + loComboMatrix._31;
  49.                 lpPlane->d = loComboMatrix._44 + loComboMatrix._41;
  50.                 D3DXPlaneNormalize(lpPlane,lpPlane);

  51.                 // Right
  52.                 lpPlane = &moFrustumPlane[FRUSTUM_PLANE_RIGHT];
  53.                 lpPlane->a = loComboMatrix._14 - loComboMatrix._11;
  54.                 lpPlane->b = loComboMatrix._24 - loComboMatrix._21;
  55.                 lpPlane->c = loComboMatrix._34 - loComboMatrix._31;
  56.                 lpPlane->d = loComboMatrix._44 - loComboMatrix._41;
  57.                 D3DXPlaneNormalize(lpPlane,lpPlane);

  58.                 // Top
  59.                 lpPlane = &moFrustumPlane[FRUSTUM_PLANE_TOP];
  60.                 lpPlane->a = loComboMatrix._14 - loComboMatrix._12;
  61.                 lpPlane->b = loComboMatrix._24 - loComboMatrix._22;
  62.                 lpPlane->c = loComboMatrix._34 - loComboMatrix._32;
  63.                 lpPlane->d = loComboMatrix._44 - loComboMatrix._42;
  64.                 D3DXPlaneNormalize(lpPlane,lpPlane);

  65.                 // Bottom
  66.                 lpPlane = &moFrustumPlane[FRUSTUM_PLANE_BOTTOM];
  67.                 lpPlane->a = loComboMatrix._14 + loComboMatrix._12; // Bottom
  68.                 lpPlane->b = loComboMatrix._24 + loComboMatrix._22;
  69.                 lpPlane->c = loComboMatrix._34 + loComboMatrix._32;
  70.                 lpPlane->d = loComboMatrix._44 + loComboMatrix._42;
  71.                 D3DXPlaneNormalize(lpPlane,lpPlane);
  72.         }

  73.         BOOL CFrustum::PointInFrustum(float afX, float afY, float afZ )
  74.         {
  75.                 // A*x+B*y+C*z+D = 0  is inplane,
  76.                 for(int i = 0; i < FRUSTUM_PLANE_COUNT; i++)
  77.                 {
  78.                         D3DXPLANE &loPlane = moFrustumPlane[i];

  79.                         //减少函数调用
  80.                         //if(D3DXPlaneDotCoord(&moFrustumPlane[i],&D3DXVECTOR3(afX, afY, afZ)) <0.0f)
  81.                         if(loPlane.a * afX + loPlane.b * afY + loPlane.c * afZ +loPlane.d < 0.0f)
  82.                                 return FALSE;
  83.                 }

  84.                 return TRUE;
  85.         }

  86.         BOOL CFrustum::SphereInFrustum(float afX, float afY, float afZ, float AfRadius)
  87.         {
  88.                 // A*x+B*y+C*z+D = -radius  is inplane,
  89.                 for(int i = 0; i < FRUSTUM_PLANE_COUNT; i++)
  90.                 {
  91.                         D3DXPLANE &loPlane = moFrustumPlane[i];

  92.                         //减少函数调用,直接用公式运算
  93.                         //if(D3DXPlaneDotCoord(&moFrustumPlane[i],&D3DXVECTOR3(afX, afY, afZ)) <-AfRadius)
  94.                         if( loPlane.a * afX + loPlane.b * afY + loPlane.c * afZ +loPlane.d <= -AfRadius )
  95.                                 return false;
  96.                 }

  97.                 return TRUE;
  98.         }

  99.         BOOL CFrustum::CubeInFrustum(float afX, float afY, float afZ, float aiSize,BOOL& abIsCompletelyContained)
  100.         {
  101.                 float lfAlfaX  = afX + aiSize;
  102.                 float lfDeltaX = afX - aiSize;
  103.                 float lfAlfaY  = afY + aiSize;
  104.                 float lfDeltaY = afY - aiSize;
  105.                 float lfAlfaZ  = afZ + aiSize;
  106.                 float lfDeltaZ = afZ - aiSize;
  107.                 DWORD ldwNumPointInFrustum = 0;

  108.                 for(int i = 0; i < FRUSTUM_PLANE_COUNT; i++)
  109.                 {
  110.                         int j = 8;
  111.                         BOOL lbIsInAllPlanes = TRUE;
  112.                         D3DXPLANE &loPlane = moFrustumPlane[i];

  113.                         //if(D3DXPlaneDotCoord(&loPlane[i],&D3DXVECTOR3(lfDeltaX,lfDeltaY, lfDeltaZ))< 0.0f)
  114.                         if(loPlane.a * lfDeltaX + loPlane.b * lfDeltaY + loPlane.c *lfDeltaZ + loPlane.d < 0.0f)
  115.                         {
  116.                                 lbIsInAllPlanes = FALSE;
  117.                                 j--;
  118.                         }

  119.                         //if(D3DXPlaneDotCoord(&loPlane[i],&D3DXVECTOR3(lfAlfaX,lfDeltaY, lfDeltaZ))< 0.0f)
  120.                         if(loPlane.a * lfAlfaX + loPlane.b * lfDeltaY + loPlane.c *lfDeltaZ + loPlane.d < 0.0f)
  121.                         {
  122.                                 lbIsInAllPlanes = FALSE;
  123.                                 j--;
  124.                         }

  125.                         //if(D3DXPlaneDotCoord(&loPlane[i],&D3DXVECTOR3(lfDeltaX,lfAlfaY, lfDeltaZ))< 0.0f)
  126.                         if(loPlane.a * lfDeltaX + loPlane.b * lfAlfaY + loPlane.c *lfDeltaZ + loPlane.d < 0.0f)
  127.                         {
  128.                                 lbIsInAllPlanes = FALSE;
  129.                                 j--;
  130.                         }

  131.                         //if(D3DXPlaneDotCoord(&loPlane[i],&D3DXVECTOR3(lfAlfaX,lfAlfaY, lfAlfaZ))< 0.0f)
  132.                         if(loPlane.a * lfAlfaX + loPlane.b * lfAlfaY + loPlane.c *lfDeltaZ + loPlane.d < 0.0f)
  133.                         {
  134.                                 lbIsInAllPlanes = FALSE;
  135.                                 j--;
  136.                         }

  137.                         //if(D3DXPlaneDotCoord(&loPlane[i],&D3DXVECTOR3(lfDeltaX,lfDeltaY, lfAlfaZ))< 0.0f)
  138.                         if(loPlane.a * lfDeltaX + loPlane.b * lfDeltaY + loPlane.c *lfAlfaZ + loPlane.d < 0.0f)
  139.                         {
  140.                                 lbIsInAllPlanes = FALSE;
  141.                                 j--;
  142.                         }

  143.                         //if(D3DXPlaneDotCoord(&loPlane[i],&D3DXVECTOR3(lfAlfaX,lfDeltaY, lfAlfaZ))< 0.0f)
  144.                         if(loPlane.a * lfAlfaX + loPlane.b * lfDeltaY + loPlane.c *lfAlfaZ + loPlane.d < 0.0f)
  145.                         {
  146.                                 lbIsInAllPlanes = FALSE;
  147.                                 j--;
  148.                         }

  149.                         //if(D3DXPlaneDotCoord(&loPlane[i],&D3DXVECTOR3(lfDeltaX,lfDeltaY, lfAlfaZ))< 0.0f)
  150.                         if(loPlane.a * lfDeltaX + loPlane.b * lfDeltaY + loPlane.c *lfAlfaZ + loPlane.d < 0.0f)
  151.                         {
  152.                                 lbIsInAllPlanes = FALSE;
  153.                                 j--;
  154.                         }

  155.                         //if(D3DXPlaneDotCoord(&loPlane[i],&D3DXVECTOR3(lfAlfaX,lfAlfaY, lfAlfaZ))< 0.0f)
  156.                         if(loPlane.a * lfAlfaX + loPlane.b * lfAlfaY + loPlane.c *lfAlfaZ + loPlane.d < 0.0f)
  157.                         {
  158.                                 lbIsInAllPlanes = FALSE;
  159.                                 j--;
  160.                         }

  161.                         // if none contained, return FALSE.
  162.                         if(0 == j)
  163.                                 return FALSE;

  164.                         // update counter if they were all in front of plane.
  165.                         if(lbIsInAllPlanes)
  166.                                 ++ldwNumPointInFrustum;
  167.                 }

  168.                 abIsCompletelyContained = (BOOL)(ldwNumPointInFrustum ==FRUSTUM_PLANE_COUNT);

  169.                 return TRUE;
  170.         }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-2-26 01:53

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表