PDA

View Full Version : Ray Intersecting with bounding box?



Vampyre_Dark
08-07-2003, 11:04 PM
Can anyone either give me a small example on how to do this, or give me a link to a turtorial? I have checked out nehe, gametutorials, and a few other sites and haven't found anything...

What I want to do is find get a bounding box around some objects on screen and a ray coming out of the cursor all the way into the clipping plane (or infinity) and test to see what object the mouse is on.

I have no idea where to even start with this.

john
08-07-2003, 11:36 PM
hello,

I could---in theory---give you my code to do this, but you wouldn't exactly learn much about how to design algorithms. So, what I propose instead is a guided way of showing you how to figure out the answer for yourself. Everyone should know how to divide and conquer algorithms.

What I propose you do is work out some pseudo code to implement what you're after. A simple first step is



Psuedo code:

1. find the line parameters
2. find the intersection of the line [1] with the scene

Now, can you elaborate on that framework? Give it a go, and post your attempt. If you include assumptions about steps you think might be possible, but not sure, then that's ok too.

give it a shot

cheers
John

Vampyre_Dark
08-08-2003, 12:43 PM
okay, I now have a line being drawn from my cursor to 0,0,FarClipping Plane, except that the Y is reversed...



case WM_MOUSEMOVE:
{
cm.iPosX = LOWORD(lParam);
cm.iPosY = HIWORD(lParam);
//Make assignments to fRayX and fRayY here...
GLdouble dProjMatrix[16];
GLdouble dModMatrix[16];
GLint iViewPort[4];

glGetDoublev(GL_PROJECTION_MATRIX,dProjMatrix);
glGetDoublev(GL_MODELVIEW_MATRIX,dModMatrix);
glGetIntegerv(GL_VIEWPORT,iViewPort);

gluUnProject(cm.iPosX,cm.iPosY,0,dProjMatrix,dModM atrix,iViewPort,&fRayX,&fRayY,&fRayZ);

//Change the window settings
sprintf(MouseString,"DarkLib Line Intersection Test - %d-%d",cm.iPosX,cm.iPosY);
SetWindowText(hwnd,MouseString);
break;
}
////////////////////
glLoadIdentity();
glBegin(GL_LINES);
glVertex3f(fRayX,fRayY,0);
glVertex3f(0,0,-cv.fFarClip);
glEnd();