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 从任意视点进行三维拾取_Opengl_Graphics - Fatal编程技术网

Opengl 从任意视点进行三维拾取

Opengl 从任意视点进行三维拾取,opengl,graphics,Opengl,Graphics,我创建了一个不同颜色和材质的许多管道(阀门、人孔)的3d场景。现在我想用鼠标拾取它们并获取它们的属性(颜色、材质)。我曾尝试使用OpenGL API提供的glupushmatrix方法,当视点几乎位于管道的正前方时,该方法有效。但当从不同的视点观察时,例如从(0,1,1)到(0,0,0),它无法做到这一点。更重要的是,我没有找到glulookat函数在glupushmatrix之前的任何投影设置。我还尝试使用math使用基于光线跟踪的拾取,但我发现很难使用蛮力对每个管道进行相交测试。OpenGL

我创建了一个不同颜色和材质的许多管道(阀门、人孔)的3d场景。现在我想用鼠标拾取它们并获取它们的属性(颜色、材质)。我曾尝试使用OpenGL API提供的glupushmatrix方法,当视点几乎位于管道的正前方时,该方法有效。但当从不同的视点观察时,例如从(0,1,1)到(0,0,0),它无法做到这一点。更重要的是,我没有找到glulookat函数在glupushmatrix之前的任何投影设置。我还尝试使用math使用基于光线跟踪的拾取,但我发现很难使用蛮力对每个管道进行相交测试。

OpenGL提供了一种特殊的渲染模式()来帮助实现拾取

要实施它,您必须:

  • 您的可选原语
  • 使用
    GL\u选择
    模式添加渲染过程
编辑链接:


遵循

首先,
gluphushmatrix
不是OpenGL规范的一部分。其次,光线投射(与跟踪不同)非常简单,即使使用您建议的“暴力”方法,并且具有合理数量的形状和一些宽相位剔除(AABBs应该可以做到),也应该“对每个人都足够”。也就是说,显示用于基于颜色的拾取的代码,因为现在我们只知道它不起作用。感谢您的关注。事实上,我使用了同样的技术。我遵循了当你就在对象前面时它起作用的规则(就像雪人示例一样)。但当你从另一个角度来看,比如鸟瞰,它失败了。我不知道这是这种方法的局限性还是我的程序有问题。@Leoxu:我在3d景观中使用过这种技术,效果很好。显示你的代码。如果我记得的话,在选择模式中,绘图顺序是覆盖深度测试的…@Leoxu:你的图托错过了一个例子。这是一个帮助设置正确的拾取矩阵的工具。教程中包含了几篇文章,只需转到底部,您就可以看到“下一步”。我使用了相同的拾取代码,只是在“绘制部分”中进行了更改,在绘制对象之前按名称,然后在绘制对象之后弹出,对于“渲染模式”和“选择模式”,我使用相同的代码。以下是说明问题的示例…@Leoxu:您可以使用拾取矩阵(扩展宽度/高度)进行渲染以检查它。