尝试使用 openGL 从屏幕上的 2d 单击获取 3d 点

Trying to get 3d point from 2d click on screen with openGL

我有一个 PyOpenGL 项目。我渲染了一个体育场和一些 pcd 云。我想从屏幕上提取一个点。我有 X、Y 值,我正在尝试使用 gluUnProjectglReadPixelsf 来获取 x、y、z 中的点。

但我得到了奇怪的数字 例如: 我用我的相机尽可能地缩放到 0,0,0 点并使用

 worldCoordinate1 = gluUnProject(x, realy, 0.0, mvmatrix, projmatrix, vport)

获得:

(-79.71705354658924, 3.024572101740394, -1.8905707759570176)

看起来不错。这是真正的相机位置。 但我的问题始于远平面。

worldCoordinate2 = gluUnProject(x, realy, 1.0, mvmatrix, projmatrix, vport)

理想情况下,我希望这能让我与绘制的任何缓冲区对象发生碰撞。但我得到

  (2098.1759117202328, -121.52711517535181, 77.12367509703613)

我的函数如下所示:

def get_clicked_location(x, y):
    vport = glGetIntegerv(GL_VIEWPORT)
    mvmatrix = glGetDoublev(GL_MODELVIEW_MATRIX)
    projmatrix = glGetDoublev(GL_PROJECTION_MATRIX)
    realy = vport[3] - y
    worldCoordinate1 = gluUnProject(x, realy, 0.0, mvmatrix, projmatrix, vport)
    worldCoordinate2 = gluUnProject(x, realy, 1.0, mvmatrix, projmatrix, vport)
    print worldCoordinate1
    print worldCoordinate2
    data = glReadPixelsf(x, realy, 1, 1, GL_RGB, GL_UNSIGNED_BYTE)
    pick = map(ord, data)
    print pick

我想要的是让 x、y、z 点与屏幕上绘制的缓冲区发生碰撞。但我似乎找不到路。我还发现有些人使用 glreadpixelsf,但我认为我不明白如何将它们结合起来,感谢您的帮助。

您可以使用glReadPixels从默认帧缓冲区的深度缓冲区中读取深度。使用格式 GL_DEPTH_COMPONENT 这样做:

depth = glReadPixels(x, realy, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT)

此深度可与gluUnProject一起使用,以找到片段的世界(或模型)坐标:

vport      = glGetIntegerv(GL_VIEWPORT)
mvmatrix   = glGetDoublev(GL_MODELVIEW_MATRIX)
projmatrix = glGetDoublev(GL_PROJECTION_MATRIX)

worldCoordinate1 = gluUnProject(x, realy, depth, mvmatrix, projmatrix, vport)

另见