⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 frustum.cpp

📁 里内面有两个关于地形的模拟的范例,仔细看一下会收获不小啊
💻 CPP
字号:
#include "..\..\GameEngine\GameEngine_Common.h"
#include "Frustum.h"

bool CFrustum::GetFrustum(LPDIRECT3DDEVICE9 pd3dDevice, float ZDistance)
{
  D3DXMATRIX matWorld, matView, matProj;
  float ZMin,Q;
  //检查设备是否为空
  if(pd3dDevice == NULL)
    return false;
  //取得投影变换矩阵
  pd3dDevice->GetTransform(D3DTS_PROJECTION, &matProj);
  if(ZDistance != 0.0f) {
    //根据新的距离,重新计算投影变换矩阵
    ZMin = -matProj._43 / matProj._33;
    Q = ZDistance / (ZDistance - ZMin);
    matProj._33 = Q;
    matProj._43 = -Q * ZMin;
  }
  //取得摄影变换矩阵
  pd3dDevice->GetTransform(D3DTS_VIEW, &matView);
  //计算摄影和投影变换后的世界变换矩阵
  D3DXMatrixMultiply(&matWorld, &matView, &matProj);
  //计算视截体的6个平面方程
  m_Planes[0].a = matWorld._13; //近平面
  m_Planes[0].b = matWorld._23;
  m_Planes[0].c = matWorld._33;
  m_Planes[0].d = matWorld._43;
  D3DXPlaneNormalize(&m_Planes[0], &m_Planes[0]);

  m_Planes[1].a = matWorld._14 - matWorld._13; //远平面
  m_Planes[1].b = matWorld._24 - matWorld._23;
  m_Planes[1].c = matWorld._34 - matWorld._33;
  m_Planes[1].d = matWorld._44 - matWorld._43;
  D3DXPlaneNormalize(&m_Planes[1], &m_Planes[1]);

  m_Planes[2].a = matWorld._14 + matWorld._11; //左平面
  m_Planes[2].b = matWorld._24 + matWorld._21;
  m_Planes[2].c = matWorld._34 + matWorld._31;
  m_Planes[2].d = matWorld._44 + matWorld._41;
  D3DXPlaneNormalize(&m_Planes[2], &m_Planes[2]);

  m_Planes[3].a = matWorld._14 - matWorld._11; //右平面
  m_Planes[3].b = matWorld._24 - matWorld._21;
  m_Planes[3].c = matWorld._34 - matWorld._31;
  m_Planes[3].d = matWorld._44 - matWorld._41;
  D3DXPlaneNormalize(&m_Planes[3], &m_Planes[3]);

  m_Planes[4].a = matWorld._14 - matWorld._12; //顶面
  m_Planes[4].b = matWorld._24 - matWorld._22;
  m_Planes[4].c = matWorld._34 - matWorld._32;
  m_Planes[4].d = matWorld._44 - matWorld._42;
  D3DXPlaneNormalize(&m_Planes[4], &m_Planes[4]);

  m_Planes[5].a = matWorld._14 + matWorld._12; //底面
  m_Planes[5].b = matWorld._24 + matWorld._22;
  m_Planes[5].c = matWorld._34 + matWorld._32;
  m_Planes[5].d = matWorld._44 + matWorld._42;
  D3DXPlaneNormalize(&m_Planes[5], &m_Planes[5]);
  return true;
}
//检查点是否在视截体内
bool CFrustum::CheckPoint(float XPos, float YPos, float ZPos)
{
  short i;
  for(i=0;i<6;i++){  //逐个平面进行检查
    if(D3DXPlaneDotCoord(&m_Planes[i], &D3DXVECTOR3(XPos, YPos, ZPos)) < 0.0f)
      return false;  //不在视截体内
  }
  return true;
}
//检查立方体是否在视截体内
bool CFrustum::CheckCube(float XCenter, float YCenter, float ZCenter, float Size)
{
  short i;
  //立方体是否有一点在视截体内
  for(i=0;i<6;i++) {
    if(D3DXPlaneDotCoord(&m_Planes[i], &D3DXVECTOR3(XCenter-Size, YCenter-Size, ZCenter-Size)) >= 0.0f)
      continue;
    if(D3DXPlaneDotCoord(&m_Planes[i], &D3DXVECTOR3(XCenter+Size, YCenter-Size, ZCenter-Size)) >= 0.0f)
      continue;
    if(D3DXPlaneDotCoord(&m_Planes[i], &D3DXVECTOR3(XCenter-Size, YCenter+Size, ZCenter-Size)) >= 0.0f)
      continue;
    if(D3DXPlaneDotCoord(&m_Planes[i], &D3DXVECTOR3(XCenter+Size, YCenter+Size, ZCenter-Size)) >= 0.0f)
      continue;
    if(D3DXPlaneDotCoord(&m_Planes[i], &D3DXVECTOR3(XCenter-Size, YCenter-Size, ZCenter+Size)) >= 0.0f)
      continue;
    if(D3DXPlaneDotCoord(&m_Planes[i], &D3DXVECTOR3(XCenter+Size, YCenter-Size, ZCenter+Size)) >= 0.0f)
      continue;
    if(D3DXPlaneDotCoord(&m_Planes[i], &D3DXVECTOR3(XCenter-Size, YCenter+Size, ZCenter+Size)) >= 0.0f)
      continue;
    if(D3DXPlaneDotCoord(&m_Planes[i], &D3DXVECTOR3(XCenter+Size, YCenter+Size, ZCenter+Size)) >= 0.0f)
      continue;

    return false;
  }
  return true;
}
//检查长方体是否在视截体内
bool CFrustum::CheckRectangle(float XCenter, float YCenter, float ZCenter, float XSize, float YSize, float ZSize)
{
  short i;

  for(i=0;i<6;i++){
    if(D3DXPlaneDotCoord(&m_Planes[i], &D3DXVECTOR3(XCenter-XSize, YCenter-YSize, ZCenter-ZSize)) >= 0.0f)
      continue;
    if(D3DXPlaneDotCoord(&m_Planes[i], &D3DXVECTOR3(XCenter+XSize, YCenter-YSize, ZCenter-ZSize)) >= 0.0f)
      continue;
    if(D3DXPlaneDotCoord(&m_Planes[i], &D3DXVECTOR3(XCenter-XSize, YCenter+YSize, ZCenter-ZSize)) >= 0.0f)
      continue;
    if(D3DXPlaneDotCoord(&m_Planes[i], &D3DXVECTOR3(XCenter+XSize, YCenter+YSize, ZCenter-ZSize)) >= 0.0f)
      continue;
    if(D3DXPlaneDotCoord(&m_Planes[i], &D3DXVECTOR3(XCenter-XSize, YCenter-YSize, ZCenter+ZSize)) >= 0.0f)
      continue;
    if(D3DXPlaneDotCoord(&m_Planes[i], &D3DXVECTOR3(XCenter+XSize, YCenter-YSize, ZCenter+ZSize)) >= 0.0f)
      continue;
    if(D3DXPlaneDotCoord(&m_Planes[i], &D3DXVECTOR3(XCenter-XSize, YCenter+YSize, ZCenter+ZSize)) >= 0.0f)
      continue;
    if(D3DXPlaneDotCoord(&m_Planes[i], &D3DXVECTOR3(XCenter+XSize, YCenter+YSize, ZCenter+ZSize)) >= 0.0f)
      continue;
    return false;
  }
  return true;
}
//检查球体是否在视截体内
bool CFrustum::CheckSphere(float XCenter, float YCenter, float ZCenter, float Radius)
{
  short i;
  //检查球心到各平面的距离是否大于半径
  for(i=0;i<6;i++) {
    if(D3DXPlaneDotCoord(&m_Planes[i], &D3DXVECTOR3(XCenter, YCenter, ZCenter)) < -Radius)
      return false;
  }
  return true;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -