3D 中的 OpenGL 2D 文本 Space [C++/GLM] 矩阵乘法

OpenGL 2D Text in 3D Space [C++/GLM] Matrix Multiplication

我试图使用 3D 坐标显示 2D 文本。 我正在关注 this tutorial(解决方案 #1:2D 方式)。我做了本教程中所示的所有操作,但可能有问题。这是代码:

void Update()
{
    glm::mat4 projectionMatrix = glm::perspective(45.0,640.0/480.0,0.01,500.0);
    glm::mat4 viewMatrix = glm::lookAt(glm::vec3(0.0,0.0,0.0),glm::vec3(0.0,0.0,-5.0),glm::vec3(0.0,1.0,0.0));
    glm::vec4 worldSpace(0.f,1.0,-5.f,1.0);
    glm::vec4 screenSpace = projectionMatrix * viewMatrix * worldSpace;
    screenSpace /= screenSpace.w;

    ovlay.setPosition(screenSpace.x,screenSpace.y);
}

projectionMatrix 是我使用的视角。

viewMatrix是我的相机位置和方向。

worldSpace 是我想用来计算 2D 坐标的 3D 位置。

screenSpace 应该给我 2D 中的位置 space 但我得到一些奇怪的结果:

x = 0, y = 0.358518

我觉得应该是x = 320, y = 100.

如果有人知道我做错了什么,我将不胜感激。

好吧,这段代码计算的是worldSpace点的标准化设备坐标。在此 space 中,观看体积沿所有轴 [-1,1],因此 x=0 恰好位于中心,y=0.358518 位于中心上方某处。

如果你想要windowspace位置,你需要考虑viewport。假设您的视口填满整个 window 大小 w * h 像素,您可以获得 window 位置:

wx = (x + 1.0f) * 0.5f * w;
wy = (y + 1.0f) * 0.5f * h;

假设您的投影矩阵建议使用 640x480 分辨率,这将给出 (320, 326)。我不知道您为什么期望 y 为 100。请注意 GL 使用 底部 左角作为原点。在典型的 window 系统中,原点在顶部,因此 GL 中的 y=326 将匹配其他约定中的 y'=153。