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

Posted

技术标签:

【中文标题】3D 空间中的 OpenGL 2D 文本 [C++/GLM] 矩阵乘法【英文标题】:OpenGL 2D Text in 3D Space [C++/GLM] Matrix Multiplication 【发布时间】:2015-03-21 18:58:11 【问题描述】:

我尝试使用 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 空间中的位置,但我得到了一些奇怪的结果:

x = 0, y = 0.358518

我认为它应该类似于x = 320, y = 100

如果有人知道我做错了什么,我会很感激。

【问题讨论】:

【参考方案1】:

好吧,这段代码计算的是worldSpace 点的标准化设备坐标。在这个空间的所有轴上的观看量是[-1,1],所以x=0正好在中心,y=0.358518在中心上方的某个地方。

如果你想要窗口空间位置,你需要考虑到viewport。假设您的视口填充了大小为w * h 像素的整个窗口,您可以得到窗口位置:

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

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

【讨论】:

对不起,我习惯了基于左上角的坐标系。

以上是关于3D 空间中的 OpenGL 2D 文本 [C++/GLM] 矩阵乘法的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中的 OpenGL 中将坐标从 3D 透视投影映射到 2D 正交投影

具有 OpenGL 和 C++ 的 2D 平台游戏相机

OpenGL工作流程

在 3D 空间中使用 GLSL 绘制 2D Mesh Grid

Android - 使用 openGL ES 绘制 3D 然后 2D

如何在 C++ 中的 OpenGL 中的矩形上显示文本?