尝试使用 openGL 从屏幕上的 2d 单击获取 3d 点
Trying to get 3d point from 2d click on screen with openGL
我有一个 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,但我认为我不明白如何将它们结合起来,感谢您的帮助。
您可以使用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)
另见
我有一个 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,但我认为我不明白如何将它们结合起来,感谢您的帮助。
您可以使用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)
另见