我有一个有数千行的3d场景。我希望能够在鼠标光标的10像素邻域中拾取所有三维线(使用透视投影)。我尝试过使用独特的基于颜色的方法。但这种方法不适合我,因为我不能选择所有的线——只有最接近的一条。我的问题有什么可以接受的解决办法吗?OpenGL或DirectX——这并不重要。
为什么不计算这些线和问题点之间的距离?这是一个二维线到点距离计算。您可能可以用一个Perl脚本来实现它,该脚本调用一个Python可执行文件,该可执行文件调用一个Lua interper,并且仍然可以在一秒钟内完成100000个任务。
这是一种"当我只有一把锤子,每个问题看起来都像钉子"的狭隘愿景。您不需要使用渲染来进行拾取。
在旧的OpenGL(<=2.1)中,您可以使用"选择模式"来执行此操作。使用gluPickMatrix()
选择光标位置周围的一个小区域,初始化选择缓冲区,滑入选择模式(glRenderMode(GL_SELECT)
),然后重新绘制场景。然后退出选择模式,您的选择缓冲区将是显示在您感兴趣区域中的所有绘制对象的全名(实际上是id号)。您必须稍微修改图形代码,以便在渲染的每个对象周围推送/弹出名称(glPushName(objIndex)
)。
这不是现代图形硬件的最有效使用,但它总是有效的。
OpenGL和DirectX都不会为您完成这项工作,因为它们只画东西。如果离所选位置最近的点比所需的最大距离更近,则必须将场景中的所有线投影到屏幕上并进行测试。你可以通过将线保留在一些空间细分结构(如Kd树或类似结构)中来加速这一过程,以快速丢弃所有与你的标准不匹配的线。