Collision Detection Problem

Hi.

I am trying to make a very simple first person shooter - shooting boxes. the problem i am having is with the shooting part.

I have a method called shoot() that is called when the mouse button is clicked.


void shoot()
{
	Click = false;
	
	Point3d Ro = {player.xpos, player.height, player.zpos};
	Point3d Rd;
	//calculate bullet direction from x and y heading
	float xRads = player.xHeading*piover180;
	float yRads = player.yHeading*piover180;
	Rd.x = cos(yRads) * cos(xRads);
	Rd.y = sin(yRads) * cos(xRads);
	Rd.z = sin(xRads);
    //normalise Rd
	float magnitude;
	magnitude = sqrt((Rd.x*Rd.x)+(Rd.y*Rd.y)+(Rd.z*Rd.z));
	Rd.x = Rd.x/magnitude;
	Rd.y = Rd.y/magnitude;
	Rd.z = Rd.z/magnitude;
	//for each target use the ray equation and the plane equation
	//to determine if any target has been hit
	int i;
	int j;
	Point3d p,q,r,v,w,n;
	
	float D;
	float denominator;
	float numerator;
	float t;
	//for each target
	for (i = 0; i < arena.numTargets; i++)
	{
	//for each surface on the target
	for (j = 0; j < 5; j++)
	{
		//for each surface
		switch (j) 
		{
		case 0://front face
			//calculate surface normal
			//get 3 points P, Q, R on the surface
			p.x = targets[i].x - (targets[i].size/2);//bottom left of the quad
			p.y = 0.0f;
			p.z = targets[i].z + (targets[i].size/2);

			q.x = targets[i].x + (targets[i].size/2);//bottom right of the quad
			q.y = 0.0f;
			q.z = targets[i].z + (targets[i].size/2);

			r.x = targets[i].x + (targets[i].size/2);//top right of the quad
			r.y = targets[i].height;
			r.z = targets[i].z + (targets[i].size/2);

			//calculate 2 perpendicular vectors in the plane
			//v = q - p and w = r - p
			v.x = q.x - p.x;
			v.y = q.y - p.y;
			v.z = q.z - p.z;

			w.x = r.x - p.x;
			w.y = r.y - p.y;
			w.z = r.z - p.z;

			//calculate the V x W (cross product) to obtain the plane normal
			n.x = (v.y * w.z) - (w.y * v.z);
			n.y = (v.z * w.x) - (w.z * v.x);
			n.z = (v.x * w.y) - (w.x * v.y);

			//define plane by Ax + By + Cz + D = 0
			//calculate D from Ro.n (normalised)
			//so normalise Ro and n
			magnitude = sqrt((Ro.x*Ro.x)+(Ro.y*Ro.y)+(Ro.z*Ro.z));
			Ro.x = Ro.x/magnitude;
			Ro.y = Ro.y/magnitude;
			Ro.z = Ro.z/magnitude;

			magnitude = sqrt((n.x*n.x)+(n.y*n.y)+(n.z*n.z));
			n.x = n.x/magnitude;
			n.y = n.y/magnitude;
			n.z = n.z/magnitude;

			D = (Ro.x*n.x) + (Ro.y*n.y) + (Ro.z*n.z);

			//A,B,C is the normal to the plane
			//substitute in the ray equation to get
			//A(x0 + txd)+ B(y0 + tyd) + C(z0 + tzd) + D = 0
			//rearrange to solve for t
			// _(N.Ro + D)
			//  ----------
			//      N.Rd

			//first work out the denominator
			
			denominator = (n.x*Rd.x) + (n.y*Rd.y) + (n.z*Rd.z);
			if (denominator == 0.0f)
			{
			//bullet path is parallel to the plane
				break;
			}
			if (denominator > 0.0f)
			{
			//normal to the plane is pointing away from the bullet path
				break;
			}

			//now work out the numerator [-(N.Ro + D)]
			numerator = -((n.x*Ro.x) + (n.y*Ro.y) + (n.z*Rd.z) + D);
			t = numerator/denominator;
			if (t < 0)//plane is behind origin
			{ 

				break;
			}
			else
			{
			//work out point of intersection 
				Point3d poi;
				poi.x = Ro.x + Rd.x * t;
				poi.y = Ro.y + Rd.y * t;
				poi.z = Ro.z = Rd.z * t;
				//now check if the point of intersection is within the
				//rectangle on the surface of the target
				//calculate rectangle vertices
				//we already have 3 vertices p,q and r
				//calculate the 4th:
				Point3d s;
				s.x = targets[i].x - targets[i].size;
				s.y = targets[i].height;
				s.z = targets[i].z + targets[i].size;
					
				float left,right,top,bottom;
				left = p.x;
				right = q.x;
				top = r.y;
				bottom = q.y;
				if (poi.x > left && poi.x < right &&
					poi.y > bottom && poi.y < top)
				{
				targets[i].hit = true;
				}
			}

			break;

			case 1://back face

				break;

			case 2://top face

				break;

			case 3://right face

				break;
				
			case 4://left face

				break;
		}
		}
	}
}

As you can see im still trying to do this for 1 face of a box. I dont have any vector class so i am just hard coding the maths as it is only supposed to be a bit of learning.

i have traced through the program and found that no matter where i position my player the denominator is always > 0, but i cannot find out why.

If anyone can see what im doing wrong i would greatly appreciate any input.

Thanks in advance,

Toby