使一个对象可点击(如果鼠标在对象区域内,点击)
Make an object clickable (click if the mouse is in the area of object)
我的窗口上有一个矩形,我试图通过定义矩形的面积使这个矩形可点击。
如果鼠标点击在此区域内,则为点击,否则为非点击。
例如:在窗口上,让我们假设矩形的顶点是: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剥离(我有一种感觉,这可能不是最佳的,但值得一试)。
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 你能重载对象变量名本身返回的内容吗
- C++使用整数的压缩数组初始化对象
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 将对象移动到std::shared_ptr
- 代理对象的常量正确性
- 提升 ASIO 无法识别计时器对象
- 错误:创建对象后无法分配区域
- 具有公共内存区域的类似数组的对象
- OpenglGL - 如何检查光标是否与对象区域重合?
- 跨越多个函数/对象的OpenMP并行区域
- 使用感兴趣区域的等值线进行对象检测
- C++圆形区域中的 Opencv 对象检测
- 使用cvMoments的对象区域
- 动态地在一个可以一次性丢弃的区域中构造对象
- 使一个对象可点击(如果鼠标在对象区域内,点击)