【问题标题】:Trying to get 3d point from 2d click on screen with openGL尝试使用openGL从2d点击屏幕获取3d点
【发布时间】:2019-08-14 21:22:12
【问题描述】:

我有一个 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,但我认为我不明白如何将它们结合起来,感谢您的帮助。

【问题讨论】:

    标签: python opengl pyopengl glreadpixels


    【解决方案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

    【讨论】:

    • 我只是忘记使用 glEnable(GL_DEPTH_TEST) 它现在可以正常工作了!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2019-06-08
    • 1970-01-01
    • 2016-03-16
    • 1970-01-01
    • 1970-01-01
    • 2018-10-30
    • 2023-03-03
    相关资源
    最近更新 更多