文章目录

一、完整代码

#include <GL/glut.h>

void init() {
glClearColor(1.0, 1.0, 1.0, 0.0); //设置显示窗口背景为白色

glMatrixMode(GL_PROJECTION); //设置投影模式
glLoadIdentity();
gluOrtho2D(0.0, 500.0, 0.0, 500.0); //设置观察参数
};

//画线函数
void lineSegment() {
glClear(GL_COLOR_BUFFER_BIT); //清除颜色缓存,使用glClearColor设置的值

glColor3f(1.0, 0.0, 0.0); //使用浮点数设置对象颜色
glBegin(GL_LINES); //开始绘制线段
glVertex2i(100, 100); //设置线段的点
glVertex2i(200, 200);
glEnd(); //结束绘制线段

glFlush();
}

//画三角形函数
void TrianglesSegment() {
glClear(GL_COLOR_BUFFER_BIT);

glBegin(GL_TRIANGLES);
glColor3f(1.0, 0.0, 0.0);
glVertex2i(0, 100); //设置三角形的顶点
glVertex2i(50, 200);
glVertex2i(100, 100);

glColor3f(0.0, 1.0, 0.0);
glVertex2i(200, 100); //设置三角形的顶点
glVertex2i(250, 200);
glVertex2i(300, 100);

glColor3f(0.0, 0.0, 1.0);
glVertex2i(400, 100); //设置三角形的顶点
glVertex2i(450, 200);
glVertex2i(500, 100);
glEnd();

glFlush();
}

//画正方形函数
void QuansSegment() {
glClear(GL_COLOR_BUFFER_BIT);

glBegin(GL_QUAD_STRIP);
glColor3f(1.0, 0.0, 0.0);
glVertex2i(0, 100); //设置三角形的顶点
glVertex2i(100, 100);
glVertex2i(100, 200);
glVertex2i(0, 200);

glColor3f(0.0, 1.0, 0.0);
glVertex2i(200, 100); //设置三角形的顶点
glVertex2i(300, 100);
glVertex2i(300, 200);
glVertex2i(200, 200);

glColor3f(0.0, 0.0, 1.0);
glVertex2i(400, 100); //设置三角形的顶点
glVertex2i(500, 100);
glVertex2i(500, 200);
glVertex2i(400, 200);
glEnd();

glFlush();
}

//画多边形函数
void PolygonSegment() {
glClear(GL_COLOR_BUFFER_BIT);

glBegin(GL_POLYGON);
glColor3f(1.0, 0.0, 0.0);
glVertex2i(200, 400);
glVertex2i(100, 300);
glVertex2i(100, 200);
glVertex2i(200, 100);
glVertex2i(300, 100);
glVertex2i(400, 200);
glVertex2i(400, 300);
glVertex2i(300, 400);
glEnd();

glFlush();
}

int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(500, 500);
glutInitWindowPosition(100, 100);
glutCreateWindow("An Example OpenGL Program");

init();
glutDisplayFunc(PolygonSegment);
glutMainLoop();

return 0;
}

二、OpenGL画点函数

要描述一个点的几何要素,我们只需在世界坐标系中指定一个位置。然后该坐标位置和场景中已有的其他几何描述一起被传递给观察子程序,除非指定其他属性值,OpenGL图元按默认的大小和颜色来显示。

默认的图元颜色是白色,而默认的点大小等于单一屏幕像素大小;

2.1、GL_POINTS

glBegin(GL_POINTS);
glVertex*();
elEnd();

OpenGL绘制图形的代码段形如上述代码,glBegin表示开始绘制,参数表示绘制的类型;glEnd表示结束绘制;中间的代码提供绘制图形的特征点;

OpenGL中的glVertex函数可用于描述任意一点的位置,上述代码的星号(*)表示该函数要有后缀码,这些后缀码用来指明空间维数、坐标值变量的数据类型和可能的向量形式坐标描述:
1、glVertex的后缀为2、3、4表示其坐标位置的维数;

OpenGL将二维作为三维的特殊情况来处理,任意(x, y)坐标描述等同于三维坐标(x, y, 0);OpenGL在内部使用四维坐标表示顶点,因此上面的描述等同于四维坐标(x, y, 0, 1);

2、glVertex的后缀 i(整数)、s(短整数)、f(浮点数)、d(双精度浮点数)表示在坐标的数值描述使用什么数据结构;

3、glVertex的后缀 v(向量)表示使用矩阵形式的坐标位置;

例如:在斜率为2的直线上绘出三个等距离的点(参见图4.3)

计算机图形学5--绘制基本图元_凸多边形


坐标用整数对给出:

glBegin(GL_POINTS)
glVertex2i(50,100);
glVertex2i(75,150);
glVertex2i(100,200);
glEnd()

坐标以矩阵形式描述;

int point1[] = {50,100};
int point2[] = {75,150};
int point3[] = {100,20};

glBegin(GL_POINTS)
glVertex2v(point1);
glVertex2v(point2);
glVertex2v(point3);
glEnd()

再举一个在三维世界坐标系中描述两个点的粒子,这里按显示浮点数方式给出坐标:

glBegin(GL_POINTS)
glVertex3f(-78.05, 909.72, 14.60);
glVertex3f(261.91, -5200.67, 188.33);
glEnd()

三、OpenGL画线函数

在OpenGL中,和选择一个点位置一样,使用​​glVertex​​函数选择单个端点的坐标位置。有三个符号常量可以用于指定如何把这一串端点位置连接成一组直线段。默认情况下,每一符号常量显示白色的实线;

3.1、GL_LINES

使用OpenGL的图元常量​​GL_LINES​​可连接每一对相邻端点而得到一组直线段。

通常,由于OpenGL仅在线段共享一个顶点时承认其相连;交叉但不共享顶点的线段则不被承认其相连,这会导致一组未连接的线段,除非某些坐标位置是重复的。

如果只描述了一个端点则什么也不会显示;如果列出的端点数为奇数则最后一个端点不被处理;
例如,我们有5个坐标位置,标成p1到p5,每一个用二维数组表示,则:

glBegin(GL_LINES)
glVertex2iv(p1);
glVertex2iv(p2);
glVertex2iv(p3);
glVertex2iv(p4);
glVertex2iv(p5);
glEnd();

这样,我们在第一和第二坐标位置之间得到一条直线段,并在第三和第四位置之间得到另一条直线段,此时,指定的端点数为奇数,因此最后一个坐标位置被忽略,如下图示;

计算机图形学5--绘制基本图元_计算机图形学_02


3.2 、GL_LINE_STRIP

使用OpenGL的图元常量​​GL_LINE_STRIP​​可以获得折线;

显示从第一个端点和最后一个端点之间一组首尾相连的线段。第一条线段在第一个端点和第二个端点之间显示;第二条线段在第二个端点和第三个端点之间显示;依次进行,直到最后一个端点;如果不列出至少两个坐标位置,则什么也不现实;

glBegin(GL_LINE_STRIP)
glVertex2iv(p1);
glVertex2iv(p2);
glVertex2iv(p3);
glVertex2iv(p4);
glVertex2iv(p5);
glEnd();

计算机图形学5--绘制基本图元_浮点数_03


3.3、GL_LINE_LOOP

使用OpenGL的图元常量​​GL_LINE_STRIP​​可以获得封闭折线;

主要的线段和使用GL_LINE_STRIP一样画出,但是增加了一条直线段,将最后一个端点与第一个端点相连接。

glBegin(GL_LINE_LOOP)
glVertex2iv(p1);
glVertex2iv(p2);
glVertex2iv(p3);
glVertex2iv(p4);
glVertex2iv(p5);
glEnd();

计算机图形学5--绘制基本图元_后缀_04


四、OpenGL画三角形函数

4.1、GL_TRIANGLES

使用OpenGL的图元常量​​GL_TRIANGLES​​可连接每三个相邻端点而得到一组三角形,顶点3n-2、3n-1和3n定义了第n个三角形,总共绘制N/3个三角形,顶点数据不足则舍弃;

glBegin(GL_TRIANGLES);
glColor3f(1.0, 0.0, 0.0);
glVertex2i(0, 100); //设置三角形的顶点
glVertex2i(50, 200);
glVertex2i(100, 100);

glColor3f(0.0, 1.0, 0.0);
glVertex2i(200, 100); //设置三角形的顶点
glVertex2i(250, 200);
glVertex2i(300, 100);

glColor3f(0.0, 0.0, 1.0);
glVertex2i(400, 100); //设置三角形的顶点
glVertex2i(450, 200);
glVertex2i(500, 100);
glEnd();

计算机图形学5--绘制基本图元_后缀_05


4.2、GL_TRIANGLE_STRIP

使用OpenGL的图元常量​​GL_TRIANGLE_STRIP​​绘制一组相连的三角形。对于奇数n,顶点n、n+1和n+2定义了第n个三角形;对于偶数n,顶点n+1、n和n+2定义了第n个三角形,总共绘制N-2个三角形,顶点数据不足则舍弃;

glBegin(GL_TRIANGLE_STRIP);
glColor3f(1.0, 0.0, 0.0);
glVertex2i(0, 100); //设置三角形的顶点
glVertex2i(50, 200);
glVertex2i(100, 100);

glColor3f(0.0, 1.0, 0.0);
glVertex2i(100, 100); //设置三角形的顶点
glVertex2i(150, 200);
glVertex2i(200, 100);

glColor3f(0.0, 0.0, 1.0);
glVertex2i(200, 100); //设置三角形的顶点
glVertex2i(250, 200);
glVertex2i(300, 100);
glEnd();

计算机图形学5--绘制基本图元_浮点数_06


4.3、GL_TRIANGLE_FAN

使用OpenGL图元常量​​GL_TRIANGLE_FAN​​绘制一组相连的三角形,三角形是由第一个顶点及其后给定的顶点确定,顶点1、n+1和n+2定义了第n个三角形,总共绘制N-2个三角形。

glBegin(GL_TRIANGLE_FAN);
glColor3f(1.0, 0.0, 0.0);
glVertex2i(0, 100); //设置三角形的顶点
glVertex2i(50, 200);
glVertex2i(100, 100);

glColor3f(0.0, 1.0, 0.0);
glVertex2i(200, 100); //设置三角形的顶点
glVertex2i(250, 200);
glVertex2i(300, 100);

glColor3f(0.0, 0.0, 1.0);
glVertex2i(400, 100); //设置三角形的顶点
glVertex2i(450, 200);
glVertex2i(500, 100);
glEnd();

计算机图形学5--绘制基本图元_后缀_07


五、OpenGL绘四边形函数

5.1、GL_QUADS

使用OpenGL常量​​GL_QUADS​​绘制由四个顶点组成的一组单独的四边形。顶点4n-3、4n-2、4n-1和4n定义了第n个四边形,总共绘制N/4个四边形。

glBegin(GL_QUADS);
glColor3f(1.0, 0.0, 0.0);
glVertex2i(0, 100); //设置三角形的顶点
glVertex2i(100, 100);
glVertex2i(100, 200);
glVertex2i(0, 200);

glColor3f(0.0, 1.0, 0.0);
glVertex2i(200, 100); //设置三角形的顶点
glVertex2i(300, 100);
glVertex2i(300, 200);
glVertex2i(200, 200);

glColor3f(0.0, 0.0, 1.0);
glVertex2i(400, 100); //设置三角形的顶点
glVertex2i(500, 100);
glVertex2i(500, 200);
glVertex2i(400, 200);
glEnd();

计算机图形学5--绘制基本图元_凸多边形_08


5.2、GL_QUAD_STRIP

使用OpenGL常量​​GL_QUAD_STRIP​​绘制一组相连的四边形。每个四边形是由一对顶点及其后给定的一对顶点共同确定。顶点2n-1、2n、2n+2和2n+1定义了第n个四边形,总共绘制N/2 - 1个四边形。

glBegin(GL_QUAD_STRIP);
glColor3f(1.0, 0.0, 0.0);
glVertex2i(0, 100); //设置三角形的顶点
glVertex2i(100, 100);
glVertex2i(100, 200);
glVertex2i(0, 200);

glColor3f(0.0, 1.0, 0.0);
glVertex2i(200, 100); //设置三角形的顶点
glVertex2i(300, 100);
glVertex2i(300, 200);
glVertex2i(200, 200);

glColor3f(0.0, 0.0, 1.0);
glVertex2i(400, 100); //设置三角形的顶点
glVertex2i(500, 100);
glVertex2i(500, 200);
glVertex2i(400, 200);
glEnd();

计算机图形学5--绘制基本图元_计算机图形学_09


六、OpenGL绘凸多边形函数

6.1、GL_POLYGON

使用OpenGL常量​​GL_POLYGON​​绘制一个凸多边形。顶点1到n定义了这个多边形。

glBegin(GL_POLYGON);
glColor3f(1.0, 0.0, 0.0);
glVertex2i(200, 400);
glVertex2i(100, 300);
glVertex2i(100, 200);
glVertex2i(200, 100);
glVertex2i(300, 100);
glVertex2i(400, 200);
glVertex2i(400, 300);
glVertex2i(300, 400);
glEnd();

计算机图形学5--绘制基本图元_计算机图形学_10


七、OpenGL曲线函数

生成圆和椭圆等基本曲线的函数并未作为图元功能包含在OpenGL核心库中。但该库包含了显示Bezier样条的功能,该曲线是由一组离散点定义的多项式。

OpenGL实用库(GLU)中包含有球面和柱面等三维曲面函数及生成有理B样条的函数,它是包含简化Bezier曲线的样条曲线的总集。我们可以使用有理B样条显示圆、椭圆和其它二维曲线。

此外,OpenGL使用工具包(GLUT)中还有可以用来显示某些三维曲面的函数(如球面、锥面和其它形体)。