3

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

如果鼠标点击在这个区域内,那么它是一个点击,否则不是。

例如:在窗口上,假设矩形的顶点是:
x = 40, y = 50; width = 200, height = 100;
那么,当
(mouseXPos > getX()) && (mousxPos < (getX()+width)) && (mouseYPos > getY()) && (mouseYPos > getY()+height)

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

但是,当对象移动时,我会认为矩形的顶点会发生变化。矩形的顶点也应该在执行gluLookAt功能时发生变化,但看起来它们没有变化,并且我的点击区域始终在这些点保持静止,尽管对象不存在。我该如何解决这个问题?如何使我的对象可点击并在其上添加一些鼠标事件?

4

3 回答 3

0

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

虽然对opengl不是很有经验,但这对我来说似乎是预期的行为,而且您似乎将世界坐标与屏幕坐标混合在一起。

可以这样想,如果你从两个不同的角度拍摄客厅里的一张桌子,它看起来会有所不同,但在两张照片中都会占据那个房间的相同空间。在使用 opengl 时,实体也可以这样说,即使您移动相机,实体的坐标也不会改变,只是对它的感知。

现在,如果我没记错的话,您可以通过应用与 opengl 相同的转换将您的世界坐标转换为屏幕坐标。我建议看看这个:OpenGL:将鼠标点击投影到几何上

于 2012-12-30T13:50:12.313 回答
0

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

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

GL 有一个功能:gluUnproject()

如果您向该函数提供视图的详细信息,以及被点击的屏幕点,它可以告诉您用户点击了 3D 空间中的哪个位置。如果您在近平面和远平面上检查一个点,则可以根据您的对象检查这些点之间的线。

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

于 2012-12-30T14:09:41.577 回答
0

为 ID 缓冲区替代方案竖起大拇指。我多次使用它,这确实是正确的做法:没有昂贵的几何选择,并且与底层几何几乎完全断开连接。

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

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

于 2012-12-31T04:29:29.183 回答