单击Quad并在opengl中获取屏幕坐标

时间:2013-10-03 01:08:01

标签: opengl opengl-1.x

说我像这样制作一个四边形:

float botBaseY = -0.5;
glBegin(GL_QUADS); // Box
    glVertex2f(-.05, botBaseY + -.05);
    glVertex2f(-.05, botBaseY + .05);
    glVertex2f(.05, botBaseY + .05);
    glVertex2f(.05, botBaseY + -.05);
glEnd();

好的,现在好说我想确定用户是否在该四边形内部点击了。 当你点击时,你会收到屏幕坐标,所以如果你的主窗口是 600x600像素,然后您的点击将产生小于600的x和y值。 但我正在比较说(375,400)的点击与使用创建的四边形 从-1.0到1.0的值来定义4个顶点。

如何判断用户是否在四元组内部点击了?

3 个答案:

答案 0 :(得分:1)

我目前看到有两种方法可以做到这一点。

  1. 如果您的“界面”完全是2D并直接映射到屏幕 - 您可以使用屏幕坐标进行绘制。只需设置正确的拼写矩阵,您的点击坐标将与2D元素坐标相同 - 简单范围比较(x< click_x< x + width)。请参阅gluOrtho2D,glOrtho手册(请注意,glOrtho和其他矩阵功能在最新的GL配置文件中不可用)。

  2. 如果第一个变体不适合您的情况 - 您需要将2D坐标映射到视图空间并将结果点用作光线方向。然后跟踪此光线与要单击的元素平面的交点。看一下http://www.toymaker.info/Games/html/picking.html - 对于d3d来说无关紧要,数学总是一样的)。然后,当你在你感兴趣的飞机上取得最终点击点时 - 它再次只是范围比较(虽然如果你的飞机与屏幕不平行会有点棘手 - 但我不认为它仍然是同样的问题)。

答案 1 :(得分:0)

我从来没有在这里找到有用的答案,但我最终确实在第二天搞清楚了。我的方框是使用从-1到1的坐标绘制的。但我的点击有大屏幕坐标,如200,300。我需要知道如何将-1转换为1进入屏幕坐标,或者如何只绘制兼容的坐标。

glMatrixMode(GL_PROJECTION);
gluOrtho2D(0, 400, 0, 400);
glBegin(GL_QUADS); // Box
    glVertex2f(xOffset + topBaseX + -15, topBaseY + -15);// bottom left vert
    glVertex2f(xOffset + topBaseX + -15, topBaseY + 15); // top left vert
    glVertex2f(xOffset + topBaseX + 15, topBaseY + 15);// top right vert
    glVertex2f(xOffset + topBaseX + 15, topBaseY + -15);// bottom right vert
glEnd();
glLoadIdentity();

这就是我必须做的就是在200,300之类的东西上绘制我的盒子然后我可以在每次点击时检查我的盒子的边界。

答案 2 :(得分:-1)

最简单,最准确(但不一定最有效)的方式:

再次渲染场景(进入屏幕外缓冲区),目标对象为白色,其他全部为黑色。如果光标下的像素为白色,则单击目标。如果您希望能够点击某些透明材质,只需跳过渲染这些对象。

为了提高效率,您可以在关闭混合和每个对象的唯一颜色(可能是索引)的情况下执行此操作。并且使用新的OpenGL功能在正常渲染期间填充拾取器颜色平面,而不是进行额外的传递。