问题遇到的现象和发生背景
窗口中有两个物体,一个茶壶,一个立方体;理应鼠标在哪个物体上,拾取到哪个物体,但是我鼠标刚一进窗口,两个物体就给我拾取到了
问题相关代码,请勿粘贴截图
三个函数:
1、cursor_posCallback鼠标移动回调函数
2、选择模式下的绘制起名
3、打印输出selectBuffer内容
void cursor_posCallback(GLFWwindow* window, double x, double y)
{
//std::cout << FUNCTION;
GLuint selectBuffer[1024];
GLint viewport[4];
int hints;
glSelectBuffer(1024, selectBuffer);
memset(selectBuffer, 0, sizeof(selectBuffer));
glRenderMode(GL_SELECT);
glInitNames();
glPushName(0);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glGetIntegerv(GL_VIEWPORT, viewport);\
gluPickMatrix(x, viewport[3] - y, 2, 2, viewport);
//glOrtho(-1, 1, -1, 1, -1, 1);
draw();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glFlush();
hints = glRenderMode(GL_RENDER);
if(hints>0)
processHits(hints, selectBuffer);
}
void draw()
{
glPushName(1);
drawCube();
glPopName();
glPushName(2);
drawTea();
glPopName();
}
void processHits(int hits, GLuint* ptr)
{
GLuint names;
const static GLfloat color_selected[] = { 1.0f,0.0f,0.0f };//选中时的颜色,红色
const static GLfloat color_unselected[] = { 0.0f,0.0f,1.0f };//未选中时的颜色,蓝色
GLuint* p = ptr;
for (int i = 0; i < hits; i++)
{
p = ptr;
p += 5 * (i + 1) - 1;
switch (*p)
{
case 1:
{
std::cout << "tea" << std::endl;break;
}
case 2:
{
std::cout << "cube" << std::endl;break;
}
default:
{
std::cout << "nothing" << std::endl;break;}
}
}
}
运行结果及报错内容
鼠标一进入窗口还未移动到物体上就开始输出:
tea
cube
我的解答思路和尝试过的方法
我认为是选择框错了,没看出哪错了,只能说glPickMatrix函数理解不透彻,请各位帮帮忙,看看问题在哪
我想要达到的结果
鼠标位于哪个物体上,打印内容就是哪个物体