我有一个PyOpenGL项目。我渲染了体育场和一些pcd云。我想从屏幕上提取一个点。我有X,Y值,并且尝试使用gluUnProject
或glReadPixelsf
来获取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,但我不认为我知道如何将它们组合在一起,谢谢您的帮助。
答案 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