这次教程中,我们将添加一个三角形和一个四边形。或许你认为这很简单,但要知道任何复杂的绘图都是从简单开始的,或者说任何复杂的模型都是可以分解成简单的图形的。所以,我们还是从简单的图形开始吧。
读完这一次教程,你还会学到如何在空间放置模型以及了解OpenGL中坐标变化。
程序运行时效果如下:
下面进入教程:
我们将使用GL_TRIANGLES来创建一个三角形,GL_QUADS来创建一个四边形。在第01课代码的基础上,我们只需在paintGL()函数中增加代码。
下面我将重写整个paintGL()函数,具体代码如下:
1 void MyGLWidget::paintGL() //从这里开始进行所以的绘制
2 {
3 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除屏幕和深度缓存
4 glLoadIdentity(); //重置当前的模型观察矩阵
5
6 glTranslatef(-1.5f, 0.0f, -6.0f); //左移1.5单位,并移入屏幕6.0单位
7 glBegin(GL_TRIANGLES); //开始绘制三角形
8 glVertex3f(0.0f, 1.0f, 0.0f); //上顶点
9 glVertex3f(-1.0f, -1.0f, 0.0f); //左下
10 glVertex3f(1.0f, -1.0f, 0.0f); //右下
11 glEnd(); //三角形绘制结束
12
13 glTranslatef(3.0f, 0.0f, 0.0f); //右移3.0单位
14 glBegin(GL_QUADS); //开始绘制四边形
15 glVertex3f(-1.0f, 1.0f, 0.0f); //左上
16 glVertex3f(1.0f, 1.0f, 0.0f); //右上
17 glVertex3f(1.0f, -1.0f, 0.0f); //左下
18 glVertex3f(-1.0f, -1.0f, 0.0f); //右下
19 glEnd(); //四边形绘制结束
20 }
当调用了glLoadIdentity()之后,我们实际上将当前点移到了屏幕中心,x轴从左到右,y轴从下到上,z轴从里到外。其中,中心右面,上面,外面的坐标值为正值。glTranslatef(x, y, z)沿着x,y和z轴移动,要注意,在glTranslatef(x, y, z)移动的时候,并不是相对屏幕中心移动,而是相对于当前所在的屏幕位置。
glBegin(GL_TRIANGLES)的意思是开始绘制三角形,glEnd()告诉OpenGL三角形已经创建好了。通常我们会需要画3个顶点,可以使用GL_TRIANGLES;而要画4个顶点时,使用GL_QUADS会更方便。最后,如果想要画更多的顶点时,可以使用GL_POLYGON。
本节的简单示例中,我们只画了一个三角形。如果要画第二个三角形的话,可以在这三点之后,再加三行代码(3点)。所以6点代码都应该包含在glBegin(GL_TRIANGLES)和glEnd()之间,这样不会出现多余的线,这是由于glBegin(GL_TRIANGLES)和glEnd()之间的点都是以3点为一个集合的。这同样适用于四边形。另一方面,多边形可以由任意个顶点组成,绘制多边形时不在乎glBegin(GL_POLYGON)和glEnd()之间或多少行代码。
glBegin()之后的第一行设置了多边形的第一个顶点,glVertex的三个参数依次是x,y和z轴坐标。glEnd()告诉OpenGL没有其他点了,这样将显示一个填充的三角形。
然后类比画出一个四边形后,就可以运行程序看效果了!