C ++ / GLM:计算顶点的屏幕位置

时间:2017-05-08 20:33:31

标签: c++ matrix vector 3d glm-math

我想计算网格对最终渲染的影响,即它在视口中的大小。 为此,我尝试在屏幕上为每个顶点获取投影位置。 例如,在屏幕中心呈现的点应返回右上角的(0,0) 屏幕的一角(1,1)等等。

这是我的代码,被剥离到最低限度,基于每一个 为glm::perspective提供的示例代码:

glm::mat4 Projection = glm::perspective(
    glm::radians(45.0f), 
    800.0f/600.0f, 
    0.1f, 
    100.0f
);
glm::mat4 View = glm::lookAt(
    glm::vec3(-10,0,3),
    glm::vec3(0,0,3),
    glm::vec3(0,0,1)
);
glm::mat4 MVP = Projection * View * glm::mat4(1.f);

for each (Vertex vert in *verts) {
    glm::vec3 vertPos = vert.getPosition();
    glm::vec4 screenPos = MVP * glm::vec4(vertPos, 1);
}

此时我被卡住了,因为我不知道如何处理结果向量。 我无法弄清楚它的四个值的含义。

example setup: rendering

example setup: front-view

example setup: top-view

在我的示例设置中,点(-1,-1,2)(请参见第一张图片上的红色圆圈)大致呈现在像素(480,380)处。 所述点的screenPos返回(1.81, -2.41, 10.82, 11.0)(舍入值)。只要我无法理解,我就无法继续这些结果。有谁知道xyzw值对我的观点有何看法?

我感谢任何帮助或提示,在这个问题上工作太久。

PS:我知道有很多问题涉及glm::perspective,但我不想要 渲染网格。我甚至不想包括GLSL。这只是计算。

1 个答案:

答案 0 :(得分:1)

您可以将screenPos除以w组件,然后获取屏幕空间坐标。

screenPos = screenPos / screenPos.w;

这是透视师。此划分将相机视锥转换为后投影立方体。在screenPos.xy成为屏幕空间坐标和screenPos.z - 标准化深度(0.0 - 近平面,1.0 - 远平面,以及顺便说一下,它不是线性的)之后。

但它只适用于具有正screenPos.w的顶点(即相机前的顶点)。