gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:56:49 30 4
gpt4 key购买 nike

我目前正在将 OpenGL 驱动的渲染器实现到 2D 游戏引擎中。

因为 OpenGL 屏幕坐标空间是 [-1,1],我对它应该如何与通用的笛卡尔 2D 世界坐标系进行交互有点困惑。

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

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

我会很感激有和没有 glOrtho 的解释(所以我们也可以使用 Z 轴来获得透视效果)。

最佳答案

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

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

您问如何“计算在屏幕上绘制对象的位置”。您需要做的是定义一个从一个坐标系映射到另一个坐标系的变换(一个 4x4 矩阵)。您的 2D 世界以世界坐标给出,因此您需要定义一个将世界坐标转换为 NDC 的矩阵,即投影矩阵。然后,在您的着色器中,您只需将顶点与此投影矩阵相乘,即可获得 NDC。 glm::ortho/glOrtho计算这样一个投影矩阵。至于透视投影,不清楚你想做什么,但你应该尝试perspectivelookat glm 中的函数。

为了清楚起见,您可以在任何您想要的坐标系(称为世界坐标系)中定义顶点,然后简单地绘制这些顶点。您的顶点着色器的工作是应用您定义的转换。

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

1) 作为旁注,FAQ 相当陈旧,指的是 OpenGL 的古老版本。如今,人们期望并鼓励程序员自己管理模型 View 和投影矩阵,因为您需要在着色器中使用它们。我强烈推荐glm ,它只是标题,因此非常容易集成,并且具有反射(reflect) GLSL 的良好语法。

关于opengl - 如何将 2D 世界转换为屏幕坐标 OpenGL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16127490/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com