OpenGL 从大集合中选取

标签 opengl graphics data-visualization jogl

我试图在 JOGL 中从一大组渲染的四边形中进行选择(数千个)。有人有什么建议吗?

为了向您提供更多详细信息,我将大量数据绘制为具有程序创建的纹理的广告牌。

我看过这篇文章 OpenGL GL_SELECT or manual collision detection?并发现它很有帮助。然而,我的程序可能需要长达几分钟的时间才能完成全套渲染,因此我不认为绘制 2x(用于颜色选择)是一种选择。

我当前正在通过调用 glBegin/glVertex.../glEnd 进行绘图。鉴于我使用 vao 和 vbo 在 GPU 上切换到批量渲染,您认为我会获得足够大的加速以促进颜色选择吗?

如果没有,考虑到所有反对使用 GL_SELECT 的建议,您认为我值得使用它吗?

我研究了多线程 CPU 方法来选择这些完全避开 OpenGL 的四边形。 您认为无 OpenGL CPU 解决方案是正确的选择吗?

很抱歉提出所有问题。 我的主要问题仍然是,使用 OpenGL (JOGL) 从一大组四边形中进行选择的好方法是什么?

最佳答案

从大量四边形中进行挑选的最佳方法很难定义。我不太喜欢颜色选择或类似的技术,因为它们在大多数情况下似乎不切实际。我一直不明白为什么有这么多教程专注于 OpenGL 新手,甚至编程专注于挑选,而这对几乎所有事情都是无用的。例如:尝试获取您在高度图中单击的像素:不可能。尝试在您单击的模型中找到精确的网格:不切实际。

如果您有大量四边形,您可能需要良好的空间分区或至少(更好)场景图。好吧,你不需要这个,但它有很大帮助。查看一些场景图教程以获取更多信息,如果您从 3D 编程开始,了解这一点是一件好事,因为您将了解很多概念,而不仅仅是 OpenGl 代码。

那么现在应该做什么来开始挑选呢?在鼠标光标所在的位置取模型 View 矩阵的逆矩阵(带有 glUnproject(...) 的 iirc)。通过相机的方向,您现在可以将光线转换到空间结构(或包含空间结构的场景图)中。现在检查与四边形的碰撞。我目前没有链接,但如果您搜索逆模型 View 矩阵,您应该会找到一些比此处实际执行的更好、更详细地解释这一点的页面。

通过这种基于光线转换的技术,您将能够在 O(log n) 中找到您的四边形,其中 n 是您拥有的四边形的数量。通过一些基于应用程序确切布局的启发式方法(您的问题太笼统而无法更具体),您可以在大多数情况下对此进行很大改进。

一个简单的空间结构是例如四叉树。但是,您应该首先从光线转换开始,以充分理解这项技术。

关于OpenGL 从大集合中选取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6915740/

相关文章:

c++ - opengl 未填充多边形

java - 平均法线结果为零长度 vector

Android:绘制到 Canvas ,使左下角对应于(0,0)的方法?

c# - 使用 GDI+ 绘制遵循路径的字符串

r - 可视化表或矩阵中数据帧的交集

opengl - 如果我处理大量数据,OpenGL 会关心吗?

Java Graphics2d : text field

r - 当某些组有多个人而其他组只有一个人时,有什么更好的方法来可视化数据?

jquery - D3 Zoom 功能在 Google Chrome 中无法使用

java - 为什么这段代码将位大小传递给 opengl 的 glBufferData 方法而不是字节(java)