📄 frustum.cpp
字号:
#include "HEADERS.H"
#include "FRUSTUM.H"
BOOL FRUSTUM::CheckSphere(FLOAT XCenter,FLOAT YCenter,FLOAT ZCenter,FLOAT fRadius)
{
// Make sure radius is in frustum
for(SHORT i=0;i<6;i++) {
if(D3DXPlaneDotCoord(&m_vFrustum[i], &D3DXVECTOR3(XCenter, YCenter, ZCenter)) < -fRadius)
return FALSE;
}
return TRUE;
}
BOOL FRUSTUM::CheckRectangle(FLOAT XCenter,FLOAT YCenter,FLOAT ZCenter,
FLOAT XSize,FLOAT YSize,FLOAT ZSize)
{
// Make sure at least one point is in frustum
for(SHORT i=0;i<6;i++) {
if(D3DXPlaneDotCoord(&m_vFrustum[i],&D3DXVECTOR3(XCenter-XSize, YCenter-YSize,ZCenter-ZSize)) >= 0.0f)
continue;
if(D3DXPlaneDotCoord(&m_vFrustum[i],&D3DXVECTOR3(XCenter+XSize, YCenter-YSize,ZCenter-ZSize)) >= 0.0f)
continue;
if(D3DXPlaneDotCoord(&m_vFrustum[i],&D3DXVECTOR3(XCenter-XSize, YCenter+YSize,ZCenter-ZSize)) >= 0.0f)
continue;
if(D3DXPlaneDotCoord(&m_vFrustum[i],&D3DXVECTOR3(XCenter+XSize, YCenter+YSize,ZCenter-ZSize)) >= 0.0f)
continue;
if(D3DXPlaneDotCoord(&m_vFrustum[i],&D3DXVECTOR3(XCenter-XSize, YCenter-YSize,ZCenter+ZSize)) >= 0.0f)
continue;
if(D3DXPlaneDotCoord(&m_vFrustum[i],&D3DXVECTOR3(XCenter+XSize, YCenter-YSize,ZCenter+ZSize)) >= 0.0f)
continue;
if(D3DXPlaneDotCoord(&m_vFrustum[i],&D3DXVECTOR3(XCenter-XSize, YCenter+YSize,ZCenter+ZSize)) >= 0.0f)
continue;
if(D3DXPlaneDotCoord(&m_vFrustum[i],&D3DXVECTOR3(XCenter+XSize, YCenter+YSize,ZCenter+ZSize)) >= 0.0f)
continue;
return FALSE;
}
return TRUE;
}
BOOL FRUSTUM::CheckCube(FLOAT XCenter,FLOAT YCenter,FLOAT ZCenter,FLOAT fSize)
{
for(SHORT i=0;i<6;i++)
{
if(D3DXPlaneDotCoord(&m_vFrustum[i],&D3DXVECTOR3(XCenter-fSize, YCenter-fSize,ZCenter-fSize)) >= 0.0f)
continue;
if(D3DXPlaneDotCoord(&m_vFrustum[i],&D3DXVECTOR3(XCenter+fSize, YCenter-fSize,ZCenter-fSize)) >= 0.0f)
continue;
if(D3DXPlaneDotCoord(&m_vFrustum[i],&D3DXVECTOR3(XCenter-fSize, YCenter+fSize,ZCenter-fSize)) >= 0.0f)
continue;
if(D3DXPlaneDotCoord(&m_vFrustum[i],&D3DXVECTOR3(XCenter+fSize, YCenter+fSize,ZCenter-fSize)) >= 0.0f)
continue;
if(D3DXPlaneDotCoord(&m_vFrustum[i],&D3DXVECTOR3(XCenter-fSize, YCenter-fSize,ZCenter+fSize)) >= 0.0f)
continue;
if(D3DXPlaneDotCoord(&m_vFrustum[i],&D3DXVECTOR3(XCenter+fSize, YCenter-fSize,ZCenter+fSize)) >= 0.0f)
continue;
if(D3DXPlaneDotCoord(&m_vFrustum[i],&D3DXVECTOR3(XCenter-fSize, YCenter+fSize,ZCenter+fSize)) >= 0.0f)
continue;
if(D3DXPlaneDotCoord(&m_vFrustum[i],&D3DXVECTOR3(XCenter+fSize, YCenter+fSize,ZCenter+fSize)) >= 0.0f)
continue;
return FALSE;
}
return TRUE;
}
BOOL FRUSTUM::CheckPoint(FLOAT XPos,FLOAT YPos,FLOAT ZPos)
{
// Make sure point is in frustum
for(SHORT i=0;i<6;i++)
{
if(D3DXPlaneDotCoord(&m_vFrustum[i],&D3DXVECTOR3(XPos, YPos, ZPos)) < 0.0f)
return FALSE;
}
return TRUE;
}
VOID FRUSTUM::CalculateFrustum(LPDIRECT3DDEVICE8 device,FLOAT fZDistance)
{
D3DXMATRIX Matrix, matView, matProj;
FLOAT ZMin, Q;
// Calculate FOV data
device->GetTransform(D3DTS_PROJECTION,&matProj);
if(fZDistance != 0.0f)
{
ZMin = -matProj._43 / matProj._33;
Q = fZDistance / (fZDistance - ZMin);
matProj._33 = Q;
matProj._43 = -Q * ZMin;
}
device->GetTransform(D3DTS_VIEW, &matView);
D3DXMatrixMultiply(&Matrix, &matView, &matProj);
// Calculate the planes
m_vFrustum[0].a = Matrix._14 + Matrix._13; // Near plane
m_vFrustum[0].b = Matrix._24 + Matrix._23;
m_vFrustum[0].c = Matrix._34 + Matrix._33;
m_vFrustum[0].d = Matrix._44 + Matrix._43;
D3DXPlaneNormalize(&m_vFrustum[0], &m_vFrustum[0]);
m_vFrustum[1].a = Matrix._14 - Matrix._13; // Far plane
m_vFrustum[1].b = Matrix._24 - Matrix._23;
m_vFrustum[1].c = Matrix._34 - Matrix._33;
m_vFrustum[1].d = Matrix._44 - Matrix._43;
D3DXPlaneNormalize(&m_vFrustum[1], &m_vFrustum[1]);
m_vFrustum[2].a = Matrix._14 + Matrix._11; // Left plane
m_vFrustum[2].b = Matrix._24 + Matrix._21;
m_vFrustum[2].c = Matrix._34 + Matrix._31;
m_vFrustum[2].d = Matrix._44 + Matrix._41;
D3DXPlaneNormalize(&m_vFrustum[2], &m_vFrustum[2]);
m_vFrustum[3].a = Matrix._14 - Matrix._11; // Right plane
m_vFrustum[3].b = Matrix._24 - Matrix._21;
m_vFrustum[3].c = Matrix._34 - Matrix._31;
m_vFrustum[3].d = Matrix._44 - Matrix._41;
D3DXPlaneNormalize(&m_vFrustum[3], &m_vFrustum[3]);
m_vFrustum[4].a = Matrix._14 - Matrix._12; // Top plane
m_vFrustum[4].b = Matrix._24 - Matrix._22;
m_vFrustum[4].c = Matrix._34 - Matrix._32;
m_vFrustum[4].d = Matrix._44 - Matrix._42;
D3DXPlaneNormalize(&m_vFrustum[4], &m_vFrustum[4]);
m_vFrustum[5].a = Matrix._14 + Matrix._12; // Bottom plane
m_vFrustum[5].b = Matrix._24 + Matrix._22;
m_vFrustum[5].c = Matrix._34 + Matrix._32;
m_vFrustum[5].d = Matrix._44 + Matrix._42;
D3DXPlaneNormalize(&m_vFrustum[5], &m_vFrustum[5]);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -