C++ c++;openGL拣选问题

C++ c++;openGL拣选问题,c++,opengl,C++,Opengl,我正在做一个小例子,我从一个波阵面文件中加载了一个对象-我正在尝试正确的选择,我已经把这个和一些教程复习了大约10遍。。。但一定是遗漏了什么。我想知道是否有人可以提供额外的一套眼睛 我使用了一个保存的列表来绘制对象,它在屏幕上显示得很好。。。目前,当gl_select(x,y)运行时,无论发生什么情况,我都会得到一个命中率,如果我启用了translate/rotate代码(当前已注释掉),我也不会得到任何命中率 相关代码块: // gl_select, is called when the mo

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

我使用了一个保存的列表来绘制对象,它在屏幕上显示得很好。。。目前,当gl_select(x,y)运行时,无论发生什么情况,我都会得到一个命中率,如果我启用了translate/rotate代码(当前已注释掉),我也不会得到任何命中率

相关代码块:

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

再次为代码块的笨重感到抱歉。

我不确定它是否相关,但您不应该在显示列表中存储类似于
glvertexpinter
的内容。根据规范:

某些命令未编译到显示列表中,但 立即执行,无论显示列表模式如何。这些 命令包括GlarTextureResident、glColorPointer、GLDeleteList、, glDeleteTextures、glDisableClientState、glEdgeFlagPointer、, glEnableClientState、glFeedbackBuffer、glFinish、glFlush、GLGenList、, glGenTextures、glIndexPointer、GlinterleaveDarray、glIndexPointer、, glIsList、glIsTexture、glNormalPointer、glPopClientAttrib、, glPixelStore、glPushClientAttrib、glReadPixels、glRenderMode、, glSelectBuffer、glTexCoordPointer、glVertexPointer和所有 glGet命令


这可能是导致您出现问题的原因。

我不确定这是否相关,但您不应该在显示列表中存储类似于
glvertexpinter
的内容。根据规范:

某些命令未编译到显示列表中,但 立即执行,无论显示列表模式如何。这些 命令包括GlarTextureResident、glColorPointer、GLDeleteList、, glDeleteTextures、glDisableClientState、glEdgeFlagPointer、, glEnableClientState、glFeedbackBuffer、glFinish、glFlush、GLGenList、, glGenTextures、glIndexPointer、GlinterleaveDarray、glIndexPointer、, glIsList、glIsTexture、glNormalPointer、glPopClientAttrib、, glPixelStore、glPushClientAttrib、glReadPixels、glRenderMode、, glSelectBuffer、glTexCoordPointer、glVertexPointer和所有 glGet命令


这可能是造成你问题的原因。

这里要考虑的一些事情:

  • OpenGL选择模式已被弃用,并且从未被硬件加速过,只有少数SGI框和3DLabs GPU例外

  • 显示列表不会与顶点数组混合

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


  • 这里需要考虑的一些事情:

    • OpenGL选择模式已被弃用,并且从未被硬件加速过,只有少数SGI框和3DLabs GPU例外

    • 显示列表不会与顶点数组混合

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


    干杯,看起来我将与讲师讨论单元/代码示例严重过时的问题。如果选择模式不推荐,当前首选的对象拾取方法是什么?@Mr.Shickadance:没有厨房水槽解决方案。人们通常会选择最适合应用程序的。有(除其他外)光线/边界体积/几何相交测试、索引/颜色缓冲区拾取、将边界体积层次投影到屏幕空间到空间细分结构(如Kd或四叉树)中,等等。干杯,看起来我将与我的讲师就单元/代码示例的严重过时进行对话。如果不推荐使用选择模式,那么当前首选的对象拾取方法是什么?@Mr.Shickadance:没有厨房水槽解决方案。人们通常会选择最适合应用程序的。有(除其他外)光线/边界体积/几何相交测试、索引/颜色缓冲区拾取、将边界体积层次结构投影到屏幕空间到空间细分结构(如Kd或四叉树)中,等等。到底是什么原因?到底是什么原因?
    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();
    }