Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenGL GlunProject对象部分_Opengl_Glut_Raytracing - Fatal编程技术网

OpenGL GlunProject对象部分

OpenGL GlunProject对象部分,opengl,glut,raytracing,Opengl,Glut,Raytracing,我使用gluUnProject将光线投射到场景中,并在那里添加一个基本体。我现在要做的是准确地拾取现有的基本体,所以如果我有3个球体,我可以单击其中一个来删除它 我认为解决方案会检查光线是否与对象相交,并检查光线是否最接近投射原点。到目前为止,我的解决方案是基本的,并用一个边界立方体包围所有对象,是否有任何方法可以简单地使用以下方法对球体进行精确操作: does the ray intersect with ( object) 或 最后一件事,我正在使用OpenGL和GLUT 谢谢大家,, L

我使用gluUnProject将光线投射到场景中,并在那里添加一个基本体。我现在要做的是准确地拾取现有的基本体,所以如果我有3个球体,我可以单击其中一个来删除它

我认为解决方案会检查光线是否与对象相交,并检查光线是否最接近投射原点。到目前为止,我的解决方案是基本的,并用一个边界立方体包围所有对象,是否有任何方法可以简单地使用以下方法对球体进行精确操作:

does the ray intersect with ( object)

最后一件事,我正在使用OpenGL和GLUT

谢谢大家,, Laurence使用OpenGL选择模式是最好的方法,因为它可以处理任意复杂的渲染,而不仅仅是球体。您可以看到许多关于此的教程,但大致如下:首先在选择模式下设置GL:

glRenderMode (GL_SELECT);
然后,在设置一个选择缓冲区(用于捕获要渲染的片段的名称)后,绘制场景。这会让你开始


他很长,但也很好

在OpenGL中实现拾取的另一个好方法如下:

使用要选择的每个基本体的唯一颜色,将场景绘制到后缓冲区中。如果您使用的是24位模式,则颜色可以是000001、000002等。请关闭照明、雾等,以便您指定的颜色与像素将采用的颜色完全相同

不要将后台缓冲区显示在屏幕上,不要使用glSwapBuffers。相反,使用glReadPixels将GL back缓冲区读入内存缓冲区。在此之后,您就有了一个内存位图,可以从中读取像素值,对应于屏幕上鼠标的位置。从中读取的颜色值可以很容易地映射到基本体,因为它将是000001、000002等


这里有一些关于这种选择风格的信息。这是我喜欢使用的,因为它比GL_选择模式有一个优点。如果3D场景不变且鼠标在其上移动,我可以获得一份后缓冲区副本,然后通过简单引用内存位图中的相应像素,快速估计鼠标下的实体。在场景改变之前,我根本不需要使用任何GL调用。由于我的应用程序中有很多鼠标悬停在3D场景上,我需要快速知道鼠标悬停在哪个实体上,所以我发现这种方法非常快

啊哈,这个方法看起来很棒,这里有一个很棒的教程:
glRenderMode (GL_SELECT);