如图所示

我将一组轮廓(多边形)绘制为GL_LINE_STRIP。
现在我想选择鼠标下的curve(polygon)进行3D删除,移动..etc。

我想知道使用哪种方法:

1.使用OpenGL选取和选择。 (glRenderMode(GL_SELECT))

2.使用手动碰撞检测,通过拾取射线并检查射线是否在每个多边形内。

最佳答案

我强烈建议反对GL_SELECT 。此方法非常老旧,在新的GL版本中不存在,并且您可能会在现代图形卡上遇到问题。不要期望它会被硬件支持-可能会在许多GPU上遇到这种模式的软件(驱动程序)后备,只要它可以正常工作。使用后果自负:)

让我为您提供替代方案。

对于坚固的大物体,有一种古老的,很好的选择方法:

  • 在光标位置
  • 启用并将剪刀测试设置为1x1窗口
  • 在没有照明,纹理和多重采样的情况下绘制屏幕,​​为每个“重要”实体分配唯一的纯色-此颜色将成为用于选择
  • 的对象ID
  • 调用glReadPixels并检索颜色,然后将其用于识别所选择的对象
  • 清除缓冲区,将剪刀重置为正常大小并正常绘制场景。

  • 这为您提供了一种非常可靠的“按对象”拾取方法。此外,除非您缺乏顶点处理能力(我认为这不太可能)或确实有很多对象并且很可能获得CPU的支持,否则仅以最少的每像素操作绘制和清除1个像素并不会真正损害您的性能。限制了绘图调用的数量(但再次重申,我相信,如果您可以将颜色作为每个像素的数据进行传递,则有可能将其优化为单个绘图调用)。

    RGB中的颜色是3个无符号字节,但是应该有可能另外使用帧缓冲区的alpha channel 作为最后一个字节,因此您总共将获得4个字节-足以将指向该对象的任何32位指针存储为颜色。

    另外,您可以为此创建具有特定像素格式(例如GL_R32UI,甚至GL_RG32UI,如果需要64位)的专用帧缓冲区对象。

    对于严格的几何方法,上面的方法是一种很好且快速的替代方法(在可靠性和实现时间方面)。

    09-13 03:27