gluPickMatrix

I am trying to pick “named objects” using gluPickMatrix. Picking occurs but it does not (accurately) correspond to the shape of the named object that I have drawn -I get hits in some areas that I shouldn’t and no hits in some areas that I should.

I have completely redrawn the objects after calling gluPickMatrix (and have followed the sequence outlined in the red book p. 543).

Why are my hits inaccurate?

void CPick::PickObject(const CPoint &point)
{
m_pView->MakeRenderingContextCurrent();

glLoadIdentity();

// See “OpenGL Programming Guide 1.2” p. 543
glGetIntegerv(GL_VIEWPORT, m_nViewPort);

//Assign selection buffer
glSelectBuffer(nSELECTION_BUFFER_SIZE, m_nSelectionBuffer);

//Change into selection mode
glRenderMode(GL_SELECT);

glInitNames();

glMatrixMode(GL_PROJECTION);
glPushMatrix();

glLoadIdentity();

gluPickMatrix( (double)( point.x), (double) (m_nViewPort[3]-point.y), dPIXEL_PICK_WIDTH_PIXELS, dPIXEL_PICK_HEIGHT_PIXELS, m_nViewPort);

//Draw everything
m_pView->GLDrawClean();

glPopMatrix();
glFlush();

m_nHits = glRenderMode(GL_RENDER);

//Release Windows Context
wglMakeCurrent(NULL,NULL);

//Call process hits
Proces****s();

//Invalidate the view
m_pView->Invalidate(TRUE);
}

One thing you need to do before using the names stack is to put a zero (or some other name) onto the stack. You might be getting an underflow on the name stack.

Also, I saw that you apply the gluPickMatrix to the projection matrix. Under non-selection mode, do you apply a different projection? If so, you should apply your usual projection after the pick matrix. You probably do this in your DrawClean function, but I thought I would mention it.

Finally, try debugging this by turning off selection and drawing the scene with the gluPickMatrix. The net effect should be that your view is zoomed to the rectangle that you specified.

Hope this helps
-Ben

Thanks Ben. I didn’t apply my original projection matrix after pick matrix. I’m going to give it a try now. Thanks again.