如图所示
我将一组轮廓(多边形)绘制为GL_LINE_STRIP。
现在我想选择鼠标下的curve(polygon)进行3D删除,移动..etc。
我想知道使用哪种方法:
1.使用OpenGL选取和选择。 (glRenderMode(GL_SELECT))
2.使用手动碰撞检测,通过拾取射线并检查射线是否在每个多边形内。
最佳答案
我强烈建议反对GL_SELECT 。此方法非常老旧,在新的GL版本中不存在,并且您可能会在现代图形卡上遇到问题。不要期望它会被硬件支持-可能会在许多GPU上遇到这种模式的软件(驱动程序)后备,只要它可以正常工作。使用后果自负:)
让我为您提供替代方案。
对于坚固的大物体,有一种古老的,很好的选择方法:
这为您提供了一种非常可靠的“按对象”拾取方法。此外,除非您缺乏顶点处理能力(我认为这不太可能)或确实有很多对象并且很可能获得CPU的支持,否则仅以最少的每像素操作绘制和清除1个像素并不会真正损害您的性能。限制了绘图调用的数量(但再次重申,我相信,如果您可以将颜色作为每个像素的数据进行传递,则有可能将其优化为单个绘图调用)。
RGB中的颜色是3个无符号字节,但是应该有可能另外使用帧缓冲区的alpha channel 作为最后一个字节,因此您总共将获得4个字节-足以将指向该对象的任何32位指针存储为颜色。
另外,您可以为此创建具有特定像素格式(例如
GL_R32UI
,甚至GL_RG32UI
,如果需要64位)的专用帧缓冲区对象。对于严格的几何方法,上面的方法是一种很好且快速的替代方法(在可靠性和实现时间方面)。