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

📄 frustum.cpp

📁 VC++ DEMO, used for the beginners and the amour
💻 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 + -