使用python openg中的2d图像点获取空间中的三维点

2024-09-29 00:13:57 发布

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

我试图在一个房间里模拟一个深度相机,我的相机可以在世界上移动和旋转,房间被模拟成一个围绕(0,0,0)的三维立方体 点击一个按钮,我想在图像中随机抽取N个点,并得到这些点与相机的距离(“真实世界”中的距离)。到目前为止,我已经成功地创建了移动摄影机和立方体的场景 (Example

我试着用gluUnProject来获取3d点

model_view = np.array(glGetDoublev(GL_MODELVIEW_MATRIX))
proj = np.array(glGetDoublev(GL_PROJECTION_MATRIX))
view = np.array(glGetDoublev(GL_VIEWPORT))

3d_point = gluUnProject(x,y, 0.0)

其中x,y是图像中像素的坐标,但是当我检查这些像素时,我知道它们的位置(立方体的角),我得到的结果感觉像是随机的。在

我对openGL非常陌生,所以我可能会遗漏一些东西,从数学角度来说,我只想在像素坐标上应用投影和视图矩阵的倒数,但这不起作用。在

我附上了下面房间模拟的代码。在

提前谢谢。在

^{pr2}$

Tags: 图像view距离examplenp场景像素array
1条回答
网友
1楼 · 发布于 2024-09-29 00:13:57

要在视口中查找点的世界位置,必须知道该点的深度值。在

x和y屏幕的位置和深度已转换为[-1,1]范围内的标准化设备坐标。为此,必须知道视口矩形:

ndc = [2.0* x/vp_width - 1.0, 1.0 - 2.0*y/vp_height, depth*2.0 - 1.0]; 

规范化的设备空间坐标必须通过逆投影矩阵转换到视图空间(最后进行透视分割)。在

通过逆视图矩阵,可以将视图空间坐标转换为世界空间。在

^{}为您完成了所有这些,但是您必须知道片段的深度。 碎片的深度可由^{}读取:

^{pr2}$

注意,您必须启用Depth Test,否则将不会设置深度缓冲区。这也带来了好处,前面的多边形覆盖了“后面”的多边形:

glEnable(GL_DEPTH_TEST)
Cube()

当然,当vlue分别由glGetDoublev(GL_PROJECTION_MATRIX)读取时,投影矩阵和模型-视图矩阵必须正确设置。在

这意味着视图矩阵的读取应在设置后完成:

glPushMatrix()
glLoadIdentity()
glTranslatef(tx, ty, tz)
glRotatef(ry, 0, 1, 0)
glRotatef(rx, 1, 0, 0)

glMultMatrixf(view_mat)
glGetFloatv(GL_MODELVIEW_MATRIX, view_mat)

model_view = np.array(glGetDoublev(GL_MODELVIEW_MATRIX))

注意,如果对gluUnProject的第四个参数(model)使用了单位矩阵,那么gluUnProject不计算世界坐标,而是计算视图坐标。在

相关问题 更多 >