OpenGLut入门教程02:基本图形

系列教程索引:OpenGLut入门教程索引

上一篇:OpenGLut入门教程01:显示一个基本空白窗口

上一篇的空白界面相当于一个绘图板,我们需要显示什么就在什么画什么。

本文介绍如何在画布上绘制点、线、圆、三角形、四边形、三角函数。

首先函数基本的架构是:

flow

在main函数中glut*Func()的参数为回调函数,需要在main函数外独立实现。

重要的是四个回调函数:

  • initGL,初始化函数
  • reshapeGL,尺寸调整函数,当窗口的尺寸发生变化时调用此函数重新绘图
  • keyboard,捕获键盘输入并处理
  • displayGL,将想要显示的图像绘制出来的函数

其他函数说明见OpenGL函数功能说明系列

在使用之前先说明一下窗口坐标。现在的的显示屏幕越来越大,为了配合高分辨率,OpenGL窗口坐标设置如下。

窗口四个顶点为(-1,1)、(1,1)、(1,-1)、(-1,-1)

coord

超出-1/1的部分将不可见。如果需要超出-1/1的部分,就需要使用glTranslatef。

将窗口坐标极限约束后就不会出现不同窗口尺寸显示异常的问题。

1
2
3
4
glPointSize(5.0f);//点的大小
glBegin(GL_POINTS);
glVertex2f(0.5f, 0.5f);
glEnd();

设置点大小,点位置为(0.5f,0.5f)。

point

OpenGL名词解释中说过,OpenGL输入为点,OpenGL自动将点填充为片元(面),并上色,那么如何确定输入点是有效输入呢?以glBegin()开始,以glEnd()结束,在两个函数中间的是有效点,其他的不算。

线

1
2
3
4
5
6
7
8
glEnable(GL_LINE_STIPPLE);//启动虚线模式
glLineStipple(2, 0x0F0F); //0000111100001111
glLineWidth(10.0f);
glBegin(GL_LINES);
glVertex2f(0.0f, 0.0f);
glVertex2f(0.5f, 0.5f);
glEnd();
glDisable(GL_LINE_STIPPLE);//关闭虚线模式

线型为虚线,线宽为10,起点为(0,0)终点为(0.5,0.5)。绘图完成后取消线型。

line

圆绘图采用割圆术的方法。

绘制正多边形,多边形变数越多,越接近圆。

cut

1
2
3
4
glBegin(GL_POLYGON); //画正n边形
for (int i = 0; i<n; ++i)
glVertex2f(R*cos(2 * Pi / n*i), R*sin(2 * Pi / n*i));
glEnd();

Pi为圆周率,割圆术是用来求圆周率的,我们用割圆术和圆周率绘制圆。n是正多边形的边数,越大越接近圆(可自行测试)。

circle

代码中默认窗口大小为640x480,但是此图明显是正方形,如果窗口不是正方形,圆将变为椭圆。原因请理解坐标系。

三角形

1
2
3
4
5
glBegin(GL_TRIANGLES);
glVertex3f(-0.5,0,0);
glVertex3f(0,1,0);
glVertex3f(0.5,0,0);
glEnd();

按照顺序用线连接三个点,并在内部填充白色。

triangle

四边形

1
2
3
4
5
6
glBegin(GL_QUADS);
glVertex3f(-0.5,0.5,0);
glVertex3f(0.5,0.5,0);
glVertex3f(0.5,-0.5,0);
glVertex3f(-0.5,-0.5,0);
glEnd();

quad

窗口大小见圆部分。

五角星

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
GLfloat a = 1 / (2 - 2 * cos(72 * Pi / 180));
GLfloat bx = a * cos(18 * Pi / 180);
GLfloat by = a * sin(18 * Pi / 180);
GLfloat cy = -a * cos(18 * Pi / 180);
GLfloat
PointA[2] = { 0, a },
PointB[2] = { bx, by },
PointC[2] = { 0.5, cy },
PointD[2] = { -0.5, cy },
PointE[2] = { -bx, by };
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_LINE_LOOP);
glVertex2fv(PointA);
glVertex2fv(PointC);
glVertex2fv(PointE);
glVertex2fv(PointB);
glVertex2fv(PointD);
glEnd();

连接每个点

star

三角函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
GLfloat x;
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_LINES);
glVertex2f(-1.0f, 0.0f);// 画x轴
glVertex2f(1.0f, 0.0f);
glVertex2f(0.0f, -1.0f);// 画y轴
glVertex2f(0.0f, 1.0f);
glEnd();
glBegin(GL_LINE_STRIP);
for (x = -1.0f / factor; x<1.0f / factor; x += 0.01f)
{
glVertex2f(x*factor, sin(x)*factor);
}
glEnd();

factor是放大因子。

sin

代码中是整合在一起的,按空格键就可以切换。

组合图形

上面文章介绍了如何在窗口中绘制图像,但是因为其坐标系问题,一次只能绘制一个图像。

本部分介绍如何在窗口中绘制多个基本对象。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
glTranslatef(-1.5f,0.0f,-6.0f);//平移三角形位置
//此部分是绘制图像
glBegin(GL_TRIANGLES);//绘制开始
//绘制格式为x,y,z
glVertex3f(0.0f, 1.0f, 0.0f); //点A 上顶点
glVertex3f(-1.0f, -1.0f, 0.0f); //点B 右下角
glVertex3f(1.0f, -1.0f, 0.0f); //点C 左下角
glEnd();//绘制结束

glTranslatef(3.0f,0.0f,-1.0f);//在三角形位置的基础上向右平移
glBegin(GL_QUADS);//开始绘制
glVertex3f(-1.0f, 1.0f, 0.0f); // 左上
glVertex3f(1.0f, 1.0f, 0.0f); // 右上
glVertex3f(1.0f, -1.0f, 0.0f); // 右下
glVertex3f(-1.0f, -1.0f, 0.0f); // 左下
glEnd();//正方形绘制结束

先将绘图位置移至左侧(-1.5f,0.0f),在此处绘制一个三角形;在三角形位置的基础上,向右移(3.0f,0.0f),绘制一个正方形。

效果为:

result

完整源码在OpenGL_Freshman下的OpenGLut的02.triangle中。

下一篇:OpenGLut入门教程03:彩色多边形


OpenGLut入门教程02:基本图形
https://feater.top/openglut/basic-opengl-elements/
作者
JackeyLea
发布于
2020年11月15日
许可协议