C++ 如何在OpenGL中使用框选择高效地选择对象

C++ 如何在OpenGL中使用框选择高效地选择对象,c++,opengl,C++,Opengl,如何在OpenGL中高效地执行选择 我读过这篇文章,但仍有一些事情对我来说不确定 在我的申请中,我想支持两种形式的选择。首先用鼠标单击,然后使用拾取框进行选择。我的应用程序还继承了90年代和2000年代早期与OpenGL相关的一系列糟糕的编程实践,例如,它使用GL_SELECT 经过我的阅读,我明白这可能是非常低效的。我学会了两种方法来解决这个问题: 颜色拾取:为图形中的每个对象指定唯一的颜色 场景在1x1px虚拟窗口上渲染并读取颜色 基于碰撞检测的光线投射 问题: 如何为长方体执行颜色拾取?我

如何在OpenGL中高效地执行选择

我读过这篇文章,但仍有一些事情对我来说不确定

在我的申请中,我想支持两种形式的选择。首先用鼠标单击,然后使用拾取框进行选择。我的应用程序还继承了90年代和2000年代早期与OpenGL相关的一系列糟糕的编程实践,例如,它使用GL_SELECT

经过我的阅读,我明白这可能是非常低效的。我学会了两种方法来解决这个问题:

  • 颜色拾取:为图形中的每个对象指定唯一的颜色 场景在1x1px虚拟窗口上渲染并读取颜色
  • 基于碰撞检测的光线投射
  • 问题:

  • 如何为长方体执行颜色拾取?我是否只需在我的盒子大小的窗口上渲染场景,并读取收集独特颜色的像素矩阵以进行适当选择
  • 光线投射是首选方法吗?如果是,如何将此扩展到拾取框
  • 除了这些常用方法之外,还有其他方法吗
  • 一,。如何为长方体执行颜色拾取?我是否只需在我的盒子大小的窗口上渲染场景,并读取收集独特颜色的像素矩阵以进行适当选择

    这就是我要做的,但这只会选择至少部分可见的对象。完全遮挡的对象将不会通过颜色拾取进行选择

    二,。光线投射是首选方法吗?如果是,如何将此扩展到拾取框

    我想说光线投射是首选的方法,是的。顺便说一句,它不能很容易地扩展为拾取框(虽然实际上是拾取截头体)。我会使用一个空间数据结构,比如八叉树,来快速为截锥体选择候选对象,然后根据每个候选对象的边界框测试截锥体。对于其余的候选对象,我将检查其顶点是否位于平截头体内

    八叉树也可以重用以加快光线拾取(用于单击选择)

    但是,根据对象和顶点的数量,这可能不够快。不过我相信有办法加快速度

    三,。除了这些常用方法之外,还有其他方法吗


    据我所知并非如此。

    除非您已经分析过,以验证这是否导致了问题(我打赌您没有,也不是),否则请别管它。在等待鼠标输入数百毫秒后,再快一微秒找到对象毫无意义。是要选择选择矩形中的所有对象,还是仅选择未完全遮挡的对象?因为如果你想全部选择,那就排除了颜色选择的可能性。@JerryCoffin我有很多场景,里面有几十万个对象。根据对象的复杂性和对象的数量,使用当前设置选择对象可能需要一秒钟或更长时间。我不认为这是整个过程中的瓶颈,但我想知道什么是理想的采摘方法,以供将来参考。@KristianDuske我认为直接可见的就可以了。我认为没有必要选择遮挡的项目。好消息,谢谢。