我试图在一个房间里模拟一个深度相机,我的相机可以在世界上移动和旋转,房间被模拟成一个围绕(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}$
要在视口中查找点的世界位置,必须知道该点的深度值。在
x和y屏幕的位置和深度已转换为[-1,1]范围内的标准化设备坐标。为此,必须知道视口矩形:
规范化的设备空间坐标必须通过逆投影矩阵转换到视图空间(最后进行透视分割)。在
通过逆视图矩阵,可以将视图空间坐标转换为世界空间。在
^{} 为您完成了所有这些,但是您必须知道片段的深度。
碎片的深度可由^{} 读取:
^{pr2}$注意,您必须启用Depth Test,否则将不会设置深度缓冲区。这也带来了好处,前面的多边形覆盖了“后面”的多边形:
当然,当vlue分别由
glGetDoublev(GL_PROJECTION_MATRIX)
读取时,投影矩阵和模型-视图矩阵必须正确设置。在这意味着视图矩阵的读取应在设置后完成:
注意,如果对
gluUnProject
的第四个参数(model
)使用了单位矩阵,那么gluUnProject
不计算世界坐标,而是计算视图坐标。在相关问题 更多 >
编程相关推荐