Qt OpenGL-如何根据鼠标点击获取对象

Posted

技术标签:

【中文标题】Qt OpenGL-如何根据鼠标点击获取对象【英文标题】:Qt OpenGL- How to get the object based on the mouse click 【发布时间】:2011-06-18 16:37:03 【问题描述】:

我正在尝试在 Qt-openGL 中制作应用程序。在这里,我必须根据鼠标点击知道点击的对象。我的想法是存储点(对象在 QWidget 中的区域),并将鼠标单击与这些点匹配。任何人都可以说如何做到这一点吗?或者任何机构都可以显示任何其他方式吗?

【问题讨论】:

【参考方案1】:

这个问题通常被称为“拣货”。 OpenGL 本身只是绘制东西,没有几何对象管理可言(OpenGL 有对象,但它们就是你通常所说的资源)。

现在实现 OpenGL 拾取的常用方法是在点击位置 (glReadPixels(x, y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &depth)) 检索深度值并将其取消投影到世界空间 (gluUnProject(...))。这将为您提供点击点的(x,y,z)

由于您通常会通过将细分结构遍历到单击坐标来管理某些空间细分结构(BSP、Kd 等)中的几何图形,因此您可以通过这种方式检索对象。

另一种方法是将点击后的光线投射到场景中并进行光线/包围体相交测试。

我强烈反对使用旧的 OpenGL 选择机制:使用起来既慢又麻烦。

【讨论】:

既然着色器很流行,为每个对象设置一个对象ID并使用片段着色器将其写入未混合的隐藏平面不是很容易吗?然后拾取变为从鼠标坐标处的该平面读取。无需反投影或几何搜索。 @Ben Voigt:只要您只对鼠标指针下的一个对象感兴趣——当然这与非投影方法匹配——那么可以。但是,如果您对指针下的所有对象都感兴趣,那么您将不得不使用光线拾取方法,或者使用一些深度剥离。然而,在大多数严肃的 3D 应用程序中,无论如何都使用某种空间结构来管理对象,并且对此进行测试通常更容易。 我使用 gluUnProject 和 glReadPixels 进行挑选,但结果总是最远的对象而不是最近的对象,为什么?

以上是关于Qt OpenGL-如何根据鼠标点击获取对象的主要内容,如果未能解决你的问题,请参考以下文章

Qt 如何获取滚动窗体中鼠标点击的坐标

OpenGL / C++ - 如何在鼠标点击时填充一个点周围的区域?

获取相对于 Qt OpenGL 小部件的鼠标坐标

如何在 C++/OpenGL 中获取当前鼠标位置?

QT如何获取窗口外的鼠标点击事件,或者鼠标坐标

Qt画图以及坐标问题