【问题标题】:OpenGl and QT coordinatesOpenGL 和 QT 坐标
【发布时间】:2018-06-11 20:45:05
【问题描述】:

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

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

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

当我尝试在 qt(使用小部件提升)时这样做,这些数字不正确。

但如果我使用的是:

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

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

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

【问题讨论】:

    标签: c++ qt opengl coordinate-transformation


    【解决方案1】:

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


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

    但是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 将“撤消”这些更改。

    glMatrixMode(GL_PROJECTION);
    glPushMatrix();
    glOrtho(0,500,0,500,-1,1);
    
    // do the rendering here
    
    glPopMatrix();
    

    【讨论】:

    • 好的谢谢,它有帮助,但由于某种原因我有某种限制。我使用了您的代码,例如 glOrtho(0,1000,0,1000,-1,1),当我尝试在 qt 上画线时,它现在可以工作,但直到大约(700,700)。即使窗口最大化,我也无法从一个边缘画一条线到另一个边缘......
    • 渲染前是否设置了glViewport
    • 现在我做到了,它工作了 :) 谢谢,你能告诉我为什么在一个标准的 c++ 项目中我不应该这样做,现在我有了吗?
    • @asafanter 在标准应用程序中,视口被初始化为 OpenGL 窗口的大小。如果您调整窗口大小,您也必须设置(调整大小)它。在 Qt 中,事情更加动态和灵活。您必须调整视口以适应您的视图(小部件)。
    猜你喜欢
    • 2016-01-10
    • 1970-01-01
    • 2011-11-21
    • 1970-01-01
    • 1970-01-01
    • 2013-04-30
    • 2013-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多