繁体   English   中英

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

[英]How to get Screen coordinates from a 3D Point? Opengl

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

erjot的答案是不完整的。

还有2件事需要考虑。

  1. homogeneous = P . M . world homogeneous = P . M . world homogeneous = P . M . worldhomogeneous向量是均匀空间中的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。

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

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);

还有一件事。 请记住,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)”);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM