📄 frustum.cpp
字号:
// Frustum.cpp: implementation of the CFrustum class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CFrustum::CFrustum()
{
ZeroMemory( m_vtx, sizeof( m_vtx[0] ) * 8 );
ZeroMemory( m_plane, sizeof( m_plane[0] ) * 6 );
ZeroMemory( m_vFireVertex, sizeof( m_vFireVertex[0] ) * 8 );
ZeroMemory( m_planeFire, sizeof( m_planeFire[0] ) * 6 );
ZeroMemory( m_vCamVertex, sizeof( m_vCamVertex[0] ) * 8 );
ZeroMemory( m_planeCam, sizeof( m_planeCam[0] ) * 6 );
D3DXMatrixPerspectiveFovLH( &m_mFireProj, D3DX_PI/18, 0.5f, 1.0f, 1000.0f ); // 埃拜阑 20档风 技泼..
D3DXMatrixPerspectiveFovLH( &m_mCamProj, D3DX_PI/18, 1.0f, -5.0f, 2.f ); // 埃拜阑 20档风 技泼..
}
CFrustum::~CFrustum()
{
}
D3DXVECTOR3 CFrustum::CreateFrustum( D3DXVECTOR3 * pVtx, D3DXPLANE * pPlane, D3DXMATRIXA16* pmatViewProj )
{
int i;
D3DXMATRIXA16 matInv;
D3DXVECTOR3 vPos;
pVtx[0].x = -1.0f; pVtx[0].y = -1.0f; pVtx[0].z = 0.0f;
pVtx[1].x = 1.0f; pVtx[1].y = -1.0f; pVtx[1].z = 0.0f;
pVtx[2].x = 1.0f; pVtx[2].y = -1.0f; pVtx[2].z = 1.0f;
pVtx[3].x = -1.0f; pVtx[3].y = -1.0f; pVtx[3].z = 1.0f;
pVtx[4].x = -1.0f; pVtx[4].y = 1.0f; pVtx[4].z = 0.0f;
pVtx[5].x = 1.0f; pVtx[5].y = 1.0f; pVtx[5].z = 0.0f;
pVtx[6].x = 1.0f; pVtx[6].y = 1.0f; pVtx[6].z = 1.0f;
pVtx[7].x = -1.0f; pVtx[7].y = 1.0f; pVtx[7].z = 1.0f;
D3DXMatrixInverse(&matInv, NULL, pmatViewProj );
for( i = 0; i < 8; i++ )
D3DXVec3TransformCoord( &pVtx[i], &pVtx[i], &matInv );
vPos = ( pVtx[0] + pVtx[5] ) / 2.0f;
D3DXPlaneFromPoints(&pPlane[0], pVtx+4, pVtx+7, pVtx+6); // 惑 乞搁(top)
D3DXPlaneFromPoints(&pPlane[1], pVtx , pVtx+1, pVtx+2); // 窍 乞搁(bottom)
D3DXPlaneFromPoints(&pPlane[2], pVtx , pVtx+4, pVtx+5); // 辟 乞搁(near)
D3DXPlaneFromPoints(&pPlane[3], pVtx+2, pVtx+6, pVtx+7); // 盔 乞搁(far)
D3DXPlaneFromPoints(&pPlane[4], pVtx , pVtx+3, pVtx+7); // 谅 乞搁(left)
D3DXPlaneFromPoints(&pPlane[5], pVtx+1, pVtx+5, pVtx+6); // 快 乞搁(right)
return vPos;
}
BOOL CFrustum::Make( D3DXMATRIXA16* pmatViewProj )
{
m_vPos = CreateFrustum( m_vtx, m_plane, pmatViewProj ); // 扁夯 轰 橇矾胶乓..
/**/
D3DXMATRIX mView = g_pCamera->GetViewMatrix();
D3DXMATRIXA16 mFrustum = mView * m_mFireProj;
m_vFirePos = CreateFrustum( m_vFireVertex, m_planeFire, &mFrustum ); // 荤拜侩 橇矾胶乓..
D3DXMATRIXA16 mFrustumCam = mView * m_mCamProj;
m_vCamPos = CreateFrustum( m_vCamVertex, m_planeCam, &mFrustumCam ); // 扁夯 轰 橇矾胶乓..
/**/
return TRUE;
}
BOOL CFrustum::IsIn( D3DXVECTOR3* pv )
{
float fDist;
for(int i = 0 ; i < 6 ; i++ )
{
fDist = D3DXPlaneDotCoord( &m_plane[i], pv );
if( fDist > PLANE_EPSILON ) return FALSE; // plane狼 normal氦磐啊 far肺 氢窍绊 乐栏骨肺 剧荐捞搁 橇矾胶乓狼 官冰率
}
return TRUE;
}
BOOL CFrustum::IsInSphere( D3DXVECTOR3* pv, float radius )
{
float fDist;
int i;
for( i = 0 ; i < 6 ; i++ )
{
fDist = D3DXPlaneDotCoord( &m_plane[i], pv );
if( fDist > (radius+PLANE_EPSILON) ) return FALSE; // 乞搁苞 吝缴痢狼 芭府啊 馆瘤抚焊促 农搁 橇矾胶乓俊 绝澜
}
return TRUE;
}
int __fastcall CFrustum::IsInEx( D3DXVECTOR3 pv, int nValue )
{
float fDist;
int nRet = nValue;
int i = 0;
if((nValue & CULL_VIEW))
{
for(i = 0 ; i < 6 ; i++ )
{
if(i <= 2)
continue;
fDist = D3DXPlaneDotCoord( &m_plane[i], &pv );
if( fDist > PLANE_EPSILON )
{
//nRet |= CULL_VIEW;
nRet ^= CULL_VIEW;
if((nRet & CULL_FIRE))
nRet ^= CULL_FIRE;
break;
}
}
if((nRet & CULL_VIEW) && (nValue & CULL_FIRE))
{
for( i = 0 ; i < 6 ; i++ )
{
if(i <= 2)
continue;
fDist = D3DXPlaneDotCoord( &m_planeFire[i], &pv );
if( fDist > PLANE_EPSILON )
{
//nRet |= CULL_FIRE;
nRet ^= CULL_FIRE;
break;
}
}
}
}
if((nValue & CULL_CAM))
{
for( i = 0 ; i < 6 ; i++ )
{
if(i <= 2)
continue;
fDist = D3DXPlaneDotCoord( &m_planeCam[i], &pv );
if( fDist > PLANE_EPSILON )
{
//nRet |= CULL_CAM;
nRet ^= CULL_CAM;
break;
}
}
}
return nRet;
}
int __fastcall CFrustum::IsInSphereEx( D3DXVECTOR3 pv, float radius, int nValue )
{
float fDist;
int nRet = nValue;
int i = 0;
if((nValue & CULL_VIEW))
{
for(int i = 0 ; i < 6 ; i++ )
{
if(i <= 2)
continue;
fDist = D3DXPlaneDotCoord( &m_plane[i], &pv );
if( fDist > (radius+PLANE_EPSILON) )
{
nRet ^= CULL_VIEW;
if((nRet & CULL_FIRE))
nRet ^= CULL_FIRE;
break;
}
}
// return nRet;
if((nRet & CULL_VIEW) && (nValue & CULL_FIRE))
{
for( i = 0 ; i < 6 ; i++ )
{
if(i <= 2)
continue;
fDist = D3DXPlaneDotCoord( &m_planeFire[i], &pv );
if( fDist > (radius+PLANE_EPSILON) )
{
//nRet |= CULL_FIRE;
nRet ^= CULL_FIRE;
break;
}
}
}
}
if((nValue & CULL_CAM))
{
for( i = 0 ; i < 6 ; i++ )
{
if(i <= 2)
continue;
fDist = D3DXPlaneDotCoord( &m_planeCam[i], &pv );
if( fDist > (radius+PLANE_EPSILON) )
{
nRet ^= CULL_CAM;
break;
}
}
}
if(nRet)
int cde =0;
return nRet;
}
int __fastcall CFrustum::IsInEx2( D3DXVECTOR3 pv, int nValue )
{
float fDist[3] = {0};
int nRet = nValue;
int i = 0;
if((nValue & CULL_VIEW))
{
fDist[0] = D3DXPlaneDotCoord( &m_plane[3], &pv );
// fDist[1] = D3DXPlaneDotCoord( &m_plane[4], &pv );
// fDist[2] = D3DXPlaneDotCoord( &m_plane[5], &pv );
// for( i=0;i<3;i++)
{
if( fDist[0] > PLANE_EPSILON )
{
nRet ^= CULL_VIEW;
if((nRet & CULL_FIRE))
nRet ^= CULL_FIRE;
// break;
}
}
if((nRet & CULL_VIEW) && (nValue & CULL_FIRE))
{
fDist[0] = D3DXPlaneDotCoord( &m_planeFire[3], &pv );
// fDist[1] = D3DXPlaneDotCoord( &m_planeFire[4], &pv );
// fDist[2] = D3DXPlaneDotCoord( &m_planeFire[5], &pv );
fDist[2] = D3DXPlaneDotCoord( &m_planeFire[2], &pv );
// for( i=0;i<3;i++)
{
if( fDist[0] > PLANE_EPSILON )
{
nRet ^= CULL_FIRE;
// break;
}
if( fDist[2] > 0 )
{
nRet ^= CULL_FIRE;
// break;
}
}
}
}
nRet ^= CULL_CAM;
return nRet;
}
BOOL __fastcall CFrustum::IsFireInEx( D3DXVECTOR3 pv )
{
float fDist;
for( int i=0; i < 6; i++ )
{
if(i <= 2)
continue;
fDist = D3DXPlaneDotCoord( &m_planeFire[i], &pv );
if( fDist > PLANE_EPSILON ) return FALSE;
}
return TRUE;
}
int __fastcall CFrustum::IsInFireSphereEx( D3DXVECTOR3 pv, float radius )
{
float fDist;
for( int i=0; i < 6; i++ )
{
if(i <= 2)
continue;
fDist = D3DXPlaneDotCoord( &m_planeFire[i], &pv );
if( fDist > (radius+PLANE_EPSILON) ) return FALSE; // 乞搁苞 吝缴痢狼 芭府啊 馆瘤抚焊促 农搁 橇矾胶乓俊 绝澜
}
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -