I am trying to select a face of a cube with the mouse.
here is my cube function:
GLfloat vertices[][3] = {{-1.0,-1.0,-1.0},{1.0,-1.0,-1.0},
{1.0,1.0,-1.0}, {-1.0,1.0,-1.0}, {-1.0,-1.0,1.0},
{1.0,-1.0,1.0}, {1.0,1.0,1.0}, {-1.0,1.0,1.0}};
void DrawCube()
{
glPushName(1);
glColor3f(1.0f, 0.0f, 0.0f); // Color Red
polygon(0,3,2,1);
glPopName();
glPushName(2);
glColor3f(0.0f,1.0f,0.0f); // Color Green
polygon(2,3,7,6);
glPopName();
glPushName(3);
glColor3f(0.0f, 0.0f, 1.0f); // Color Blue
polygon(0,4,7,3);
glPopName();
glPushName(4);
glColor3f(1.0f,1.0f,0.0f); // Color Yellow
polygon(1,2,6,5);
glPopName();
glPushName(5);
glColor3f(0.0f,1.0f,1.0f); // Color Cyan
polygon(4,5,6,7);
glPopName();
glPushName(6);
glColor3f(1.0f,0.0f,1.0f); // Color Magenta
polygon(0,1,5,4);
glPopName();
}
void polygon(int a, int b, int c , int d)
{
glBegin(GL_QUADS);
glVertex3fv(vertices[a]);
glVertex3fv(vertices[b]);
glVertex3fv(vertices[c]);
glVertex3fv(vertices[d]);
glEnd();
}
I call the picking function with:
double newy = glutGet(GLUT_WINDOW_HEIGHT) - 1 - y;
zprPick(x, newy, 3, 3);
because you have to invert the y coordinate returned by the window.
here is the picking function itself
void zprPick(GLdouble x, GLdouble y,GLdouble delX, GLdouble delY)
{
GLuint buffer[1024];
const int bufferSize = sizeof(buffer)/sizeof(GLuint);
GLint viewport[4];
GLdouble projection[16];
GLint hits;
GLint i,j,k;
GLint min = -1;
GLuint minZ = -1;
glSelectBuffer(bufferSize,buffer); /* Selection buffer for hit records */
glRenderMode(GL_SELECT); /* OpenGL selection mode */
glInitNames(); /* Clear OpenGL name stack */
glMatrixMode(GL_PROJECTION);
glPushMatrix(); /* Push current projection matrix */
glGetIntegerv(GL_VIEWPORT,viewport); /* Get the current viewport size */
glGetDoublev(GL_PROJECTION_MATRIX,projection); /* Get the projection matrix */
glLoadIdentity(); /* Reset the projection matrix */
gluPickMatrix(x,y,delX,delY,viewport); /* Set the picking matrix */
glMultMatrixd(projection); /* Apply projection matrix */
glMatrixMode(GL_MODELVIEW);
/* Draw the scene in selection mode */
display();
hits = glRenderMode(GL_RENDER); /* Return to normal rendering mode */
/* Determine the nearest hit */
if (hits)
{
for (i=0,j=0; i<hits; i++)
{
if (buffer[j+1]<minZ)
{
/* If name stack is empty, return -1 */
/* If name stack is not empty, return top-most name */
if (buffer[j]==0)
min = -1;
else
min = buffer[j+2+buffer[j]];
minZ = buffer[j+1];
}
j += buffer[j] + 3;
}
}
glMatrixMode(GL_PROJECTION);
glPopMatrix(); /* Restore projection matrix */
glMatrixMode(GL_MODELVIEW);
pick(min); /* Pass pick event back to application */
}
I took it directly out of ZPR (the picking works properly when I use all of zpr (ie. returns 1, 2, 3… 6 when i choose one of the cube faces)) but not when I use it on its own like this. Here it returns an integer from 1 to 6, but it doesn’t even correspond to when I click the cube at all. Anywhere I click it seems to return 2 sometimes or other times 4, but seemingly with no respect to where I clicked.
Can anyone spot a problem? Or have a nice working picking function?
Thanks,
Dave