使一个对象可点击(如果鼠标在对象区域内,点击)

Make an object clickable (click if the mouse is in the area of object)

本文关键字:区域 对象 点击 鼠标 一个对象 如果      更新时间:2023-10-16

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

如果鼠标点击在此区域内,则为点击,否则为非点击。

例如:在窗口上,让我们假设矩形的顶点是:
x = 40, y = 50; width = 200, height = 100;
因此,当

(mouseXPos > getX()) && (mousxPos < (getX()+width)) && (mouseYPos > getY()) && (mouseYPos > getY()+height)

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

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

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

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

GL有一个函数:gluUnproject()

如果你给这个函数提供视图的细节,以及被点击的屏幕点,它可以告诉你用户在3D空间中的点击位置。如果你在近面和远面检查一个点,这些点之间的线可以根据你的对象检查。

另一种选择,是某种类型的ID缓冲区,您在屏幕外渲染场景,但不是输出阴影像素,而是输出每个对象的ID值。hit-test就是从缓冲区中读取一个像素。

既然没有人接电话,我就试一试。:)

虽然对opengl不是很有经验,但这对我来说似乎是预期的行为,似乎你把世界坐标和屏幕坐标混淆了。

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

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

为ID缓冲区的选择点赞。我用了几次,它真的是正确的事情:没有昂贵的几何选择和几乎完全断开与底层几何。

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

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