使对象可单击(如果鼠标位于对象区域,请单击)

时间:2012-12-30 13:00:19

标签: c++ algorithm opengl

我的窗口上有一个矩形,我试图通过定义矩形区域来使这个矩形可点击。

如果鼠标点击在此区域内,则点击其他信息。

例如:在窗口上,我们假设矩形的顶点是:
x = 40, y = 50; width = 200, height = 100;
因此,当点击时,将计算一次点击 (mouseXPos > getX()) && (mousxPos < (getX()+width)) && (mouseYPos > getY()) && (mouseYPos > getY()+height)

现在,我正在通过继承具有lookAt函数的类来实现对该对象的转换。此外,我正在使用相机检查物体的不同面(相机旋转)。因此,当对象沿各个轴旋转并在使用相机时显示不同的面时。

然而,当物体移动时,我会想到矩形的顶点会改变。在执行gluLookAt函数时,矩形的顶点也应该已经改变,但看起来它们没有,并且我的点击区域总是在这些点处保持静止,尽管对象不在那里。我该如何解决这个问题?如何使我的对象可单击并在其上添加一些鼠标事件?

3 个答案:

答案 0 :(得分:0)

看到没有其他人在回答,我会试一试。 :)

虽然对opengl不太熟悉,但这对我来说似乎是预期的行为,而且看起来你正在将世界坐标与屏幕坐标混合在一起。

这样想想,如果你从两个不同的角度拍摄起居室的桌子,它会看起来不同,但两个图像中的图片会占据那个房间的相同空间。使用opengl时,实体也可以这样说,即使你移动相机,实体的坐标也不会改变,只是感知它。

现在,如果我没弄错的话,您可以通过应用与opengl相同的转换将您的世界坐标转换为屏幕坐标。我建议看看这个:OpenGL: projecting mouse click onto geometry

答案 1 :(得分:0)

如果你试图点击3D形状,并且你正在移动相机,我不会在屏幕坐标中检查它。

相反,您可以投影用户点击3D空间中的线条的点,并将其与可以单击的对象相交。

GL具有以下功能:gluUnproject()

如果您为该功能提供视图的详细信息以及单击的屏幕点,它可以告诉您用户点击的3D空间中的位置。如果您检查近平面和远平面上的点,则可以针对您的对象检查这些点之间的线。

另一种选择是某种ID缓冲区,您可以在屏幕外渲染场景,但不输出着色像素,而是输出每个对象的ID值。然后,命中测试就是从该缓冲区读取一个像素。

答案 2 :(得分:0)

赞成ID缓冲区替代方案。我曾经多次使用它,它确实是正确的做法:没有昂贵的几何体拾取和与底层几何体完全断开的连接。

尽管如此,您仍然只能选择最接近的几何体(即屏幕上的“可见”几何体)而不是可能隐藏在后面的模型。处理半透明材料时也会出现同样的问题。

一种解决方案可能是通过渲染RGBA ID纹理中的四个对象来进行一些ID剥离(我觉得它可能不是最佳的但是值得一试)。