【问题标题】:simple way to determine what object a mouse is pointed over? (OpenGL, freeglut, c++)确定鼠标指向哪个对象的简单方法? (OpenGL、freeglut、c++)
【发布时间】:2016-05-28 01:29:21
【问题描述】:

我知道如何根据鼠标是否被单击或释放以及鼠标是否在移动或被单击和移动(全部使用 freeglut)来执行操作。

但是 google 让我非常担心我应该使用哪种方式来确定被点击的对象。

谁能告诉我你能想到的最简单的方法来确定正在单击的对象,以便我可以使用 glut 函数独立移动该对象?

【问题讨论】:

  • 您的问题是如何找到某人在屏幕上指向的 3D 对象,还是与其他一些 UI 相关的东西?
  • 对不起,我忘了指定。我正在尝试确定我在屏幕上用鼠标指向的 2D 对象。

标签: c++ opengl freeglut devil


【解决方案1】:

到目前为止,无论您使用的是 2D 还是 3D,最简单的解决方案是为每个可拾取对象分配一个独特的颜色,这种颜色通常根本不使用。然后,对于每个单击事件,您都会渲染(到后台缓冲区)相同的场景,并将唯一的颜色应用于每个对象。通过禁用照明等,问题就变成了查看鼠标下的像素颜色并使用查找表查看单击了哪个对象。

即使在 16 位颜色深度中,仍然可以获得 2^16 个独特的可拾取对象,而实际上在现代应用程序中很少有少于 2^24 个的对象。

【讨论】:

  • 这样做的问题是您必须对每一帧进行两次渲染,因此对于图形密集型应用程序来说它不是很实用。
  • 这不是真的。首先,您仅在需要处理单击事件时才执行此操作。其次,您还必须在没有纹理、照明或花哨的着色器的情况下对其进行渲染,并且您可以选择以比正常视觉效果更低的帧速率进行渲染,如果需要,可以使用减少的 polycount 模型。因此,对于图形密集型应用来说,说它只是将成本翻倍是不对的。
【解决方案2】:

当我们使用 2D 对象时,如果鼠标的位置在对象内部,则指向对象。这种在内部的概念因几何形状而异。

对于矩形宽度左上角cwidthheight,函数可能如下所示:

bool isInsideRectangle(double x, double y) {
    // The mouse is inside if the coordinates are 'inside' all walls
    return (x > c.x &&
            y > c.y &&
            x < c.x + width &&
            y < c.y + height);
}

对于一个圆心为c、半径为r的圆,它可能如下所示:

bool isInsideCircle(double x, double y) {
    // The mouse is inside if the distance to the center of the circle
    // is less than the radius
    return std::sqrt((x - c.x)*(x - c.x) + (y - c.y)*(y - c.y)) < r;
}

对于另一个形状,您必须找出另一个函数来计算鼠标位置是否在内部,但是在许多情况下,您可以将其简化为边界矩形或球体。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    相关资源
    最近更新 更多