如何从3D点获取屏幕坐标? OpenGL的

时间:2010-09-25 04:18:56

标签: c++ opengl

我已经看到很多屏幕坐标到世界坐标帖,但没有看到相反的情况。有一种简单的方法可以从三维点获取屏幕坐标,从我查看的任何角度来看?我正在使用C ++和opengl

3 个答案:

答案 0 :(得分:21)

erjot的答案是不完整的。

还有两件事需要考虑。

  1. homogeneous = P . M . worldhomogeneous向量是齐次空间中的4-d向量。特别是,要将其恢复到[-1:1] ^ 3立方体,您需要将其前3个坐标除以homogeneous.wcube.x = homogeneous.x / homogeneous.w(有些人称之为预测鸿沟)。
  2. 然后,您需要通过对其应用视口转换将[-1:1] ^ 3立方体转换为窗口坐标。 window.x = viewport.x + viewport.width * (cube.x+1)/2
  3. 如果您关心最终的Z,转换不是通过视口,而是通过DepthRange。

答案 1 :(得分:6)

顶点的屏幕坐标只是这个顶点乘以投影和模型视图矩阵的结果:

screen_coordinates = projection_matrix * modelview_matrix * world_coordinates

您可以手动完成(特别是如果您使用某些数学库对矩阵进行操作)或使用gluProject,例如:

std::array<GLfloat, 16> projection;
std::array<GLfloat, 16> modelview;
std::array<GLfloat, 3>  screen_coords;

glGetFloatv(GL_PROJECTION_MATRIX, projection.data());
glGetFloatv(GL_MODELVIEW_MATRIX, modelview.data());

gluProject(world_coords[0], world_coords[1], world_coords[2],
    modelview.data(), projection.data(),
    screen_coords.data(), screen_coords.data() + 1, screen_coords.data() + 2);

答案 2 :(得分:2)

另一件事。请记住,gluProject给出坐标系开始于左下角的坐标。屏幕坐标从左上角开始。要获得适当的屏幕坐标值,必须从OpenGL设备的高度中减去y的值。

例如在Qt GLWidget中绘制(0,1,2)世界坐标中的文本:

gluProject(0,1,2,modelMatrix,projMatrix,sc.x,sc.y,sc.z); renderText(sc.x,高度() - sc.y, “(0,1,2)”);