我怎么能改变opengl起始坐标

时间:2017-06-10 08:55:22

标签: qt opengl

我想知道glOrtho是如何工作的。我总是有(0,0)点(w / 2,h / 2)意味着它是我的opengl小部件的中心,但是我用glOrtho改变了这个行为:

void Widget::initializeGL() {
    glClearColor(0.1, 0.1, 0.1, 0);
}

void Widget::paintGL() {
    glClear(GL_COLOR_BUFFER_BIT);
    glLoadIdentity();
    glColor3f(1, 0, 0);
    glBegin(GL_QUADS);
        glVertex2f(0.0, 0.0);
        glVertex2f(1.0, 1.0);
        glVertex2f(0.5, 0.5);
        glVertex2f(0.2, 0.7);
    glEnd();
}

void Widget::resizeGL(int w, int h) {
    glViewport(0, 0, (GLsizei) w, (GLsizei) h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0.0, (GLdouble) w, (GLdouble) h, 0.0, 0.0, 0.0);
}

所以我总是得到相同的照片enter image description here

我希望坐标从左下角或左上角开始,但不是从中心开始。

2 个答案:

答案 0 :(得分:2)

在设置投影矩阵后,您不能将矩阵模式重置为模型视图。因此,glLoadIdentity()中对paintGL()的调用将重置您已设置的任何投影矩阵。

void Widget::resizeGL(int w, int h) {
    ...
    glMatrixMode(GL_MODELVIEW);
}

请记住,这会绘制小于像素大的内容。所以你可能也想改变你的几何形状。

顺便说一下,如果你刚刚开始,我建议不要学习弃用的OpenGL矩阵堆栈或glVertex2f。第一眼看上去可能更容易,但从长远来看,你会碰壁。

答案 1 :(得分:0)

  

我试图弄清楚glOrtho是如何工作的。我一直有(0,0)   指向(w / 2,h / 2)意味着它是我的opengl小部件的中心,但是我   用glOrtho改变了这种行为:

glOrtho(0.0, (GLdouble) w, (GLdouble) h, 0.0, 0.0, 0.0);

不,您没有使用glOrtho更改任何内容 - 您根本没有使用glOrtho。您的glOrtho来电只会产生GL_INVALID_VALUE错误并且其他,因为用near == far来调用它是无效的。因此,您使用单位矩阵作为投影,这意味着(0,0)是屏幕的中心,(1,1)是右上角,依此类推。

因此,即使您修改了代码以不使用identy矩阵覆盖投影矩阵,正如@Nico Schertler所建议的那样,它不会改变事物。

我还推荐了舍特勒先生的建议:不要使用这个旧垃圾。固定功能管道已被弃用近十年,立即模式(glBegin/glEnd)已经过时,因为 20年