如何将2D世界转换为屏幕坐标OpenGL

How to transform 2D world to screen coordinates OpenGL

我目前正在将OpenGL支持的渲染器实现到二维游戏引擎中。

因为OpenGL屏幕坐标空间是[-1,1],我有点困惑它应该如何与通用的笛卡尔二维世界坐标系统接口。

假设我的世界中的视区是[-500,-500]到[1200,1200],其中[0,0]是世界的原点。我只需要翻译并缩小到-1和1之间的坐标吗?或者是否需要执行其他形式的转换?

如何计算在屏幕上绘制在自己坐标系中定义了位置的对象的位置?

我很欣赏有或没有格洛斯托的解释(所以我们也可以使用Z轴作为透视效果)。


首先,OpenGL使用多个坐标系,因此没有"OpenGL坐标系"。您所指的是标准化设备坐标(ndcs),其中所有三个坐标都在范围内[-1,1]。不同的坐标系及其名称在"9.011如何转换坐标"一节中解释。什么是不同的坐标空间?"1)

其次,为了避免混淆,在OpenGL中,术语"viewport"指的是要渲染到的窗口部分,它位于窗口坐标中。在您的问题中,您使用它来描述您想要呈现的世界的部分(l、r、t、b)=(-500、-500、1200、1200),它在世界坐标中。

您询问了如何"计算在屏幕上绘制对象的位置"。您需要做的是定义一个从一个坐标系映射到另一个坐标系的转换(4x4矩阵)。您的二维世界是以世界坐标给出的,因此您需要定义一个将世界坐标转换为ndcs的矩阵,即投影矩阵。在着色中,只需将顶点与投影矩阵相乘,就可以得到ndcs。glm::ortho/glOrtho计算这种投影矩阵。至于透视投影,还不清楚您想做什么,但是您应该在GLM中对perspectivelookat函数进行实验。

要清楚,您可以在任意坐标系(称为世界坐标系)中定义顶点,并简单地绘制这些顶点。顶点明暗器的工作是应用定义的转换。

还要注意,您指定了一个正方形,通常这不是您想要的。监视器和大多数窗口都不是方形的,因此如果将该方形映射到一个典型的视区,您将得到一个扭曲的世界视图。您需要考虑到视区的纵横比(宽度:高度)。我想在这里解释一下。

1)作为旁注,FAQ相当古老,指的是OpenGL的古老版本。现在,程序员被期望和鼓励自己管理模型视图和投影矩阵,因为您需要它们在您的明暗器中。我强烈推荐GLM,它的头部因此很容易集成,并且有很好的语法来反映GLSL。


在投影矩阵上使用格洛斯托,然后正常绘制。举个例子,我猜你想要格洛斯托(0,1000,0,3000,-1,1),它会给你一个宽度为1000单位,高度为3000单位的视区。


将场景放置在所需的坐标系中。我建议使用glm(http://glm.g-truc.net/)来初始化矩阵和执行数学运算等。因此,您可能有一个场景图引擎,用于管理二维/三维世界中的所有对象。只需在GLM中设置正确的视图和投影。实际上,您不应该需要任何图形管道实现细节-因此在您的游戏引擎中可能会有一个错误的设计决策。