Sign in to follow this  
ankhd

(Fixed)Help Needed with Frustums and AABB's

Recommended Posts

ankhd    2304
Hi all, The problem is I can't get the camera's view frustum to detect AABB's that are in world coords, if I set the AABB up in object space the frustum will say all nodes are in but if I move the camera or rotate it away from the centre it will cull them so it looks like it sort of works when the AABB are in object space but the frustum is in world space what am I missing besides a brain help needed please. Heres the lay out. The Frustum planes are in world space sample code
D3DXMATRIX VP = (*mView) *(*m_MatProj);//just the projection is viewspace frustum


D3DXVECTOR4 col0(VP(0,0), VP(1,0), VP(2,0), VP(3,0));
D3DXVECTOR4 col1(VP(0,1), VP(1,1), VP(2,1), VP(3,1));
D3DXVECTOR4 col2(VP(0,2), VP(1,2), VP(2,2), VP(3,2));
D3DXVECTOR4 col3(VP(0,3), VP(1,3), VP(2,3), VP(3,3));

// Planes face inward.
mFrustumPlanes[0] = (D3DXPLANE)(col2);        // near
mFrustumPlanes[1] = (D3DXPLANE)(col3 - col2); // far
mFrustumPlanes[2] = (D3DXPLANE)(col3 + col0); // left
mFrustumPlanes[3] = (D3DXPLANE)(col3 - col0); // right
mFrustumPlanes[4] = (D3DXPLANE)(col3 - col1); // top
mFrustumPlanes[5] = (D3DXPLANE)(col3 + col1); // bottom


for(int i = 0; i < 6; i++)
    D3DXPlaneNormalize(&mFrustumPlanes[i], &mFrustumPlanes[i]);



The AABB has these bounds Min[-5120, -500, -5120] Max[5120, 500, 5120] is this Object or world space ????? I'm thinking worldspace The test function

//------------------------------------------------------------------------------
//this returns true if we can see this bit of the terrain
//-------------------------------------------------------------------------------
bool Camera::isVisible(AABB *box)
{
	// Test assumes frustum planes face inward.

	D3DXVECTOR3 P;
	D3DXVECTOR3 Q;

	//      N  *Q                    *P
	//      | /                     /
	//      |/                     /
	// -----/----- Plane     -----/----- Plane    
	//     /                     / |
	//    /                     /  |
	//   *P                    *Q  N
	//
	// PQ forms diagonal most closely aligned with plane normal.

	// For each frustum plane, find the box diagonal (there are four main
	// diagonals that intersect the box center point) that points in the
	// same direction as the normal along each axis (i.e., the diagonal 
	// that is most aligned with the plane normal).  Then test if the box
	// is in front of the plane or not.
	for(int i = 0; i < 6; ++i)
	{
		// For each coordinate axis x, y, z...
		for(int j = 0; j < 3; ++j)
		{
			// Make PQ point in the same direction as the plane normal on this axis.
			if( mFrustumPlanes[i][j] > 0.0f )
			{
				P[j] = box->minPt[j];
				Q[j] = box->maxPt[j];
			}
			else 
			{
				P[j] = box->maxPt[j];
				Q[j] = box->minPt[j];
			}
		}

		// If box is in negative half space, it is behind the plane, and thus, completely
		// outside the frustum.  Note that because PQ points roughly in the direction of the 
		// plane normal, we can deduce that if Q is outside then P is also outside--thus we
		// only need to test Q.
		if( D3DXPlaneDotCoord(&mFrustumPlanes[i], &Q) < 0.0f  ) // outside
			return false;
	}
	return true;
}//end isVisible





Image: description of your image you can see the mesh of the AABBS they look like there in the right location but none are added to the render list. if you need more code Ill post what ever you need if I have it that is thanks inadvance. [Edited by - ankhd on February 23, 2008 12:52:15 AM]

Share this post


Link to post
Share on other sites
ankhd    2304
Hi, well I think I found the error after 4 days(long days)

I was making a cube like this

ID3DXMesh *CreateCube(LPDIRECT3DDEVICE9 Device, AABB *aabb,//we also create its bounding box and return it here
D3DXVECTOR3 *centre,//world of this cube
RECT *rhs, float height)// D3DCOLOR colour)
{
ID3DXMesh *box = NULL;
//new stuff
D3DXCreateBox(Device,
abs(rhs->right - rhs->left), // width
height, // height
abs(rhs->bottom - rhs->top),//depth
&box,
0);

if(box == NULL)
return NULL;

D3DXMATRIX T;
//ok the box is created in object space but we dont want to translate the grid all the time so we will
//set each vertex to its world position and we dont need to trans form it again
VertexPN *vb = 0;
(box->LockVertexBuffer(0, (void**)&vb));

for(UINT i = 0; i < box->GetNumVertices(); i++)
{

// Translate so that the center of the cube is at the
// specified 'center' parameter.


D3DXMatrixTranslation(&T, centre->x, centre->y, -centre->z);
D3DXVec3TransformCoord(&vb[i].pos, &vb[i].pos, &T);


}



HRESULT hr = D3DXComputeBoundingBox((D3DXVECTOR3*)vb, box->GetNumVertices(),
box->GetNumBytesPerVertex(), &aabb->minPt, &aabb->maxPt);


(box->UnlockVertexBuffer());

if(FAILED(hr))
MessageBox(NULL, "Failed to Create AABB","Hello", MB_OK);



return box;//all ok

}//end CreateCube
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////






this function job is to make a cube so I could render it and then make the AABB
int world space. In the above code there is a line with this in it

D3DXMatrixTranslation(&T, centre->x, centre->y, centre->z);
D3DXVec3TransformCoord(&vb[i].pos, &vb[i].pos, &T);

I fixed it by setting the z value to -centre->z I found a post some one had years ago and it sort of hinted at a invers some where I gues it was here any way could someone please explane why that works..
Thanks.......


Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this