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可以编缉多种语言,比如,VB,VJ,C#等,本次项目开发也是利用VS2005的强大功能编辑Opengl的。
Photoshop是一款功能十分强大的图形图片处理软件,本次用photoshop也是为处理素材的需要。
4、 开发思路:
首先,在建教室模型之前,我们一定要对教室的大体结构要了解,比如,前墙,左墙,右墙,后墙,还有天发板等等。前墙有黑板,投影仪等,左右墙有窗,室内有桌子等等。这些素材的获取可以自己到网上下载,也可以用自己的相机去拍摄。
我们建立5个平面,分别表示前墙,左墙,右墙,地板,还有天发板,然后再将处理好的图片导入到场景中,再向我们的教室用添加桌子,其它之类的。
四、项目开发过程
1、 开发准备:
1、选择Visual Studio 2005作为学习OpenGL的环境。
2、安装GLUT工具包:
(1)下载glut库文件,把解压得到的glut.dll和glut32.dll放到操作系统目录下面的system32文件夹内。(典型的位置为:C:\Windows\System32)。
(2)把解压得到的glut.h放到Visual Studio 2005安装目录下面的“VC\PlatformSDK\include文件夹中。
(3)把解压得到的glut.lib和glut32.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、相关解释:
1、glutInit:对GLUT进行初始化
2、glutInitDisplayMode:设置显示方式
3.、glutInitWindowPosition:设置窗口在屏幕中的位置。
4、glutInitWindowSize:设置窗口的大小。
5、glutCreateWindow:根据前面设置的信息创建窗口。需要调用glutMainLoop才能看到窗口。
6、glutDisplayFunc:设置一个函数(当需要进行画图时,这个函数就会被调用)
7、glutMainLoop:进行一个消息循环。
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
文档为doc格式