【问题标题】:Picking from OpenGL window, speed, options and more?从 OpenGL 窗口、速度、选项等中挑选?
【发布时间】:2020-11-22 23:47:05
【问题描述】:

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

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

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

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

Using glfw window inside Pyqt Window

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

【问题讨论】:

    标签: python opengl pyqt5 pyopengl


    【解决方案1】:

    我以前没有使用过 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

    【讨论】:

    • 感谢您的解释。但这里的问题是我需要偶尔旋转球体或用鼠标移动它们。即使在这种情况下也可以使用 QVector 吗?
    • 听起来你需要使用光线投射才能做到这一点。不幸的是,看起来 QGLWidget 并没有内置这样的东西,所以你要么必须自己实现它,要么使用库。您需要获取每个对象的顶点并将它们转储到 QVector3D 对象列表中,以便使用矢量数学找到相交三角形。不幸的是,我不知道 python 能做到这一点有多快,所以你可能必须在 C++ 中这样做才能获得合理的结果。这也是 3D 图形库几乎总是用 C/C++ 编写的原因。
    • 是的,这就是我计划进行颜色挑选的地方。但那时,我不知道如何在输出缓冲区中使用两种不同的颜色来做到这一点。
    猜你喜欢
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-15
    • 1970-01-01
    • 1970-01-01
    • 2014-03-20
    相关资源
    最近更新 更多