line_loop 是由 opengl 创建的。我需要选择线段的一个顶点,然后将其拖动到 2D 屏幕中的某个位置。
我的想法是使用Opengl拾取方法拾取线的顶点,然后存储命中记录的缓冲区也从glSelectBuffer. 问题是我如何知道从返回缓冲区的信息中选择了哪个顶点?缓冲区存储name顶点的 。但似乎顶点在GL_RENDER模式中没有名称?
更新:还有其他方便的方法可以通过鼠标拖动线条吗?
OpenGL 不是场景图(啊,似乎我回答的关于 OpenGL 的所有其他问题都以这个语句开头)。在你画完东西之后,OpenGL 不再记得你实际发送了什么。旧的 OpenGL 选择模式在技术上只是测试提交的几何图形是否在投影剪辑空间范围内。在大多数 OpenGL 实现中,选择模式会退回到软件渲染模式,因此您将获得重大的性能损失。
有几种更好的选择方法(这就是为什么选择模式毕竟已从 OpenGL 中删除)。如果它只是您所追求的特定几何体中的单个顶点(例如选择橡皮筋),那么您应该自己执行这些点到标准化设备坐标的整个转换,将它们分类为一些屏幕空间空间细分结构(2d Kd 树,四叉树等),以便您可以确定在O(log n)时间内单击的点- 与您在选择模式下的 O(n) 相比,您必须“绘制”整个橡皮筋,所以所有点都经过测试。
编辑/更新
因为 OpenGL 是(只是)一个绘图 API,所以你也不能“拖拽”东西。你必须重新绘制它们。从技术上讲,您应该重绘整个场景,或者在开始拖动时,在没有将要被拖动到纹理(颜色和深度)中的对象的情况下绘制场景,然后在每个拖动步骤中将视图清除到纹理中的缓存内容然后将拖动的对象添加到其更新位置。