我想知道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);
}
我希望坐标从左下角或左上角开始,但不是从中心开始。
答案 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年。