首页 > 解决方案 > 从 OpenGL 窗口、速度、选项等中挑选?

问题描述

我的 PyOpenGL 窗口中有大约 600 个球体。我正在使用 PyQt 来管理我的窗口,所以我使用QGLWidget它。我想从这些球体中挑选,但问题是它们都是相同颜色的金属灰色。所以我没有使用任何图像纹理。

在这一点上,我做了一些研究,发现这个使用 C 例程的教程,由于我不熟悉它,这对我来说很有挑战性。

https://www.lighthouse3d.com/tutorials/opengl-selection-tutorial/

我还想提一下,我一直在使用核心配置文件,而不是像下面的链接中那样的立即模式。

在 Pyqt 窗口中使用 glfw 窗口

仍然可以使用核心配置文件进行挑选,因为它非常基本吗?还是我需要将PyOpenGL代码切换到立即模式?

标签: pythonopenglpyqt5pyopengl

解决方案


我以前没有使用过 QGLWidget,但是通过查看您提供的一些内容和文档,您可能想要:

  1. 确保在 gl 小部件对象上启用了鼠标跟踪。
  2. 确保您有一个函数连接到 gl 小部件的paintEvent 函数
  3. 获取鼠标位置
  4. 使用场景中的所有对象创建一个 QVector。
  5. 创建一个 QVectorIterator 来遍历场景中的所有对象。
  6. 将每个 3d 对象位置转换投射/转换到屏幕空间,然后计算增量添加到一个集合(甚至可能是一个带有 {delta: qglobject} 的字典)。跟踪最低增量
  7. 使用 my_objects[lowest_delta] 选择对象,然后执行您的操作。

我以前从未使用过它,因此可能有一些类和方法可以为您完成大部分工作,请研究一下。如果您要在屏幕上显示大量对象,则可能需要某种缓存/记忆来提高性能。可能有帮助的一件事是从 gl_widget 原点/中心的每个对象的排序增量创建一个字典,然后使用二进制搜索来查找最接近鼠标位置的对象。

检查其中一些:

https://doc.qt.io/qt-5/qglwidget.html

https://doc.qt.io/qt-5/qglwidget.html#paintEvent


推荐阅读