如图所示

我画一组等高线(多边形)为GL_LINE_STRIP。现在我想选择曲线(多边形)下的鼠标删除,move..etc在3D。
我想知道使用哪种方法:
1.采用OpenGL采摘和选择。( glRenderMode(GL_SELECT) )
2.使用手动碰撞检测,使用拾取射线,并检查光线是否在每个多边形内。
发布于 2010-10-30 16:52:13
我强烈反对 GL_SELECT。这种方法非常古老,在新的GL版本中也没有,您可能会遇到现代显卡的问题。不要期望硬件支持它--在许多GPU上可能会遇到这种模式的软件(驱动程序)退步,前提是它能工作。自费使用:)
让我为你提供另一种选择。
对于实心的、大的物体,有一种古老而好的选择方法:
在光标position
这给了你一个非常可靠的“每个对象”的挑选方法。而且,只绘制和清除每像素操作最少的一个像素并不会真正损害您的性能,除非您缺少顶点处理能力(我认为是不太可能的),或者有很多对象,并且很可能在绘制调用的次数上得到CPU绑定(但是,我再次相信,如果您可以按照每个像素数据传递颜色,那么就可以将其优化为一个抽签调用)。
RGB中的颜色是3个无符号字节,但是应该可以为最后一个字节额外使用框架缓冲区的alpha通道,因此总共可以得到4个字节--足够存储指向对象的任何32位指针作为颜色。
或者,您可以为此创建一个具有特定像素格式的专用框架缓冲区对象(比如GL_R32UI,如果需要64位,甚至创建GL_RG32UI )。
以上是严格的几何方法的一个很好和快速的选择(在可靠性和实现时间方面)。
发布于 2010-10-31 00:15:25
我发现在新的GPU上,GL_SELECT模式非常慢。我用了几种不同的方法来解决这个问题。
第一种方法是进行CPU碰撞测试,这是可行的,但没有我想要的那么快。当你将光线投射到屏幕上(使用gluUnproject),然后试图找出鼠标与哪个物体相撞时,它的速度肯定会减慢。我获得满意速度的唯一方法是使用八叉树来减少碰撞测试的次数,然后进行边界盒碰撞测试--然而,这导致了一种像素不完美的方法。
我确定的方法是首先找到鼠标下的所有对象(使用gluUnproject和边界盒碰撞测试),这通常非常快。然后,我将在后台缓冲区中可能与鼠标发生冲突的每个对象呈现为不同的颜色。然后,我使用glReadPixel获取鼠标下面的颜色,并将其映射回对象。glReadPixel是一个缓慢的调用,因为它必须从帧缓冲区读取。然而,它是每帧做一次,这最终花费了微不足道的时间。如果您愿意,可以通过呈现给PBO来加快速度。
贾瓦
发布于 2010-11-01 15:04:49
umanga,Cant看如何在网上回复..。也许我应该注册:)
首先,我必须向你道歉,因为我给了你错误的algo --我选了一张脸。但你所需要的是非常相似的,这就是为什么我感到困惑.哦哦。
像前面说的那样,把相机定位到鼠标矢量。
对于每个等高线,以成对的方式遍历所有的同弦(0-1,1-2,2-3,.和以前一样用它做一个vec。即沿等高线走。
现在做这两个的交叉刺激(等高线边缘到鼠标vec),而不是像我前面说的那样在对之间做,对所有的对和向量都加起来。
最后,找出得到的向量的大小。如果结果是零(考虑四舍五入的错误),那么你的外部形状-不管面对什么。如果你对面对感兴趣,那么你可以用鼠标向量做点戳,找出面向,然后测试符号+/-。
它可以工作,因为algo可以依次找到从向量线到每个点的距离。当你把它们加起来,你就在外面,它们都会抵消掉,因为等高线是封闭的。如果你的内心,那么他们都总结。它实际上是物理学中的高斯电磁场定律。
参见:http://en.wikipedia.org/wiki/Gauss%27s_law和注意:“方程的右边是用电常数除以S的总电荷”,注意“封闭”一词--即零的意思不是封闭的。
您仍然可以使用限界框进行优化以提高速度。
https://stackoverflow.com/questions/4040616
复制相似问题