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 正交投影
在 3D 空间中使用 GLSL 绘制 2D Mesh Grid