Opengl 如何通过选择顶点拖动线段

Opengl 如何通过选择顶点拖动线段,opengl,Opengl,线条循环是由opengl创建的。我需要拾取线段的顶点,然后将其拖动到2D屏幕中的某个位置 我的想法是使用Opengl拾取方法拾取线的顶点,然后从glSelectBuffer创建存储命中记录的缓冲区。问题是如何从返回的缓冲区信息中知道选择了哪个顶点?缓冲区存储顶点的名称。但在GL\u RENDER模式下,顶点似乎没有名称 更新:还有其他方便的方法用鼠标拖动线条吗?OpenGL不是一个场景图(哎呀,似乎OpenGL上的所有其他问题我都是从这句话开始回答的)。在你画了一些东西之后,OpenGL就不再记

线条循环是由opengl创建的。我需要拾取线段的顶点,然后将其拖动到2D屏幕中的某个位置

我的想法是使用Opengl拾取方法拾取线的顶点,然后从
glSelectBuffer
创建存储命中记录的缓冲区。问题是如何从返回的缓冲区信息中知道选择了哪个顶点?缓冲区存储顶点的
名称
。但在
GL\u RENDER
模式下,顶点似乎没有名称


更新:还有其他方便的方法用鼠标拖动线条吗?

OpenGL不是一个场景图(哎呀,似乎OpenGL上的所有其他问题我都是从这句话开始回答的)。在你画了一些东西之后,OpenGL就不再记得你实际发送了什么。旧的OpenGL选择模式在技术上只是测试提交的几何体是否在投影剪辑空间范围内。在大多数OpenGL实现中,选择模式会退回到软件渲染模式,因此您将获得重大的性能影响

有几种更好的选择方法(这就是为什么选择模式已经从OpenGL中删除)。如果只是特定几何体中的单个顶点(如选择橡胶带),则应自行将这些点转换为标准化设备坐标,并将其排序为某些屏幕空间空间细分结构(2d Kd树、四叉树等),以便确定在屏幕上单击的点(对数n)时间–与选择模式下的O(n)相反,在选择模式下,您必须“绘制”整个橡胶带,以便测试所有点

编辑/更新


由于OpenGL(只是)一个绘图API,您也不能“拖动”对象。您必须重新绘制它们。从技术上讲,您应该重新绘制整个场景,或者在开始拖动时,在不将对象拖动到纹理(颜色和深度)的情况下绘制场景,然后对于每个拖动步骤,将视图清除到纹理中的缓存内容,然后将拖动的对象添加到其更新位置。

OpenGL不是一个场景图(哎呀,似乎OpenGL上的所有其他问题我都是从这句话开始回答的)。在您绘制了某些内容后,OpenGL不再记得您实际发送的内容。旧的OpenGL选择模式在技术上只是测试提交的几何体是否在投影剪辑空间范围内。在大多数OpenGL实现中,选择模式会返回到软件渲染模式,因此您将获得显著的性能击中

有几种更好的选择方法(这就是为什么选择模式已经从OpenGL中删除的原因)。如果它只是特定几何体中的单个顶点(如选择橡皮筋)你在之后,你应该自己执行这些点到标准化设备坐标的整个转换,将它们排序到一些屏幕空间空间细分结构(2d Kd树、四叉树等),以便你可以确定在O(logn)时间内点击的点,而不是O(n)在选择模式下,您必须“绘制”整个橡皮筋,以便测试所有点

编辑/更新


由于OpenGL(只是)一个绘图API,您也不能“拖动”对象。您必须重新绘制它们。从技术上讲,您应该重新绘制整个场景,或者在开始拖动时,在不将对象拖动到纹理(颜色和深度)的情况下绘制场景,然后对于每个拖动步骤,清除纹理中缓存内容的视图,然后将拖动的对象添加到其更新位置。

我有点困惑,如果您知道鼠标单击点的位置,以及在屏幕空间中线条端点的位置,您肯定可以确定哪一个是最近的?@cbamber85,我希望使用Picking和seopenGL的选择方法。也就是说,我希望仅从返回的缓冲区中导出要选择的原语?@cbamber85,你的意思是我可以比较鼠标点和所有线点的x、y值来确定选择了哪个点?是的,我知道这并不迷人,但你的线循环不会有那么多点,是吗?我是一个有点困惑,如果你知道鼠标点击点在哪里,你的线端点在屏幕空间的什么位置,你肯定能找出哪一个最接近?@cbamber85,我希望使用openGL的拾取和选择方法。也就是说,我希望从返回的缓冲区中导出要选择的原语?@cbamber85,你的意思是我可以将鼠标点和所有直线点的x、y值进行比较,以确定选择了哪个点?是的,我知道这并不迷人,但你的直线循环不会有那么多点,是吗?