用openGL从二维屏幕点击获取三维点

2024-09-27 21:26:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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,但我不知道如何将它们结合起来谢谢你的帮助。你知道吗


Tags: 屏幕绘制matrix缓冲区printglrealyvport
1条回答
网友
1楼 · 发布于 2024-09-27 21:26:56

可以使用^{}从默认帧缓冲区的深度缓冲区读取深度。使用GL_DEPTH_COMPONENT格式执行此操作:

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

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

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

相关问题 更多 >

    热门问题