0

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

但是谷歌让我非常强调我应该使用哪种方式来确定被点击的对象。

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

4

2 回答 2

3

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

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

于 2016-05-28T19:02:09.230 回答
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);
}

对于具有 centerc和 radius的圆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;
}

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

于 2016-05-28T06:00:18.180 回答