OpenGLut开发入门系列教程6:3D化图像

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

上一篇:OpenGLut开发入门系列教程5:图像旋转

上一篇介绍了如何让二维图片旋转,本篇介绍立体的二维图像(三角形立体后就是金字塔,矩形立体后是箱形立方体)。

对于OpenGL来说,二维图像是忽略了z轴的三维图形,立体图形就是将z轴赋给它。

首先函数基本的架构是:

flow

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

重要的是四个回调函数:

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

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

金字塔

以金字塔为例(比矩形立方体难一点),有四个顶点、四个面,每个面由三个点组成。

下图为示意图,每个点在坐标轴上面的垂直投影为1:

pyramid

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
glRotatef(rtri,0.0f,1.0f,0.0f);//绕y轴旋转
glBegin(GL_TRIANGLES);//绘制开始 绘制格式为x,y,z
//前面
glColor3f(1.0f,0.0f,0.0f);//红色
glVertex3f(0.0f, 1.0f, 0.0f); //点A 上顶点
glColor3f(0.0f,1.0f,0.0f);//绿色
glVertex3f(-1.0f, -1.0f, 1.0f); //点B 右下角
glColor3f(0.0f,0.0f,1.0f);//蓝色
glVertex3f(1.0f, -1.0f, 1.0f); //点C 左下角

//右面
glColor3f(1.0f,0.0f,0.0f);//红色
glVertex3f(0.0f,1.0f,0.0f);//顶点
glColor3f(0.0f,0.0f,1.0f);//蓝色
glVertex3f(1.0f,-1.0f,1.0f);//左下角
glColor3f(0.0f,1.0f,0.0f);//绿色
glVertex3f(1.0f,-1.0f,-1.0f);//右下角

//后面
glColor3f(1.0f,0.0f,0.0f);//红色
glVertex3f(0.0f,1.0f,0.0f);//顶点
glColor3f(0.0f,1.0f,0.0f);//绿色
glVertex3f(1.0f,-1.0f,-1.0f);//左下角
glColor3f(0.0f,0.0f,1.0f);//蓝色
glVertex3f(-1.0f,-1.0f,-1.0f);//右下角

//左面
glColor3f(1.0f,0.0f,0.0f);//红色
glVertex3f(0.0f,1.0f,0.0f);//顶点
glColor3f(0.0f,0.0f,1.0f);//蓝色
glVertex3f(-1.0f,-1.0f,-1.0f);//左下角
glColor3f(0.0f,1.0f,0.0f);//绿色
glVertex3f(-1.0f,-1.0f,1.0f);//右下角
glEnd();//绘制结束

四个表面,每个表面有四个顶点,每个顶点设置不同颜色。

测试效果为:

rotate

宇宙魔方

四边形立体化为立方体,有六个面,每个面有四个顶点,每个面设置不同颜色。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
glRotatef(rquad,1.0f,0.0f,0.0f);//绕x轴旋转

//设置为蓝色,在glBegin之前设置则对glBegin内的所有点有效,负责只对当前点有效
glBegin(GL_QUADS);//开始绘制
//顶面
glColor3f(0.0f,1.0f,0.0f); // 蓝色
glVertex3f( 1.0f, 1.0f,-1.0f); // 右上角
glVertex3f(-1.0f, 1.0f,-1.0f); // 左上角
glVertex3f(-1.0f, 1.0f, 1.0f); // 左下角
glVertex3f( 1.0f, 1.0f, 1.0f); // 右下角

//地面
glColor3f(1.0f,0.5f,0.0f); // 橙色
glVertex3f( 1.0f,-1.0f, 1.0f); // 右上角
glVertex3f(-1.0f,-1.0f, 1.0f); // 左上角
glVertex3f(-1.0f,-1.0f,-1.0f); // 左下角
glVertex3f( 1.0f,-1.0f,-1.0f); // 右下角

//前面
glColor3f(1.0f,0.0f,0.0f); // 红色
glVertex3f( 1.0f, 1.0f, 1.0f); // 右上角
glVertex3f(-1.0f, 1.0f, 1.0f); // 左上角
glVertex3f(-1.0f,-1.0f, 1.0f); // 左下角
glVertex3f( 1.0f,-1.0f, 1.0f); // 右下角

// 后面
glColor3f(1.0f,1.0f,0.0f); // 黄色
glVertex3f( 1.0f,-1.0f,-1.0f); // 右上角
glVertex3f(-1.0f,-1.0f,-1.0f); // 左上角
glVertex3f(-1.0f, 1.0f,-1.0f); // 左下角
glVertex3f( 1.0f, 1.0f,-1.0f); // 右下角

// 左面
glColor3f(0.0f,0.0f,1.0f); // 蓝色
glVertex3f(-1.0f, 1.0f, 1.0f); // 右上角
glVertex3f(-1.0f, 1.0f,-1.0f); // 左上角
glVertex3f(-1.0f,-1.0f,-1.0f); // 左下角
glVertex3f(-1.0f,-1.0f, 1.0f); // 右下角

// 右面
glColor3f(1.0f,0.0f,1.0f); // 紫色
glVertex3f( 1.0f, 1.0f,-1.0f); // 右上角
glVertex3f( 1.0f, 1.0f, 1.0f); // 左上角
glVertex3f( 1.0f,-1.0f, 1.0f); // 左下角
glVertex3f( 1.0f,-1.0f,-1.0f); // 右下角
glEnd();//正方形绘制结束

测试效果为:

cube

共存

将金字塔和立方体显示在同一个窗口中。

操作和将三角形四边形放于同一窗口类似。

效果为:

both

完整源码在OpenGL_Freshman下的OpenGLut的6中。

下一篇:OpenGLut开发入门系列教程7:纹理贴图