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();
正如我在许多教程中看到的那样,我没有在这里写 glOrtho
和 glMatrixMode
那么为什么在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();
当我在非 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();
正如我在许多教程中看到的那样,我没有在这里写 glOrtho
和 glMatrixMode
那么为什么在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();