3d线鼠标采摘

时间:2012-07-15 19:55:31

标签: opengl 3d directx mouse-picking

我有三千行的3D场景。我希望能够在鼠标光标的10像素邻域中选择所有3d线(使用透视投影)。我试过使用基于独特颜色的方法。但是这种方法不适合我,因为我不能选择所有行 - 只有最接近的行。 我的问题是否有任何可接受的解决方案? OpenGL或DirectX - 没关系。

3 个答案:

答案 0 :(得分:2)

为什么不计算这些线与相关点之间的距离?这是2D线对点距离计算。您可以使用Perl脚本实现它,该脚本调用调用Lua插入器的Python可执行文件,并且仍然可以在一秒内完成100,000个。

这是隧道视觉中的一个,“当我拥有的只是一把锤子,每个问题看起来像一个钉子”问题。你没有 使用渲染来进行拣选。

答案 1 :(得分:2)

在旧的OpenGL(< = 2.1)中,您可以使用选择模式来完成此操作。使用gluPickMatrix()选择光标位置周围的小区域,初始化选择缓冲区,滑入选择模式(glRenderMode(GL_SELECT)),然后重绘场景。然后返回选择模式,您的选择缓冲区将是您感兴趣的区域中出现的所有绘制对象的全名(实际为id号)。您必须稍微修改您的绘图代码,以便在您呈现的每个对象周围推送/弹出名称(glPushName(objIndex))。

它不是最有效地使用现代图形硬件,但它始终有效。

答案 2 :(得分:1)

OpenGL和DirectX都不能为你完成这项工作,因为它们只能绘制东西。您必须做的是将场景中的所有线条投影到屏幕并测试,如果距离所选位置最近的点比您想要的最大距离更近。您可以通过将线保持在某个空间细分结构(如Kd树或类似物)中来快速丢弃所有那些肯定与您的标准不符的线。