gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 00:41:14 25 4
gpt4 key购买 nike

我得到的 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/

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