c++ openGL挑选问题
c++ openGL picking problems
我正在做一个小例子,我从一个波前文件加载了一个对象-我试图让我的选择正确,我已经在这个和一些教程大约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命令。
这可能就是你的问题所在。
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 一个关于在C++中重载布尔运算符的问题
- 首要问题的答案让值班员搞错了
- setlocale的C++土耳其字符串问题
- 如何重构类层次结构以避免菱形问题
- 基于boost的程序的静态链接——zlib问题
- C++格式化输出问题
- c++ openGL挑选问题