OpenGL 拉伸(stretch)形状 - 纵横比

标签 opengl 2d aspect-ratio

我得到的 openGL View 尺寸为(可以说..)800(宽度)x600(高度)。 然后我得到了一个二维坐标对象:

0.0 , 0.0
0.1 , 0.0
0.1 , 0.1
0.0 , 0.1

正如您所理解的,这应该是一个正方形(基于类比)。 但在我的 openGL View 上打印这个拉伸(stretch)。现在,我明白为什么会发生这种情况。这基本上是因为我正在处理默认矩阵 -1,1。 由于我的分辨率为 800x600,纵横比不是 1,因此我的形状被拉伸(stretch)。

现在我对如何解决这个问题更感兴趣。我读过有关 glFrustum、glOrtho、glViewPort 等函数的信息,这些函数发生在投影矩阵上,可以解决此类问题。问题是,我不确定是否使用它们。我基本上想要的是在制作正方形时保留上述坐标,并且实际上在我的 View 上显示为正方形。

解决这个问题的正确方法是什么?

最佳答案

glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
float aspect = (float)width / (float)height;
glOrtho(-aspect, aspect, -1, 1, -1, 1);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

更新:解释发生了什么

OpenGL 是一个状态机,在 OpenGL-2.1 及以下版本中维护一组变换矩阵。顶点 ↑v 首先与 modelview 矩阵相乘,生成眼睛坐标顶点 ↑v',用于照明计算。然后将↑v'乘以投影矩阵,得到所谓的剪辑空间↑v'',在哪里(顾名思义)执行裁剪操作(或者至少定义了它们的结果)。在剪辑空间中,通过计算 ↑v#{x,y,z,w} = ↑v标准化设备坐标 (NDC)强>{x,y,z,w}/↑v_w

↑v# 被定义在 [-1 … 1] 范围内,该范围被映射以填充选定的视口(viewport)矩形。视口(viewport)不影响变换矩阵!它只是从 NDC 到它定义的窗口坐标的转换。

在上面的代码中,我将模型 View 矩阵设置为恒等,即顶点按原样进入投影。投影本身是一个正交投影,映射 x 值范围 [-aspect … aspect] → [-1 … 1] 和 y 值范围 [-1 … 1] → [-1 … 1](即 y 没有变化) )。因此,顶点会根据窗口方面进行转换,以适应 NDC 到视口(viewport)的值范围。

为什么我告诉你 OpenGL 是一个状态机?因为这意味着您可以随时切换投影和变换。因此,如果您需要渲染小 map ,无需费力地将其放置在 3D 场景中。只需切换视口(viewport)和投影即可。一般来说,您应该在绘图函数中设置所有渲染状态(即所有矩阵)。窗口事件处理程序(重绘处理程序除外)不应执行任何 OpenGL 操作。

关于OpenGL 拉伸(stretch)形状 - 纵横比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9071814/

相关文章:

c# - 我如何在 XNA 中找到旋转变换的 2D 坐标?

c# - 获取显示器的纵横比

android - Android 的纵横比等效?

java - 如何使 JFreeChart 保持纵横比?

python - 我应该使用哪个 OpenGL 基元来绘制三角剖分?

c++ - FBX节点变换计算

map - 如何通过一些图像/电影帧创建房间的 2D map ?

python - 当我运行 pygame 时,它​​不会加载我的游戏?

java - gluProject 将 3D 坐标转换为 2D 坐标不会正确转换 2D Y 坐标

c++ - 在 SDL2 中使用 glew