OpenGL教室模型

发布时间:2011-12-19 20:20:48   来源:文档文库   
字号:

3D编程技术实验报告

题目 OpenGL教室模型

学 院: 软件学院

姓 名:

学 号:

专 业:

年 级:

指导教师: 职 称: _ _

二0 一 一 11

1. 实验目的 …………………………………………..3

2. 实验题目与相关说明……………………………….3

3. 模型简介…………………………………………….3

3.1………………………………………3

3.2………………………………………4

3.3……………………………………..4

3.4………………………………………4

4. 项目开发过程……………………………………...5

4.1………………………………………..5

4.2………………………………………..5

4.3………………………………………..6

4.4………………………………………..7

5. 项目总结…………………………………………….10

6.致谢…………………………………………………..10

一、 实验目的

1、加深对讲授内容的理解

2、通过设计,熟练上机调试程序

3、C及C++语言综合程序设计能力的提高

二、实验题目与相关说明

题目:利用OpenGL所学知识设计实现一个教室模型

要求:1、用OpenGl相关知识实现程序设计;

2、需用到OpenGL中的贴图技术。

模型简介

该模型主要由贴图构成,贴图来源是教室的照片。整个教室由天花板、地面、前墙壁、左右墙壁和几张桌子组成,其中天花板、地面、前墙壁、左右墙壁均为贴图,桌子是通过OpenGL相关函数实现。

1、 模型效果图

2、 开发平台:

OpenGL(全写Open Graphics Library定义了一个跨编程语言、跨平台的编程接口的规格,它用于三维图象(二维的亦可)。OpenGL是个专业的图形程序接口,是一个功能强大,调用方便的底层图形库。

3、 开发软件:

VS2005+photoshop利用VS2005可以编缉多种语言,比如,VBVJC#等,本次项目开发也是利用VS2005的强大功能编辑Opengl的。

Photoshop是一款功能十分强大的图形图片处理软件,本次用photoshop也是为处理素材的需要。

4、 开发思路

首先,在建教室模之前,我们一定要对教室的大体结构要了解,比如,前墙,左墙,右墙,后墙,还有天发板等等。前墙有黑板,投影仪等,左右墙有窗,室内有桌子等等。这些素材的获取可以自己到网上下载,也可以用自己的相机去拍摄。

我们建立5个平面,分别表示前墙,左墙,右墙,地板,还有天发板,然后再将处理好的图片导入到场景中,再向我们的教室用添加桌子,其它之类的。

四、项目开发过程

1、 开发准备:

1选择Visual Studio 2005作为学习OpenGL的环境。

2安装GLUT工具包:

1)下载glut库文件,把解压得到的glut.dllglut32.dll放到操作系统目录下面的system32文件夹内。(典型的位置为:C:\Windows\System32

2)把解压得到的glut.h放到Visual Studio 2005安装目录下面的“VC\PlatformSDK\include文件夹中。

3)把解压得到的glut.libglut32.lib放到静态函数库所在文件夹(如果是VisualStudio2005,则应该是其安装目录下面的“VC\lib”文件夹)。

3、新建一个工程

这里以VisualStudio2005为例。

选择File->New->Project,然后选择Win32 Console Application,选择一个名字,然后按OK。在谈出的对话框左边点Application Settings,找到Empty project(空项目)并勾上,选择Finish。然后向该工程添加一个代码文件,取名为“OpenGL.c”,注意用.c来作为文件结尾。搞定了,就跟平时的工程没什么两样的。

2开发步骤:

1、建立一个Win32工程

2、再向工和里面添加代码,以 .cpp的文件名

3、再向里面添加视图,类,变量

4、在视图里面有一个OnDraw()函数,在这个函数里面可以对场景全局进行整体定义。比如,对场景进行旋转的glRotatef()函数,平移的glTranslatef()函数,缩放的glScalef()函数,还有对场景进行背景色变换的glClearColor();函数,进行前景色变换的glColor()函数

5、在OnDraw()函数里面调用mydraw()函数,在mydraw()函数里面,我们就可以建立我们自己想建胡模,我们在场景里先建四个平面,以点连接的方式来建平面,此时我们要建立一个顶点数组,数组里面有四个顶点。比如,建左面墙的float m[4][3]={{-60,-10,-50}, {-60,30,-50},{-60,40,0}, {-60,-30,0}};

6、我们再向场景里面添加一些桌子,这样使得场景不会很空旷,此时我们依然使用顶点数组的方法来建桌子,因为这样可以方便以后的我们的贴图,比如建立桌子的顶点数组

float v[][3]={{-5,-1,5},{-5,1,5},

{5,1,5},{5,-1,5},

{5,-1,-5},{5,1,-5},

{-5,1,-5},{-5,-1,-5}};

7、然后呢,我们要对场景进行贴图,用

glTexCoord2f(0.0f,0.0f);glTexCoord2f(1.0f,0.0f); glTexCoord2f(1.0f,1.0f); glTexCoord2f(0.0f,1.0f);

可以对场景中的面进行贴图,不要,这个图有一定的要求,用photoshop进行处理,并保存为24位的bmp文件

8、 再要向场景中添加灯光,灯光是很重要的一部分,如果没有灯光,贴图也是没有多大意义的,因为,灯光的颜色会和物体的材质颜色进行叠加,产生不同的颜色。

GLfloat LightAmbientR[]= {1,1,1,1.0};// 环境光参数

GLfloat LightDiffuseR[]= {0.7,0.7,0.7,1.0};//漫射光参数

GLfloat LightPositionR[]={1,1,1,0.0};//光源位置

glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbientR); // 设置环境光

glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuseR); // 设置漫射光

glLightfv(GL_LIGHT1, GL_POSITION, LightPositionR);//设置光源位置

以上就是设置灯光的一些参数

这些设置好了之后,我们就可以进行调试编译了。

3相关解释:

1glutInit:对GLUT进行初始化

2glutInitDisplayMode:设置显示方式

3.glutInitWindowPosition:设置窗口在屏幕中的位置。

4glutInitWindowSize:设置窗口的大小。

5glutCreateWindow:根据前面设置的信息创建窗口。需要调用glutMainLoop才能看到窗口。

6glutDisplayFunc:设置一个函数(当需要进行画图时,这个函数就会被调用)

7glutMainLoop:进行一个消息循环。

8、 绘制基本几何图元的函数:glBegain()glEnd()glNormal*()glVertex*()

9矩阵入栈函数glPushMatrix(),矩阵出栈函数glPopMatrix()

9、 几何变换函数glTranslate*()glRotate*()glScale*()

10、 颜色、光照和材质的函数

设置颜色模式函数:glColor*()glIndex*()

设置光照效果的函数:glLight*() glLightModel*()

设置材质效果函数:glMaterial()

4、 部分核心代码:

glPushMatrix();//创建左面

/* glRotatef(-10,0,1,0);*/

CTexture1 texh1("zuo.bmp");

texh1.BitmapInit();

/*gluLookAt(0,0,2.0,0,0,.0,0,1,0);*/

float m[4][3]={{-60,-10,-50}, {-60,30,-50},

{-60,40,0}, {-60,-30,0}};

glBegin(GL_QUADS);

glTexCoord2f(0,0);

glVertex3fv(m[0]);

glTexCoord2f(1,0);

glVertex3fv(m[1]);

glTexCoord2f(1,1);

glVertex3fv(m[2]);

glTexCoord2f(0,1);

glVertex3fv(m[3]);

glEnd();

glPopMatrix();

//创建右边

glPushMatrix();

CTexture1 texh2("zuo.bmp");

texh2.BitmapInit();

float n[4][3]={{60,-10,-50},{60,-30,0},{60,40,0},{60,30,-50}};

glBegin(GL_QUADS);

glTexCoord2f(0,0);

glVertex3fv(n[0]);

glTexCoord2f(1,0);

glVertex3fv(n[1]);

glTexCoord2f(1,1);

glVertex3fv(n[2]);

glTexCoord2f(0,1);

glVertex3fv(n[3]);

glEnd();

//创建底面

glPushMatrix();

CTexture1 texh3("o.bmp");

texh3.BitmapInit();

float k[4][3]={{-60,-30,0},{60,-30,0}, {60,-10,-50}, {-60,-10,-50}};

glBegin(GL_QUADS);

glTexCoord2f(0,0);

glVertex3fv(k[0]);

glTexCoord2f(1,0);

glVertex3fv(k[1]);

glTexCoord2f(1,1);

glVertex3fv(k[2]);

glTexCoord2f(0,1);

glVertex3fv(k[3]);

glEnd();

//创建顶面

glPushMatrix();

CTexture1 texh4("ding.bmp");

texh4.BitmapInit();

float p[4][3]={{60,40,0},{-60,40,0},{-60,30,-50},{60,30,-50}};

glBegin(GL_QUADS);

glTexCoord2f(0,1);

glVertex3fv(p[0]);

glTexCoord2f(1,1);

glVertex3fv(p[1]);

glTexCoord2f(1,0);

glVertex3fv(p[2]);

glTexCoord2f(0,0);

glVertex3fv(p[3]);

glEnd();

//创建后面

glPushMatrix();

CTexture1 texh5("black0.bmp");

texh5.BitmapInit();

float q[4][3]={{-60,-10,-50},{60,-10,-50},{60,30,-50},{-60,30,-50}};

glBegin(GL_QUADS);

glTexCoord2f(0,0);

glVertex3fv(q[0]);

glTexCoord2f(1,0);

glVertex3fv(q[1]);

glTexCoord2f(1,1);

glVertex3fv(q[2]);

glTexCoord2f(0,1);

glVertex3fv(q[3]);

glEnd();

glPopMatrix();

glColor3f(0.3,0.3,0.3);

glTranslatef(20.0,-5.0,10.0);//后右桌

glScalef(2.5,2.5,2.5);

zhuozi();

glPopMatrix();

glPushMatrix();

glColor3f(0.3,0.3,0.3);

glTranslatef(-2.5,-5.0,10.0);//后中桌

glScalef(2.5,2.5,2.5);

zhuozi();

glPopMatrix();

glPushMatrix();

glColor3f(0.3,0.3,0.3);

glTranslatef(-25.0,-5.0,10.0);//后左桌

glScalef(2.5,2.5,2.5);

zhuozi();

glPopMatrix();

glColor3f(0.3,0.3,0.3);

glTranslatef(20.0,-5.0,35.0);//前右桌

glScalef(2.0,2.0,2.0);

zhuozi();

glPopMatrix();

glPushMatrix();

glColor3f(0.3,0.3,0.3);

glTranslatef(-0.0,-5.0,35.0);//前中桌

glScalef(2.0,2.0,2.0);

zhuozi();

glPopMatrix();

glPushMatrix();

glColor3f(0.3,0.3,0.3);

glTranslatef(-18.0,-5.0,35.0);//前左桌

glScalef(2.0,2.0,2.0);

zhuozi();

glPopMatrix();

五、项目总结

在场景建模时,有时对几何中心坐标不是很明确,所以在进行几何变换的时候常达不到想要的效果,还有就是贴图部分,常会出现贴图不均匀的现象,常有用黑色背景的贴图,可是黑色导进场景中时常去不掉,给图片存储了32位bmp含有alpha通道的图片,依然还有黑色。

本模型在设计和实现的过程中,除了用到上机期间所学的知识外,还借鉴了一些网络资源。在本模型的实现阶段,我和老师、同学也有过一些交流,并从中得到了很多的启发,在此一并感谢。

结果很重要,但从开发这个模型的过程中学习到新的知识更为重要。通过这次实训,我真的从中学习到了很多东西。我的模型还不是很完善,所以我将一直去完善它。

从这次做的这个小项目中,我学到的还是不少的,比如给场景中添加图片,灯光等。通过本次实验,我对OpenGL有了进一步的认识。其间开心过、郁闷过、无奈过、彷徨过……随着实验的胜利成功与实验报告的顺利完成,有点微微的自豪感使人难忘。感谢杨老师的高标准、严要求,感谢实验课上老师的耐心指点,也感谢我在实验中经历过的点点滴滴……伴随着学习的深入,我发现高深的东西还有很多很多,等待着我自己去挖掘。对于OPenGL,我会更加努力。

六、

此外,在本模型的实现阶段,我和老师以及其他同学有过多次讨论,从中得到了很多的启发。

在此一并感谢

日期:2011年12月6

本文来源:https://www.2haoxitong.net/k/doc/484c7abffd0a79563c1e7291.html

《OpenGL教室模型.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式