c++ openGL挑选问题

c++ openGL picking problems

本文关键字:问题 挑选 openGL c++      更新时间:2023-10-16

我正在做一个小例子,我从一个波前文件加载了一个对象-我试图让我的选择正确,我已经在这个和一些教程大约10次…但一定是遗漏了什么。我想知道是否有人可以提供额外的眼睛。

我已经使用保存的列表来绘制对象,它在屏幕上看起来很好…目前,当gl_select(x, y)运行时,无论如何我都会得到一个命中,如果我启用翻译/旋转代码(当前被注释掉)-无论如何我都不会得到命中。

相关代码块:

// 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);
}

和绘制函数:

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();
}

列表保存位置:

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);
    glDisableClientState(GL_VERTEX_ARRAY);
    glEndList();
}

再次为代码块的块状表示抱歉。

这里有几件事需要考虑:

  • OpenGL选择模式已弃用,并且从未进行过硬件加速,除了在一些SGI盒和3DLabs gpu上。

  • DisplayLists不能与Vertex Arrays混合使用

  • 为什么在绘制保存对象列表之前调用glutSwapBuffers ?

我不确定它是否相关,但你不应该在显示列表中存储像glVertexPointer这样的东西。来自规范http://www.opengl.org/sdk/docs/man/xhtml/glNewList.xml:

某些命令不被编译到显示列表中,但被编译到立即执行,无论显示列表模式如何。这些命令是glAreTexturesResident, glColorPointer, gldeletelist,glDeleteTextures, glDisableClientState, glEdgeFlagPointer,glEnableClientState, glFeedbackBuffer, glFinish, glFlush, glGenLists,glGenTextures, gllindexpointer, glInterleavedArrays, glIsEnabled,glIsList, gllistexture, glNormalPointer, glPopClientAttrib,glPixelStore, glpushclientattrb, glReadPixels, glRenderMode,glSelectBuffer, glTexCoordPointer, glVertexPointer,以及所有的glGet命令。

这可能就是你的问题所在。