获取OpenGL中距离鼠标当前位置最近的世界3D点的3D坐标

7
在OpenGL上下文中,我发现可以将鼠标坐标转换为3D世界坐标(例如:MFC with Opengl get 3d coordinate from 2d coordinate of mouse)。然而,当我只有一组GLPoint和大量空白空间时,这种方法不起作用:当我将鼠标悬停在空白空间上时,3D坐标没有意义。
如何获取最接近鼠标位置的3D点的坐标?

3
那会是什么点呢?如果你把手指指向空荡荡的天空,那么“最近”的点是在你的指尖还是在宇宙的边缘或者在两者之间某个位置呢? - molbdnilo
@molbdnilo 我在想这个测试只能在xy平面上实现。如果我从鼠标的xy位置开始投射一条光线,并返回z=[0.0, 1.0]范围内距离为n像素的圆柱体内的所有点,半径在xy方向上是固定的。 - manatttta
好的,OpenGL不是场景图。它只是在屏幕上绘制像素而已。所以无论你做什么,OpenGL只是帮助你到达目的地的工具。下一个最接近窗口点击的非空指针?这是一个图像空间搜索问题。理论上,你可以从点击点向外(在图像空间中)螺旋形搜索非空像素。 - datenwolf
如果你想在OpenGL端而不是CPU上使用它,那么你可以将深度缓冲区作为纹理并模糊化它(忽略清除深度值),这样深度坐标就会渗透到屏幕的所有空白区域。然后,只需使用它来代替渲染图像以获取鼠标坐标即可... - Spektre
1个回答

4

请注意,将2D鼠标坐标投射到3D世界中需要额外的信息。屏幕上的2D位置对应于从3D中的近平面到远平面沿线的无限多个点。这意味着要获取一个3D点,您需要提供深度值。

gluUnProject函数是一种方便的方法,它提供了一个winZ参数来实现此功能。0.0会在近平面找到3D点,而1.0会在远平面找到。

gluUnProject(winX, winY, winZ, model, proj, view, objX, objY, objZ);

注意:如果gluUnProject不可用,您可以通过矩阵很容易地找出相同的东西。源代码在这里

当使用鼠标与3D对象交互时,通常会从深度缓冲区进行采样或通过与场景几何体或基元(如球体或盒子)相交来找到该深度值。如果目标是与点进行交互,则可以在每个点周围使用一个球体。如果您只想要一个“在那里的” 3D 点,则可以确定一个深度值(可能是近平面上的 0.0 或中间值 - 在近和远平面之间的一半,比如0.5)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接