|
|
发表于 2007-6-1 09:43:00
|
显示全部楼层
Re:谁能给个四叉树视锥裁剪的算法例子?
D3DXVECTOR4 frustumPlane[6];
void ComputeFustumPlane( D3DXMATRIX &matCameraViewProj )
{
enum
{
RIGHT,
LEFT,
BOTTOM,
TOP,
PFAR,
PNEAR
};
D3DXMATRIX m = matCameraViewProj;
D3DXVECTOR4 *p;
p=&frustumPlane[RIGHT];
p->x=m[3]-m[0];
p->y=m[7]-m[4];
p->z=m[11]-m[8];
p->w=m[15]-m[12];
p=&frustumPlane[LEFT];
p->x=m[3]+m[0];
p->y=m[7]+m[4];
p->z=m[11]+m[8];
p->w=m[15]+m[12];
p=&frustumPlane[BOTTOM];
p->x=m[3]+m[1];
p->y=m[7]+m[5];
p->z=m[11]+m[9];
p->w=m[15]+m[13];
p=&frustumPlane[TOP];
p->x=m[3]-m[1];
p->y=m[7]-m[5];
p->z=m[11]-m[9];
p->w=m[15]-m[13];
p=&frustumPlane[PFAR];
p->x=m[3]-m[2];
p->y=m[7]-m[6];
p->z=m[11]-m[10];
p->w=m[15]-m[14];
p=&frustumPlane[PNEAR];
p->x=m[3]+m[2];
p->y=m[7]+m[6];
p->z=m[11]+m[10];
p->w=m[15]+m[14];
for(int i=0;i<6;i++)
{
float mag = sqrtf(frustumPlane.x*frustumPlane.x + frustumPlane.y*frustumPlane.y + frustumPlane.z*frustumPlane.z );
frustumPlane.x = frustumPlane.x/mag;
frustumPlane.y = frustumPlane.y/mag;
frustumPlane.z = frustumPlane.z/mag;
frustumPlane.w = frustumPlane.w/mag;
}
}
BOOL CDymQuadTreeObj::isCollectCamera( D3DXMATRIX &matCameraViewProj , D3DXVECTOR3 *pMin , D3DXVECTOR3 *pMax )
{
//if( m_listRenderObj.size () == 0 )return FALSE;
//ComputeFustumPlane( matCameraViewProj );
D3DXVECTOR3 vMin ;
D3DXVECTOR3 vMax ;
if( pMin && pMax )
{
vMin = *pMin;
vMax = *pMax;
}
else
{
D3DXVECTOR3 vMid = D3DXVECTOR3( (m_vMin.x + m_vMax.x) / 2.0f , (m_vMin.y + m_vMax.y) / 2.0f , (m_vMin.z + m_vMax.z) / 2.0f );
D3DXVECTOR3 vSize = D3DXVECTOR3( fabsf( m_vMax.x - m_vMin.x ) , fabsf( m_vMax.y - m_vMin.y ) , fabsf( m_vMax.z - m_vMin.z ) );
vMin = vMid - vSize;
vMax = vMid + vSize;
}
D3DXVECTOR3 v[8];
v[0] = D3DXVECTOR3( vMin.x , vMax.y , vMax.z );
v[1] = D3DXVECTOR3( vMax.x , vMax.y , vMax.z );
v[2] = D3DXVECTOR3( vMax.x , vMax.y , vMin.z );
v[3] = D3DXVECTOR3( vMin.x , vMax.y , vMin.z );
v[4] = D3DXVECTOR3( vMin.x , vMin.y , vMax.z );
v[5] = D3DXVECTOR3( vMax.x , vMin.y , vMax.z );
v[6] = D3DXVECTOR3( vMax.x , vMin.y , vMin.z );
v[7] = D3DXVECTOR3( vMin.x , vMin.y , vMin.z );
int iTotalIn = 0;
for(int i=0;i<6;i++)
{
int iInCount = 8;
// int iPtIn = 1;
D3DXVECTOR4 *p=&frustumPlane;
for(int j = 0; j < 8; j++)
{
//if(Vector3.Dot(new Vector3(p.A,p.B,p.C), bb.corners) + p.D < 0)
if( D3DXVec3Dot( &D3DXVECTOR3( p->x , p->y , p->z ) , &v[j] ) + p->w < 0)
{
// 点在面外
// iPtIn = 0;
--iInCount;
}
}
// 如果八个点都在同一个面外
if(iInCount == 0)
return FALSE;
// iTotalIn += iPtIn;
}
//if(iTotalIn == 6)
return TRUE;
//return FALSE;
}
视锥与四叉树的BOX碰撞检测,isCollectCamera传入视投影矩阵,和四叉树的BOX
反回TRUE就渲染这个叉,反回FALSE就不渲染
-------------------------------------------------------
欢迎加入游戏开发技术交流QQ群:40280598 |
|