开发者

c++ openGL picking problems

I'm working on a little example, where I have loaded an object from a wavefront file - and am trying to get my picking right, I've gone over this and a few tutorials about 10 times... but must be missing something. Was wondering if anyone could provide an extra set of eyes.

I've used a saved list to draw the object, which appears fine on the screen... At the moment, when gl_select(x, y) runs, I get a hit no matter what, and if I enable the translate/rotate code (which is currently commented out) - I get no hits what-so-ever.

Relevant code blocks:

// gl_select, is called when the mouse is clicked, with its x and y coords
void gl_select(int x, int y)
{
    GLuint buff[256];
    GLint hits;
    GLint view[4];

    //Buffer to store selection data
    glSelectBuffer(256, buff);

    //Viewport information
    glGetIntegerv(GL_VIEWPORT, view);

    //Switch to select mode
    glRenderMode(GL_SELECT);

    //Clear the name stack!
    glInitNames();

    //Fill the stack with one element
    glPushName(0);

    //Restric viewing volume
    glMatrixMode(GL_PROJECTION);
    glPushMatrix();
    glLoadIdentity();

    //Restrict draw area
    gluPickMatrix(x, y, 1.0, 1.0, view);
    gluPerspective(60, 1, 0.0001, 1000.0);

    //Draw the objects onto the screen
    glMatrixMode(GL_MODELVIEW);

    //Draw only the names in the stack
    glutSwapBuffers();
    DrawSavedObject();

    //Back into projection mode to push the matrix
    glMatrixMode(GL_PROJECTION);
    glPopMatrix();

    hits = glRenderMode(GL_RENDER);

    cout << hits;

    //Back to modelview mode
    glMatrixMode(GL_MODELVIEW);
}

And the draw functions:

void DrawSavedObject()
{

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glColor3f(1.0,0.0,0.0);

    //translate and rotate
    //glRotated(rotation,0.0,0.0,1.0);
    //glTranslated(7.0, 7.0, 0.0);

    //Draw the saved object
    glLoadName(7);
    glCallList(list_object);

    glutSwapBuffers();
}

And where the list is saved:

void SaveDisplayList(){     
    glNewList(list_object, GL_COMPILE);

    glVertexPointer(3, GL_DOUBLE, 3*sizeof(GLdouble), vertices);
    glEnableClientState(GL_VERTEX_ARRAY);
    glDrawElements(GL_TRIANGLES, verticesSize ,GL_UNSIGNED_INT, triangles);

    glDisable开发者_StackOverflow社区ClientState(GL_VERTEX_ARRAY);

    glEndList();
}

Sorry again for the chunkiness of the code blocks.


A few things to consider here:

  • OpenGL selection mode is deprecated and never was HW accelerated, except on a few SGI boxes and 3DLabs GPUs.

  • DisplayLists don't mix with Vertex Arrays.

  • Why do you call glutSwapBuffers right before drawing your list of saved objects? Makes absolutely no sense at all.


I'm not sure if it's relevant but you're not supposed to store things like glVertexPointer in display lists. From the spec http://www.opengl.org/sdk/docs/man/xhtml/glNewList.xml:

Certain commands are not compiled into the display list but are executed immediately, regardless of the display-list mode. These commands are glAreTexturesResident, glColorPointer, glDeleteLists, glDeleteTextures, glDisableClientState, glEdgeFlagPointer, glEnableClientState, glFeedbackBuffer, glFinish, glFlush, glGenLists, glGenTextures, glIndexPointer, glInterleavedArrays, glIsEnabled, glIsList, glIsTexture, glNormalPointer, glPopClientAttrib, glPixelStore, glPushClientAttrib, glReadPixels, glRenderMode, glSelectBuffer, glTexCoordPointer, glVertexPointer, and all of the glGet commands.

This could be what's causing your problem.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜