我正在研究一个小例子,我从波前文件中加载了一个对象 - 我正在努力让我的选择正确,我已经完成了这个和一些教程大约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();
}
再次抱歉代码块的粗略。
答案 0 :(得分:2)
这里要考虑的一些事情:
不推荐使用OpenGL选择模式,除了几个SGI盒和3DLabs GPU之外,从不进行硬件加速。
DisplayLists不与顶点阵列混合。
为什么在绘制已保存对象列表之前调用 glutSwapBuffers ?完全没有任何意义。
答案 1 :(得分:1)
我不确定它是否相关,但您不应该在显示列表中存储glVertexPointer
之类的内容。来自规范http://www.opengl.org/sdk/docs/man/xhtml/glNewList.xml:
某些命令未编译到显示列表中,但是 无论显示列表模式如何,都会立即执行。这些 命令是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和所有的 glGet命令。
这可能是造成问题的原因。