一、前置知识
通过上一节的学习:OPenGL笔记–创建一个OPenGL窗口,我们已经知道了怎么创建一个OPenGL窗口了,接下来学习如果在OPenGL窗口中绘制多边形。
首先我们先了解一下OPenGL中的坐标系:

- OPenGL中的坐标系如上图所示,X坐标轴从左至右、Y坐标轴从下至上、Z坐标轴从里至外;
- OPenGL屏幕中心的坐标值是X和Y轴上的0.0点,一般调用
glLoadIdentity()就会将当前点移到屏幕中心; - 使用
glTranslatef(x, y, z)沿着X,Y和Z轴移动,并不是相对于屏幕中心移动,而是相对于当前所在的屏幕位置移动; - 使用
GL_TRIANGLES参数绘制三角形、GL_QUADS参数绘制正方形、GL_POLYGON参数绘制多边形;
视点转换
OpenGL窗口可以理解为模拟我们的眼镜看到的事物,所以你看的位置,看的角度都是可以自己设置的,通过如下函数:
void gluLookAt(
GLdouble eyex, GLdouble eyey, GLdouble eyez, //脑袋的位置,眼睛(相机)在世界坐标系中的位置
GLdouble centerx, GLdouble centery, GLdouble centerz, //眼睛看的物体的位置
GLdouble upx, GLdouble upy, GLdouble upz //头顶朝向的方向,(1.0, 0.0, 0.0)代表头顶朝向X轴正半轴,(-1.0, 0.0, 0.0)代表头顶朝向X轴负半轴,依此类推
)
如果没有设置,默认为glutLootAt(
0, 0, 0,
0, 0, -n,
0, 1,0
)
默认参数表示:眼睛处于原点(0, 0, 0),看向Z轴负半轴方向,头顶朝向Y轴正半轴,如下图所示:

所以为什么我们直接在X-Y平面上或者Z轴正半轴上绘图,绘制的图形看不到,因为默认视点设置在原点,看向Z轴负半轴;
要么设置视点;要么平移坐标系,往Z轴负半轴推;这样绘图就可以看到了
OPenGL中绘图:使用glBegin和glEnd两个函数进行所要绘制图形的描述,绘制的内容要放在这两个函数之间;
glBegin(GLenum mode);
//给出数据点
glEnd();
其中mode表示你所要绘制的是什么?是画点?还是画线?还是画面?mode的可选项有如下:
- GL_POINTS 画离散的点
- GL_LINES 画线(每两个点连成一条线)
- GL_LINE_STRIP 画线(所有点相互相连,首尾不相连)
- GL_LINE_LOOP 画线(所有点相互相连,首尾相连)
- GL_POLYGON 填充面(将所有点围成的面进行填充)
- GL_QUADS 填充面(将每四个点围成的面进行填充,相邻点之间不填充)
- GL_QUAD_STRIP 填充面(每两个点构成一条线,每两个线构成一个四边形)
- GL_TRIANGLES 填充三角形(将每三个点围成的三角形进行填充,相邻的点之间不填充)
- GL_TRIANGLE_STRIP 填充三角形(将每三个点围成的三角形进行填充,相邻的点之间填充)
- GL_TRIANGLE_FAN 填充三角形(以第一个点为顶点,之后每两个点合起来围成的三角形进行填充,相邻的点之间填充)

二、运行效果

三、关键代码
完整代码可参考上一节:OPenGL笔记–创建一个OPenGL窗口
void GL_Test::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除屏幕和深度缓存
glLoadIdentity(); //重置当前的模型观察矩阵
glTranslatef(-1.5, 0.0, -6.0);
//开始绘制三角形
//-----------------------------------------
glBegin(GL_TRIANGLES); //开始绘制三角形
glVertex3f(0.0, 1.0, 0.0); //上顶点
glVertex3f(-1.0, -1.0, 0.0); //左下顶点
glVertex3f(1.0, -1.0, 0.0); //右下顶点
glEnd(); //告诉OPenGL三角形已经创建好了
//-----------------------------------------
//绘制三角形结束
//开始绘制正方形
//-----------------------------------------
glTranslatef(3.0, 0.0, 0.0);
glBegin(GL_QUADS); //开始绘制正方形
glVertex3f(-1.0, 1.0, 0.0); //左上顶点
glVertex3f(1.0, 1.0, 0.0); //右上顶点
glVertex3f(1.0, -1.0, 0.0); //右下顶点
glVertex3f(-1.0, -1.0, 0.0); //左下顶点
glEnd(); //告诉OPenGL正方形已经创建好了
//-----------------------------------------
//绘制正方形结束
}
- 使用
glLoadIdentity()之后,当前点就移动到了屏幕中心; - 使用
glTranslatef(-1.5, 0.0, -6.0),X轴左移了1.5个单位,Y轴不动,Z轴内移6.0个单位 - 使用
glBegin(GL_TRIANGLES)标志着开始绘制三角形、使用glEnd()标志着绘制结束; - 绘制三角形,开始-结束内部可以放置三个坐标点;
- 绘制正方形,开始-结束内部可以放置四个坐标点;
- 绘制多边形(GL_POLYGON),不在乎开始-结束内部有多少个点;
- 使用
glVertex3f(x, y, z)提供坐标点,内部的x、y和z是相对于当前点的偏移点; - 顺时针绘制的正方形意味着我们所看见的,是四边形的背面;
本文介绍了如何在OpenGL环境中绘制多边形,包括三角形和正方形。首先讲解了OpenGL坐标系,然后阐述了视点转换的重要函数gluLookAt,以及如何通过glTranslatef改变坐标系位置。接着,详细说明了使用glBegin和glEnd定义图形,以及各种绘制模式如GL_TRIANGLES和GL_QUADS的用法。最后,给出了绘制三角形和正方形的示例代码,演示了如何实际操作这些概念。
2206

被折叠的 条评论
为什么被折叠?



