试图从2d获得3d点,使用openGL在屏幕上单击

时间:2019-08-14 12:50:18

标签: python opengl pyopengl glreadpixels

我有一个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,但我不认为我知道如何将它们组合在一起,谢谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您可以使用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)

另请参阅get 3d point in space using 2d point in image in python opengl