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

📄 frustum.h

📁 VC++ DEMO, used for the beginners and the amour
💻 H
字号:
#ifdef CGE_HEADER_H
#ifndef CGE_FRUSTUM_H
#define CGE_FRUSTUM_H

namespace CGE
{
	namespace CULLING
	{
		typedef class FRUSTUM
		{
			public:
				VOID CalculateFrustum(LPDIRECT3DDEVICE8 device,FLOAT fZDistance);
				BOOL CheckPoint(FLOAT XPos,FLOAT YPos,FLOAT ZPos);
				BOOL CheckCube(FLOAT XCenter,FLOAT YCenter,FLOAT ZCenter,FLOAT fSize);
				BOOL CheckSphere(FLOAT XCenter,FLOAT YCenter,FLOAT ZCenter,FLOAT fRadian);
				BOOL CheckRectangle(FLOAT XCenter,FLOAT YCenter,FLOAT ZCenter,
									FLOAT XSize,FLOAT YSize,FLOAT ZSize);
				D3DXPLANE m_vFrustum[6];
		}*LPFRUSTUM;

		CGE_INLINE	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;
		}

		CGE_INLINE	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;
			
		}

		CGE_INLINE 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;
		}

		CGE_INLINE 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;
		}
		
		CGE_INLINE 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]);
		}
	}
}
#endif
#endif

⌨️ 快捷键说明

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