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

Aer*_*ero 11 c++ opengl

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

Bah*_*bar 21

erjot的答案是不完整的.

还有2件事需要考虑.

  1. 因此homogeneous = P . M . world,homogeneous向量是均匀空间中的4-d向量.特别是,要将其带回[-1:1] ^ 3立方体,您需要将其前3个坐标除以homogeneous.w.cube.x = homogeneous.x / homogeneous.w(有些人称之为预测鸿沟).
  2. 然后,您需要通过对其应用视口转换将[-1:1] ^ 3立方体转换为窗口坐标. window.x = viewport.x + viewport.width * (cube.x+1)/2

如果您关心最终的Z,则转换不会通过视口,而是通过DepthRange.


erj*_*jot 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);
Run Code Online (Sandbox Code Playgroud)