m0_37960188 2022-05-05 23:03 采纳率: 33.3%
浏览 50
已结题

opengl拾取错误

问题遇到的现象和发生背景

窗口中有两个物体,一个茶壶,一个立方体;理应鼠标在哪个物体上,拾取到哪个物体,但是我鼠标刚一进窗口,两个物体就给我拾取到了

问题相关代码,请勿粘贴截图

三个函数:
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函数理解不透彻,请各位帮帮忙,看看问题在哪

我想要达到的结果

鼠标位于哪个物体上,打印内容就是哪个物体

  • 写回答

3条回答 默认 最新

  • 歇歇 2022-05-10 21:49
    关注
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 5月19日
  • 已采纳回答 5月11日
  • 赞助了问题酬金10元 5月6日
  • 创建了问题 5月5日

悬赏问题

  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料