OpenGl 和 QT 坐标

OpenGl and QT coordinates

当我在非 qt 项目中使用 OpenGL 并且我喜欢画一条线时,我正在使用此代码:

glMatrixMode(GL_PROJECTION);
glOrtho(0,500,0,500,-1,1);

glBegin(GL_LINES);
   glVertex(50, 50);
   glVertex2i(200,200);
glEnd();

当我尝试在 qt 上执行此操作(使用 widget promote)时,这些数字不正确。

但如果我使用:

glBegin(GL_LINES);
   glVertex2f(-0.5, 0.5);
   glVertex2f(1, 1);
glEnd();

正如我在许多教程中看到的那样,我没有在这里写 glOrthoglMatrixMode

那么为什么在windows或linux中坐标与qt不同,如何正确使用它?

首先请注意,使用 glBegin/glEnd 序列的 OpenGL 矩阵堆栈和绘图已弃用 10 多年。 阅读 Fixed Function Pipeline and see Vertex Specification 了解最先进的渲染方式。


glOrtho 设置正交投影矩阵。投影矩阵描述了从场景视图的 3D 点到视口上的 2D 点的映射。
在正交投影中,视图 space 中的坐标线性映射到剪辑 space 坐标,剪辑 space 坐标等于归一化设备坐标,因为 w 分量是1(对于笛卡尔输入坐标)。
left、right、bottom、top、near 和 far 的值定义了一个框。盒子体积内的所有几何体在视口上都是 "visible"。

但是glOrhto将mtrix堆栈上的当前矩阵与新的正交投影矩阵相乘。

这意味着如果你这样做

glMatrixMode(GL_PROJECTION);
glOrtho(0,500,0,500,-1,1);

在每一帧中,投影矩阵都会连续递增变化

要将矩阵设置为矩阵堆栈,必须先使用单位矩阵初始化矩阵堆栈:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0,500,0,500,-1,1);


另一种可能性是在重新生成的开始和结束时使用 glPushMatrix and glPopMatrix。换矩阵前推,渲染后弹出
由于 glOrtho 更改了矩阵堆栈中最顶层的矩阵,因此 glPopMtrix 将 "undo" 进行更改。

glMatrixMode(GL_PROJECTION);
glPushMatrix();
glOrtho(0,500,0,500,-1,1);

// do the rendering here

glPopMatrix();