openGL构造教室

更新时间:2023-12-14 05:58:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

虚拟现实与数据可视化课程作业董元 22011207

基于openGL的虚拟教室

——虚拟现实与数据可视化课程作业

董元22011207 指导老师:孙立博老师 仪器科学与工程学院

2013年12月16日

1 / 40

虚拟现实与数据可视化课程作业董元 22011207

一、 作业要求

用openGL制作一个虚拟教室。要求视角可变化,教室里的物品不少于五件。

二、 完成情况

我的openGL虚拟教室完成情况如下:

1、 绘制出的教室里的基本物体:黑板、讲台、投影仪、空调、门窗、音响、九张桌子、

九张凳子等。虚拟教室整体看上去接近真实生活中的教室。

2、 添加了灯光和纹理效果:门窗以及空调均是用纹理贴出来的。使教室看起来更加生

动形象。

3、 为教室加上了可用键盘控制的动态效果:可控制灯光亮灭、投影仪收起放下、六块

黑板的上下滑动以及音响的开关。

4、 引用FMOD音乐引擎,为教室加上可控背景音效(即3中的音响开关)。 5、 在输出窗口添加操作提示信息,使界面更加人性化。

三、 成果演示

1、整体效果图

2 / 40

虚拟现实与数据可视化课程作业董元 22011207

2、改变视角效果

3 / 40

虚拟现实与数据可视化课程作业董元 22011207

3、开灯关灯对比效果图 未开灯时:

4 / 40

虚拟现实与数据可视化课程作业董元 22011207

开灯时:

4、 投影仪放下效果图:

5 / 40

虚拟现实与数据可视化课程作业董元 22011207

5、黑板移动效果图

6、局部细节效果图

6 / 40

虚拟现实与数据可视化课程作业董元 22011207

四、 内容介绍

下面我将从代码的角度简单介绍一下我的整个教室程序。

代码部分包括一个头文件(MyHeader.h)和一个cpp文件(main.cpp)。为了增加程序

7 / 40

虚拟现实与数据可视化课程作业董元 22011207

的可读性,我将相关的变量定义、函数声明等集中放置在头文件下面。在我的全部代码中,除了主函数外,共定义了19个子函数。如下图所示:

主程序部分和一般的openGL程序一样,完成初始化、窗口的绘制、显示回调函数和键盘以及一些特殊事件的响应。

主函数如下:

初始化部分由函数init()完成,而init中又调用了进行灯光初始化的函数initlight()以及进行纹理图像载入的LoadTexture1()、LoadTexture2()、LoadTexture3()。这主要是因为灯光初始化和载入纹理相关代码较多,这么做是为了使代码看上去更加层次分明

绘制教室的工作由回调函数display()完成。而所有子函数中与绘制教室相关的子函数还有DrawRoom()、DrawDesk()、DrawBlackboard()以及Drawotherthings();分别完成教室墙面、

8 / 40

虚拟现实与数据可视化课程作业董元 22011207

黑板、桌椅及其他物体的绘制。其中,整个教室空间有六个大矩形拼接而成;桌椅由梯形不一的长方体拼接而成。可以这样说,整个教室基本上都是由不同的立方体和矩形构成的。所以从这一点上来说,绘制教室并没有使用任何复杂的openGL内置函数。

响应按键主要是由OnKeyboard()和OnSpecial()完成的。OnSpecia()函数其实只是响应退出窗口的ECS键,为了从逻辑上区分这一事件与普通按键响应的不同,我把响应这一事件的代码放在了OnSpecia()函数下。而其他响应普通事件的代码则在OnKeyboard()下。而普通事件的响应程序,又调用到了函数InitFMOD(),(响应播放音乐),函数projector_dispaly1()、projector_dispaly2(),(响应投影仪的放下与收起,实质是在对窗口的重新绘制时改变投影仪的相关参数)。

五、 收获感想

1、对于任何一种编程语言或者是API,当我们在使用它们编程时,都首先要对其基本原理有一个最基本的认识。贸然地调用函数或是凭感觉去编程,往往会造成不可预知的错误。而且一旦错误发生,往往很难解决。在程序的编写过程中,最开始时对openGL了解甚少,在参考示例程序时移植他人的代码往往很难产生自己希望的效果,就是这个道理。而且,在编写整个程序的过程中,出现过一个我一直无法解决的问题:通过编译后程序运行一段时间自己会卡死。在请教了老师以后才知道,该问题出现的原因是我把载入纹理的代码放在了显示回调函数中,这样一来每一次重新绘制窗口,程序都会开辟新的内存用以储存相关信息。因此程序运行一段时间之后内存不足,便会报错。这个问题是我自己很难考虑到的,这也是让我认识到自己对程序的基本理解的不足,这方面需要进一步加强。

2、我觉得这次作业给我带来最大的收获就是它起到了一个抛砖引玉的效果。虚拟教室的创立不仅让我对openGL这个图像程序接口产生了很大的兴趣,也让我对虚拟现实技术产生了更多的期待。而且,在编写程序的过程中我又接触到一个有趣的音乐引擎FMOD。这些都让我觉得这门课程的学习妙趣横生。虽然我在这个作业上花费了很多时间,但是收获了很多乐趣。

3、在编写程序的过程中,我进一步意识到网络这个公开平台资源的强大。在自学的过程中,别人的经验给了我许多启发。网络上许多达人开放式的共享资源的态度值得我们学习。互联网的发展为打开了巨大的学习空间,而在未来的学习生活中,我想我也会秉承这样一种开源共享的态度,学习知识,并且传播知识。

六、 附录

(一) 参考书目

[1]Mason Woo Jakie Neider Tom Davis Dave Shreiner/著吴斌段海波薛凤舞/译《openGL编程权威指南》中国电力出版社

[2]网络资源:Nehe的中文openGL教程http://www.yakergong.net/nehe/ (二)代码 1、main.cpp

#include #include #include #include

9 / 40

虚拟现实与数据可视化课程作业董元 22011207

#include

#include\//相关变量和函数定义放入头文件中,增加程序可读性 #include\

// 音频库的头文件

// 把音频库加入到链接器中

#pragmacomment(lib, \) #pragmacomment(lib, \)

#pragmawarning(disable:4996) //强制忽略VS2012对于老版本一些函数不安全的警告 usingnamespace std; FSOUND_SAMPLE * handle1;

int main(intargc, char ** argv) { Eye.x = 0.0f;//f代表这个数据是GLfloat类型的常量 Eye.y = 0.0f; Eye.z = 18.0f;

glutInit(&argc,argv);//对glut进行初始化

glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);//指定 glutInitWindowSize(700,600);//窗口大小,以像素为单位窗 glutInitWindowPosition(650,100);//口左上角的屏幕位置 glutCreateWindow(argv[0]); init();//初始化

glutDisplayFunc(display);//显示回调函数 glutReshapeFunc(reshape); glutKeyboardFunc(OnKeyboard);

constGLubyte* test=glGetString(GL_EXTENSIONS); glutSpecialFunc(OnSpecial); glutIdleFunc(OnIdle); PrintInformation();

glutMainLoop();//调用来启动程序 return 0;

}

/***************函数名称:

LoadBitmap***************************************************************************函数作用:检查文件能否被正常打开,不能则返回一个空指针***************************/

AUX_RGBImageRec *LoadBitmap(char *Filename) { // 声明一个文件句柄用于打开文件 FILE *File=NULL;

// 文件名不能空

if (!Filename)

10 / 40

虚拟现实与数据可视化课程作业董元 22011207

}

{ }

// 以只读方式打开文件测试文件是否能够打开 File=fopen(Filename,\); // 文件是否存在 if (File) { }

// 文件装入失败,返回NULL returnNULL;

// 存在,则关闭文件 fclose(File);

// 装入测试过已存在的文件

returnauxDIBImageLoad(Filename);

returnNULL;

/***************函数名称:

LoadTexture1********************************************************* ****************函数作用:装入位图文件并作为纹理贴图********************************************/ int LoadTexture1() {

int Status=FALSE;

AUX_RGBImageRec *TextureImage=0; glGenTextures(1, &texture[0]); {

Status=TRUE;

glBindTexture(GL_TEXTURE_2D, texture[0]);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, TextureImage->sizeX, glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); if (TextureImage) {

if (TextureImage->data) { }

11 / 40

if (TextureImage=LoadBitmap(\))

TextureImage->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage->data);

// 释放资源

free (TextureImage->data);

虚拟现实与数据可视化课程作业董元 22011207

}

}

}

free(TextureImage);

return Status;

/***************函数名称:

LoadTexture2********************************************************* ****************函数作用:装入位图文件并作为纹理贴图********************************************/ int LoadTexture2() { }

/***************函数名称:

LoadTexture3********************************************************* ****************函数作用:装入位图文件并作为纹理贴图********************************************/ int LoadTexture3() {

int Status=FALSE;

12 / 40

int Status=FALSE;

AUX_RGBImageRec *TextureImage=0; glGenTextures(2, &texture[1]); { }

return Status;

Status=TRUE;

if (TextureImage=LoadBitmap(\))

glBindTexture(GL_TEXTURE_2D, texture[1]);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, TextureImage->sizeX, glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); if (TextureImage) { }

if (TextureImage->data) { }

free(TextureImage);

free (TextureImage->data);

// 释放资源

TextureImage->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage->data);

AUX_RGBImageRec *TextureImage=0; glGenTextures(1, &texture[2]);

虚拟现实与数据可视化课程作业董元 22011207

}

if (TextureImage=LoadBitmap(\)) { }

return Status;

Status=TRUE;

glBindTexture(GL_TEXTURE_2D, texture[2]);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, TextureImage->sizeX, glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); if (TextureImage) { }

if (TextureImage->data) { }

free(TextureImage);

free (TextureImage->data);

// 释放资源

TextureImage->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage->data);

/***************函数名称:

LoadTexture4********************************************************* ****************函数作用:装入位图文件并作为纹理贴图********************************************/ int LoadTexture4() {

int Status=FALSE;

AUX_RGBImageRec *TextureImage=0; glGenTextures(1, &texture[3]); {

Status=TRUE;

glBindTexture(GL_TEXTURE_2D, texture[3]);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, TextureImage->sizeX, glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); if (TextureImage) {

if (TextureImage->data) { }

13 / 40

if (TextureImage=LoadBitmap(\))

TextureImage->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage->data);

// 释放资源

free (TextureImage->data);

虚拟现实与数据可视化课程作业董元 22011207

free(TextureImage);

}

}

return Status;

}

/***************函数名称:

intlight************************************************************ ****************函数作用:初始化灯光设置

*******************************************************/ void initlight(void) {

glLightModelfv(GL_LIGHT_MODEL_AMBIENT,model_ambient); glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER,GL_TRUE); glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular); glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess); glLightfv(GL_LIGHT0,GL_POSITION,light_position0); glLightfv(GL_LIGHT0,GL_AMBIENT,mat_ambient); glLightfv(GL_LIGHT0,GL_DIFFUSE,white_light); glLightfv(GL_LIGHT0,GL_SPECULAR,white_light);

glLightfv(GL_LIGHT6,GL_POSITION,light_position6); glLightfv(GL_LIGHT6,GL_AMBIENT,mat_ambient); glLightfv(GL_LIGHT6,GL_DIFFUSE,white_light); glLightfv(GL_LIGHT6,GL_SPECULAR,white_light);

glEnable(GL_LIGHTING); glEnable(GL_LIGHT0);

glEnable(GL_COLOR_MATERIAL);

}

/***************函数名称:

init**************************************************************** ****************函数作用:初始化设置

**********************************************************/ void init(void) { glClearColor(0,0,0,0); glEnable(GL_TEXTURE_2D);

glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_REPLACE);

LoadTexture1();

14 / 40

虚拟现实与数据可视化课程作业董元 22011207

}

initlight();

glShadeModel(GL_SMOOTH);

glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); //指定材料着色的面 glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); //指定材料对镜面光的反射 glEnable(GL_DEPTH_TEST);// LoadTexture1();//载入纹理1 LoadTexture2();//载入纹理2 LoadTexture3();//载入纹理3 LoadTexture4();//载入纹理4

/***************函数名称:

DrawRoom************************************************************ ****************函数作用:绘制教室墙面以及两侧石柱*********************************************/ void DrawRoom() {

glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat); glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse1); glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat); glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess); glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);

//----------------开始绘制房间

---------------------------------------------------------

15 / 40

glColor3f(0.8f, 1.0f, 0.8f);

glBegin(GL_QUADS); //glNormal3f用于定义点的法向量

glNormal3f(0.0f, 1.0f, 0.0f);

//绘制地板

glVertex3f(-50.0f, -30.0f, -80.0f); glVertex3f(-50.0f, -30.0f, 20.0f); glVertex3f( 50.0f, -30.0f, 20.0f); glVertex3f( 50.0f, -30.0f, -80.0f); glEnd();

glBegin(GL_QUADS); glColor3f(0.3,0.3,0.3);

glNormal3f(0.0f, -1.0f, 0.0f); glVertex3f(-50.0f, 30.0f, 20.0f); glVertex3f(-50.0f, 30.0f, -80.0f); glVertex3f( 50.0f, 30.0f, -80.0f); glVertex3f( 50.0f, 30.0f, 20.0f);

//绘制天花板

glEnd();

虚拟现实与数据可视化课程作业董元 22011207

glColor3f(0.8f,0.8f, 0.8f); glBegin(GL_QUADS);

glNormal3f(0.0f, 0.0f, 1.0f);

glVertex3f(-50.0f, 30.0f, -80.0f); glVertex3f(-50.0f, -30.0f, -80.0f); glVertex3f( 50.0f, -30.0f, -80.0f);

glVertex3f( 50.0f, 30.0f, -80.0f);

glEnd(); glBegin(GL_QUADS);

glNormal3f(0.0f, 0.0f, -1.0f);

glVertex3f( 50.0f, 30.0f, 20.0f); glVertex3f( 50.0f, -30.0f, 20.0f); glVertex3f(-50.0f, -30.0f, 20.0f); glVertex3f(-50.0f, 30.0f, 20.0f); glEnd();

glBegin(GL_QUADS);

glNormal3f( 1.0f, 0.0f, 0.0f);

glVertex3f(-50.0f, 30.0f, 20.0f); glVertex3f(-50.0f, -30.0f, 20.0f); glVertex3f(-50.0f, -30.0f, -80.0f); glVertex3f(-50.0f, 30.0f, -80.0f); glEnd();

glBegin(GL_QUADS);

glNormal3f(-1.0f, 0.0f, 0.0f);

glVertex3f( 50.0f, 30.0f, -80.0f); glVertex3f( 50.0f, -30.0f, -80.0f); glVertex3f( 50.0f, -30.0f, 20.0f);

glVertex3f( 50.0f, 30.0f, 20.0f);

glEnd();

//------------------------------绘制房间结束

------------------------------------------------//

//------------------------------开始绘制房间两侧石柱-----------------------------------------// int j=0; for(;j<2;j++) 石柱

{ glBegin(GL_QUADS);

glNormal3f(0.0f, 0.0f, -1.0f);

//绘制后墙面

//绘制前墙面

//绘制左墙面

//绘制右墙面

//绘制教室右侧的

//石柱后面

16 / 40

虚拟现实与数据可视化课程作业董元 22011207

glVertex3f( 50.0f, 30.0f, -40.0f+j*30); glVertex3f( 47.0f, 30.0f, -40.0f+j*30); glVertex3f( 47.0f, -30.0f, -40.0f+j*30);

glVertex3f( 50.0f, -30.0f, -40.0f+j*30);

glEnd();

glBegin(GL_QUADS); glNormal3f(-1.0f, 0.0f, 0.0f);

glVertex3f( 47.0f, 30.0f, -40.0f+j*30); glVertex3f( 47.0f, 30.0f, -36.0f+j*30); glVertex3f( 47.0f, -30.0f, -36.0f+j*30);

glVertex3f( 47.0f, -30.0f, -40.0f+j*30);

glEnd();

glBegin(GL_QUADS); glNormal3f(0.0f, 0.0f, 1.0f);

glVertex3f( 50.0f, 30.0f, -36.0f+j*30); glVertex3f( 47.0f, 30.0f, -36.0f+j*30); glVertex3f( 47.0f, -30.0f, -36.0f+j*30);

glVertex3f( 50.0f, -30.0f, -36.0f+j*30);

glEnd();

}

for( j=0;j<3;j++) 柱 { glBegin(GL_QUADS); glNormal3f(0.0f, 0.0f, -1.0f);

glVertex3f( -50.0f, 30.0f, -40.0f+j*28); glVertex3f( -47.0f, 30.0f, -40.0f+j*28); glVertex3f( -47.0f, -30.0f, -40.0f+j*28);

glVertex3f( -50.0f, -30.0f, -40.0f+j*28);

glEnd();

glBegin(GL_QUADS); glNormal3f(1.0f, 0.0f, 0.0f);

glVertex3f( -47.0f, 30.0f, -40.0f+j*28); glVertex3f( -47.0f, 30.0f, -36.0f+j*28); glVertex3f( -47.0f, -30.0f, -36.0f+j*28);

glVertex3f( -47.0f, -30.0f, -40.0f+j*28);

glEnd();

glBegin(GL_QUADS);

//石柱左面

//石柱前面

//绘制教室左侧石

//石柱后面

//石柱右面

17 / 40

虚拟现实与数据可视化课程作业董元 22011207

glNormal3f(0.0f, 0.0f, 1.0f); //石柱前面

glVertex3f( -50.0f, 30.0f, -36.0f+j*28); glVertex3f( -47.0f, 30.0f, -36.0f+j*28); glVertex3f( -47.0f, -30.0f, -36.0f+j*28); glVertex3f( -50.0f, -30.0f, -36.0f+j*28);

glEnd();

//------------------------------结束绘制房间两侧石柱-----------------------------------------// }

/***************函数名称:

DrawDesk************************************************************* ****************函数作用:绘制教室里的九张桌子和就张凳子****************************************/ void DrawDesk() {

glPushMatrix();

glColor3f(1,1,0.45);//桌子后面

glTranslatef(15.0f,-12.0f,-32.5f+i*17);//从原点平移 glScalef(11.0f,3.0f,0.3f);//将立方体变成长方体

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff1); glutSolidCube(1.0);

18 / 40

}

GLuint i=0; for(;i<3;i++) {

glPushMatrix();//-----------------------no.1-------------------------------

glColor3f(1,1,0.45);//桌子上面

glTranslatef(15.0f,-10.0f,-30.0+i*17);// glScalef(13.0f,0.3f,5.0f);//将立方体变成长方体

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff1); glutSolidCube(1.0); glPopMatrix(); glPushMatrix();

glColor3f(1,1,0.45);//桌子下面

glTranslatef(15.0f,-13.0f,-30.0+i*17);// glScalef(11.0f,0.3f,5.0f);//将立方体变成长方体

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff1); glutSolidCube(1.0); glPopMatrix();

-----

虚拟现实与数据可视化课程作业董元 22011207

glPopMatrix(); glPushMatrix();

glColor3f(1,1,0.45);//桌子左面

glTranslatef(9.5f,-11.5f,-30.0f+i*17);//从原点平移 glScalef(0.3f,3.0f,5.0f);//将立方体变成长方体

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff1); glutSolidCube(1.0); glPopMatrix(); glPushMatrix();

glColor3f(1,1,0.45);//桌子右面

glTranslatef(20.5f,-11.5f,-30.0f+i*17);//从原点平移 glScalef(0.3f,3.0f,5.0f);//将立方体变成长方体

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff1); glutSolidCube(1.0); glPopMatrix(); glPushMatrix();

glColor3f(1,1,0.45);//桌腿一号

glTranslatef(10.0f,-17.0f,-32.5f+i*17);//从原点平移 glScalef(0.5f,8.0f,0.5f);//将立方体变成长方体

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff1); glutSolidCube(1.0); glPopMatrix(); glPushMatrix();

glColor3f(1,1,0.45);//桌腿二号

glTranslatef(10.0f,-17.0f,-28.5f+i*17);//从原点平移 glScalef(0.5f,8.0f,0.5f);//将立方体变成长方体

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff1); glutSolidCube(1.0); glPopMatrix(); glPushMatrix();

glColor3f(1,1,0.45);//桌腿三号

glTranslatef(20.0f,-17.0f,-32.5f+i*17);//从原点平移 glScalef(0.5f,8.0f,0.5f);//将立方体变成长方体

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff1); glutSolidCube(1.0); glPopMatrix(); glPushMatrix();

glColor3f(1,1,0.45);//桌腿四号

19 / 40

虚拟现实与数据可视化课程作业董元 22011207

glTranslatef(20.0f,-17.0f,-28.5f+i*17);//从原点平移 glScalef(0.5f,8.0f,0.5f);//将立方体变成长方体

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff1); glutSolidCube(1.0); glPopMatrix(); glPushMatrix();

glColor3f(1,1,0.45);//板凳上面

glTranslatef(15.0f,-15.0f,-25.0+i*17);//从原点平移 glScalef(9.5f,0.3f,3.5f);//将立方体变成长方体

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff1); glutSolidCube(1.0); glPopMatrix(); glPushMatrix();

glColor3f(1,1,0.45);//板凳腿一号

glTranslatef(11.0f,-18.0f,-26.0f+i*17);//从原点平移 glScalef(0.5f,6.0f,0.5f);//将立方体变成长方体

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff1); glutSolidCube(1.0); glPopMatrix(); glPushMatrix();

glColor3f(1,1,0.45);//板凳腿二号

glTranslatef(11.0f,-18.0f,-24.0f+i*17);//从原点平移 glScalef(0.5f,6.0f,0.5f);//将立方体变成长方体

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff1); glutSolidCube(1.0); glPopMatrix(); glPushMatrix();

glColor3f(1,1,0.45);//板凳腿三号

glTranslatef(19.0f,-18.0f,-26.0f+i*17);//从原点平移 glScalef(0.5f,6.0f,0.5f);//将立方体变成长方体

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff1); glutSolidCube(1.0); glPopMatrix(); glPushMatrix();

glColor3f(1,1,0.45);//板凳腿四号

glTranslatef(19.0f,-18.0f,-24.0f+i*17);//从原点平移 glScalef(0.5f,6.0f,0.5f);//将立方体变成长方体

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff1); glutSolidCube(1.0);

20 / 40

虚拟现实与数据可视化课程作业董元 22011207

glPopMatrix();

glPushMatrix();//------------------------no.2------------------------------

glColor3f(1,1,0.45);//桌子上面

glTranslatef(0.0f,-10.0f,-30.0+i*17);//从原点平移 glScalef(13.0f,0.3f,5.0f);//将立方体变成长方体

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff1); glutSolidCube(1.0); glPopMatrix(); glPushMatrix();

glColor3f(1,1,0.45);//桌子下面

glTranslatef(0.0f,-13.0f,-30.0+i*17);//从原点平移 glScalef(11.0f,0.3f,5.0f);//将立方体变成长方体

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff1); glutSolidCube(1.0); glPopMatrix(); glPushMatrix();

glColor3f(1,1,0.45);//桌子后面-32.5

glTranslatef(0.0f,-12.0f,-32.5f+i*17);//从原点平移 glScalef(11.0f,3.0f,0.3f);//将立方体变成长方体

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff1); glutSolidCube(1.0); glPopMatrix(); glPushMatrix();

glColor3f(1,1,0.45);//桌子左面

glTranslatef(-5.4f,-11.5f,-30.0f+i*17);//从原点平移 glScalef(0.3f,3.0f,5.0f);//将立方体变成长方体

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff1); glutSolidCube(1.0); glPopMatrix(); glPushMatrix();

glColor3f(1,1,0.45);//桌子右面

glTranslatef(5.4f,-11.5f,-30.0f+i*17);//从原点平移 glScalef(0.3f,3.0f,5.0f);//将立方体变成长方体

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff1); glutSolidCube(1.0); glPopMatrix();

----

21 / 40

虚拟现实与数据可视化课程作业董元 22011207

glPushMatrix();

glColor3f(1,1,0.45);//桌腿一号

glTranslatef(-5.4f,-17.0f,-32.5f+i*17);//从原点平移 glScalef(0.5f,8.0f,0.5f);//将立方体变成长方体

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff1); glutSolidCube(1.0); glPopMatrix(); glPushMatrix();

glColor3f(1,1,0.45);//桌腿二号

glTranslatef(-5.4f,-17.0f,-28.5f+i*17);//从原点平移 glScalef(0.5f,8.0f,0.5f);//将立方体变成长方体

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff1); glutSolidCube(1.0); glPopMatrix(); glPushMatrix();

glColor3f(1,1,0.45);//桌腿三号

glTranslatef(5.4f,-17.0f,-32.5f+i*17);//从原点平移 glScalef(0.5f,8.0f,0.5f);//将立方体变成长方体

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff1); glutSolidCube(1.0); glPopMatrix(); glPushMatrix();

glColor3f(1,1,0.45);//桌腿四号

glTranslatef(5.4f,-17.0f,-28.5f+i*17);//从原点平移 glScalef(0.5f,8.0f,0.5f);//将立方体变成长方体

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff1); glutSolidCube(1.0); glPopMatrix(); glPushMatrix();

glColor3f(1,1,0.45);//板凳上面

glTranslatef(0.0f,-15.0f,-25.0+i*17);//从原点平移 glScalef(9.5f,0.3f,3.5f);//将立方体变成长方体

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff1); glutSolidCube(1.0); glPopMatrix(); glPushMatrix();

glColor3f(1,1,0.45);//板凳腿一号

glTranslatef(-4.3f,-18.0f,-26.0f+i*17);//从原点平移 glScalef(0.5f,6.0f,0.5f);//将立方体变成长方体

22 / 40

虚拟现实与数据可视化课程作业董元 22011207

--

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff1); glutSolidCube(1.0); glPopMatrix(); glPushMatrix();

glColor3f(1,1,0.45);//板凳腿二号

glTranslatef(-4.3f,-18.0f,-24.0f+i*17);//从原点平移 glScalef(0.5f,6.0f,0.5f);//将立方体变成长方体

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff1); glutSolidCube(1.0); glPopMatrix(); glPushMatrix();

glColor3f(1,1,0.45);//板凳腿三号

glTranslatef(4.3f,-18.0f,-26.0f+i*17);//从原点平移 glScalef(0.5f,6.0f,0.5f);//将立方体变成长方体

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff1); glutSolidCube(1.0); glPopMatrix(); glPushMatrix();

glColor3f(1,1,0.45);//板凳腿四号

glTranslatef(4.3f,-18.0f,-24.0f+i*17);//从原点平移 glScalef(0.5f,6.0f,0.5f);//将立方体变成长方体

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff1); glutSolidCube(1.0); glPopMatrix();

glPushMatrix();//--------------------no.3----------------------------------

glColor3f(1,1,0.45);//桌子上面

glTranslatef(-15.0f,-10.0f,-30.0+i*17);//从原点平移 glScalef(13.0f,0.3f,5.0f);//将立方体变成长方体

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff1); glutSolidCube(1.0); glPopMatrix(); glPushMatrix();

glColor3f(1,1,0.45);//桌子下面

glTranslatef(-15.0f,-13.0f,-30.0+i*17);//从原点平移 glScalef(11.0f,0.3f,5.0f);//将立方体变成长方体

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff1); glutSolidCube(1.0);

23 / 40

虚拟现实与数据可视化课程作业董元 22011207

glPopMatrix(); glPushMatrix();

glColor3f(1,1,0.45);//桌子后面

glTranslatef(-15.0f,-12.0f,-32.5f+i*17);//从原点平移 glScalef(11.0f,3.0f,0.3f);//将立方体变成长方体

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff1); glutSolidCube(1.0); glPopMatrix(); glPushMatrix();

glColor3f(1,1,0.45);//桌子左面

glTranslatef(-9.5f,-11.5f,-30.0f+i*17);//从原点平移 glScalef(0.3f,3.0f,5.0f);//将立方体变成长方体

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff1); glutSolidCube(1.0); glPopMatrix(); glPushMatrix();

glColor3f(1,1,0.45);//桌子右面

glTranslatef(-20.5f,-11.5f,-30.0f+i*17);//从原点平移 glScalef(0.3f,3.0f,5.0f);//将立方体变成长方体

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff1); glutSolidCube(1.0); glPopMatrix(); glPushMatrix();

glColor3f(1,1,0.45);//桌腿一号

glTranslatef(-10.0f,-17.0f,-32.5f+i*17);//从原点平移 glScalef(0.5f,8.0f,0.5f);//将立方体变成长方体

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff1); glutSolidCube(1.0); glPopMatrix(); glPushMatrix();

glColor3f(1,1,0.45);//桌腿二号

glTranslatef(-10.0f,-17.0f,-28.5f+i*17);//从原点平移 glScalef(0.5f,8.0f,0.5f);//将立方体变成长方体

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff1); glutSolidCube(1.0); glPopMatrix(); glPushMatrix();

glColor3f(1,1,0.45);//桌腿三号

24 / 40

虚拟现实与数据可视化课程作业董元 22011207

glTranslatef(-20.0f,-17.0f,-32.5f+i*17);//从原点平移 glScalef(0.5f,8.0f,0.5f);//将立方体变成长方体

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff1); glutSolidCube(1.0); glPopMatrix(); glPushMatrix();

glColor3f(1,1,0.45);//桌腿四号

glTranslatef(-20.0f,-17.0f,-28.5f+i*17);//从原点平移 glScalef(0.5f,8.0f,0.5f);//将立方体变成长方体

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff1); glutSolidCube(1.0); glPopMatrix(); glPushMatrix();

glColor3f(1,1,0.45);//板凳上面

glTranslatef(-15.0f,-15.0f,-25.0+i*17);//从原点平移 glScalef(9.5f,0.3f,3.5f);//将立方体变成长方体

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff1); glutSolidCube(1.0); glPopMatrix(); glPushMatrix();

glColor3f(1,1,0.45);//板凳腿一号

glTranslatef(-11.0f,-18.0f,-26.0f+i*17);//从原点平移 glScalef(0.5f,6.0f,0.5f);//将立方体变成长方体

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff1); glutSolidCube(1.0); glPopMatrix(); glPushMatrix();

glColor3f(1,1,0.45);//板凳腿二号

glTranslatef(-11.0f,-18.0f,-24.0f+i*17);//从原点平移 glScalef(0.5f,6.0f,0.5f);//将立方体变成长方体

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff1); glutSolidCube(1.0); glPopMatrix(); glPushMatrix();

glColor3f(1,1,0.45);//板凳腿三号

glTranslatef(-19.0f,-18.0f,-26.0f+i*17);//从原点平移 glScalef(0.5f,6.0f,0.5f);//将立方体变成长方体

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff1); glutSolidCube(1.0);

25 / 40

虚拟现实与数据可视化课程作业董元 22011207

}

}

glPopMatrix(); glPushMatrix();

glColor3f(1,1,0.45);//板凳腿四号

glTranslatef(-19.0f,-18.0f,-24.0f+i*17);//从原点平移 glScalef(0.5f,6.0f,0.5f);//将立方体变成长方体

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff1); glutSolidCube(1.0); glPopMatrix();

/***************函数名称:

DrawBlackboard****************************************************** ****************函数作用:绘制教室前方的黑板(可动黑板)****************************************/ void DrawBlackboard() {

glPushMatrix();//

黑板中二边框

26 / 40

//glBindTexture(GL_TEXTURE_2D,texture[0]); glNormal3f(-1.0f, 0.0f, 0.0f); glPushMatrix();

glColor3f(0,0,0);// 黑板左边框 glTranslatef(-35.7f,6.8f,-79.9f);//

glScalef(1.0f,34.0f,0.5f);//将立方体变成长方体

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff5); glutSolidCube(1.0); glPopMatrix(); glPushMatrix();//

黑板右边框

glTranslatef(35.7f,6.8f,-79.9f);//

glScalef(1.0f,34.0f,0.5f);//将立方体变成长方体 glutSolidCube(1.0); glPopMatrix(); glPushMatrix();//

黑板中一边框

glTranslatef(11.7f,6.8f,-79.9f);//

glScalef(1.0f,34.0f,1.1f);//将立方体变成长方体 glutSolidCube(1.0); glPopMatrix();

虚拟现实与数据可视化课程作业董元 22011207

glTranslatef(-11.7f,6.8f,-79.9f);//

glScalef(1.0f,34.0f,1.1f);//将立方体变成长方体 glutSolidCube(1.0); glPopMatrix();

glPushMatrix();//黑板下边框

glTranslatef(0.0f,-10.0f,-79.9f);//

glScalef(71.3f,0.5f,0.8f);//将立方体变成长方体 glutSolidCube(1.0); glPopMatrix();

glPushMatrix();//黑板上边框

glTranslatef(0.0f,23.8f,-79.9f);//

glScalef(71.3f,0.5f,0.8f);//将立方体变成长方体 glutSolidCube(1.0); glPopMatrix();

//---------------------最左边一组黑板(F5,F6控制上下)---------------------

glPushMatrix();

glColor3f(0.0664,0.2578,0.1211);// 黑板1号

27 / 40

glPushMatrix();//黑板1号下边框

glTranslatef(-23.5f,6.9f+blackboard1_y,-79.9f);// glScalef(24.0f,0.5f,0.5f);//将立方体变成长方体 glutSolidCube(1.0); glPopMatrix();

glPushMatrix();//黑板2号下边框

glTranslatef(-23.5f,-9.8f-blackboard1_y,-79.5f);// glScalef(24.0f,0.5f,0.5f);//将立方体变成长方体 glutSolidCube(1.0); glPopMatrix();

glPushMatrix();//黑板1号上边框

glTranslatef(-23.5f,23.7f+blackboard1_y,-79.9f);// glScalef(24.0f,0.5f,0.5f);//将立方体变成长方体 glutSolidCube(1.0); glPopMatrix();

glPushMatrix();//黑板2号上边框

glTranslatef(-23.5f,6.8f-blackboard1_y,-79.5f);// glScalef(24.0f,0.5f,0.5f);//将立方体变成长方体 glutSolidCube(1.0); glPopMatrix();

虚拟现实与数据可视化课程作业董元 22011207

glTranslatef(-23.5f,15.3f+blackboard1_y,-79.9f);// glScalef(24.0f,16.5f,0.3f);//将立方体变成长方体

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff3); glutSolidCube(1.0); glPopMatrix(); glPushMatrix();

// 黑板2号

glTranslatef(-23.5f,-1.3f-blackboard1_y,-79.5f);// glScalef(24.0f,16.5f,0.3f);//将立方体变成长方体 glutSolidCube(1.0); glPopMatrix();

//---------------------最右边一组黑板(F9,F10控制)---------------------

glPushMatrix();

glColor3f(0.0664,0.2578,0.1211);// 黑板1号 glTranslatef(0.0f,15.3f+blackboard2_y,-79.9f);// glScalef(24.0f,16.5f,0.3f);//将立方体变成长方体

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff3);

28 / 40

glColor3f(0,0,0);

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff5); glPushMatrix();//黑板1号下边框

glTranslatef(0.0f,6.9f+blackboard2_y,-79.9f);// glScalef(24.0f,0.5f,0.5f);//将立方体变成长方体 glutSolidCube(1.0); glPopMatrix();

glPushMatrix();//黑板2号下边框

glTranslatef(0.0f,-9.8f-blackboard2_y,-79.5f);// glScalef(24.0f,0.5f,0.5f);//将立方体变成长方体 glutSolidCube(1.0); glPopMatrix();

glPushMatrix();//黑板1号上边框

glTranslatef(0.0f,23.7f+blackboard2_y,-79.9f);// glScalef(24.0f,0.5f,0.5f);//将立方体变成长方体 glutSolidCube(1.0); glPopMatrix();

glPushMatrix();//黑板2号上边框

glTranslatef(0.0f,6.8f-blackboard2_y,-79.5f);// glScalef(24.0f,0.5f,0.5f);//将立方体变成长方体 glutSolidCube(1.0); glPopMatrix();

虚拟现实与数据可视化课程作业董元 22011207

glutSolidCube(1.0); glPopMatrix(); glPushMatrix();

// 黑板2号

glTranslatef(0.0f,-1.3f-blackboard2_y,-79.5f);// glScalef(24.0f,16.5f,0.3f);//将立方体变成长方体 glutSolidCube(1.0); glPopMatrix();

//---------------------中间一组黑板(F7,F8控制上下)--------------------- glColor3f(0,0,0);

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff5); glPushMatrix();//黑板1号下边框

glTranslatef(23.5f,6.9f+blackboard3_y,-79.9f);// glScalef(24.0f,0.5f,0.5f);//将立方体变成长方体 glutSolidCube(1.0); glPopMatrix();

glPushMatrix();//黑板2号下边框

glTranslatef(23.5f,-9.8f-blackboard3_y,-79.5f);// glScalef(24.0f,0.5f,0.5f);//将立方体变成长方体 glutSolidCube(1.0); glPopMatrix();

glPushMatrix();//黑板1号上边框

glTranslatef(23.5f,23.7f+blackboard3_y,-79.9f);// glScalef(24.0f,0.5f,0.5f);//将立方体变成长方体 glutSolidCube(1.0); glPopMatrix();

glPushMatrix();//黑板2号上边框

glTranslatef(23.5f,6.8f-blackboard3_y,-79.5f);// glScalef(24.0f,0.5f,0.5f);//将立方体变成长方体 glutSolidCube(1.0); glPopMatrix(); glPushMatrix();

glColor3f(0.0664,0.2578,0.1211);// 黑板1号 glTranslatef(23.5f,15.3f+blackboard3_y,-79.9f);// glScalef(24.0f,16.5f,0.3f);//将立方体变成长方体

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff3); glutSolidCube(1.0); glPopMatrix();

29 / 40

虚拟现实与数据可视化课程作业董元 22011207

}

glPushMatrix(); // 黑板2号

glTranslatef(23.5f,-1.3f-blackboard3_y,-79.5f);// glScalef(24.0f,16.5f,0.3f);//将立方体变成长方体 glutSolidCube(1.0); glPopMatrix();

/***************函数名称:

DrawOtherThings****************************************************** ****************函数作用:绘制教室里的其他物体

**************************************************

****************绘制出的物体有:音响、投影仪、门窗、讲台、空调、天花板上的灯*********************/ void DrawOtherThings() {

glEnable(GL_TEXTURE_2D);//贴空调纹理 glBindTexture(GL_TEXTURE_2D,texture[2]); glBegin(GL_QUADS);

glNormal3f(-1.0f, 0.0f, 0.0f);

glTexCoord2f(0,1);glVertex3f( -49.9f, 10.0f, -65.9f); glTexCoord2f(1,1);glVertex3f( -34.9f, 10.0f, -65.9f);

30 / 40

glColor3f(1,1,1);//绘制音响 glPushMatrix();

glTranslatef(-45.0f,20.0f,-38.0);//

glScalef(3.5f,7.0f,3.5f);//将立方体变成长方体

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff4); glutSolidCube(0.8); glPopMatrix(); glPushMatrix();

glTranslatef(45.0f,20.0f,-38.0);//绘制音响 glScalef(3.5f,7.0f,3.5f);//将立方体变成长方体

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff4); glutSolidCube(0.8); glPopMatrix(); glPushMatrix();

glTranslatef(-43.0f,-10.0f,-70.0);//画空调 glScalef(20.0f,50.0f,8.0f);//将立方体变成长方体

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff4); glutSolidCube(0.8); glPopMatrix();

虚拟现实与数据可视化课程作业董元 22011207

glTexCoord2f(1,0);glVertex3f( -34.9f, -30.0f, -65.9f); glTexCoord2f(0,0);glVertex3f( -49.9f, -30.0f, -65.9f);

glEnd();

glBindTexture(GL_TEXTURE_2D,texture[3]);//贴空调纹理 glBegin(GL_QUADS);

glNormal3f(-1.0f, 0.0f, 0.0f);

glTexCoord2f(0,1);glVertex3f( -34.9f, 10.0f, -65.9f); glTexCoord2f(1,1);glVertex3f( -34.9f, 10.0f, -72.9f); glTexCoord2f(1,0);glVertex3f( -34.9f, -30.0f, -72.9f); glTexCoord2f(0,0);glVertex3f( -34.9f, -30.0f, -65.9f);

glEnd();

glBegin(GL_QUADS);

glNormal3f(-1.0f, 0.0f, 0.0f);

//贴空调纹理

glTexCoord2f(0,1);glVertex3f( -49.9f, 10.2f, -65.9f); glTexCoord2f(1,1);glVertex3f( -34.9f, 10.1f, -65.9f); glTexCoord2f(1,0);glVertex3f( -34.9f, 10.1f, -72.9f); glTexCoord2f(0,0);glVertex3f( -49.9f, 10.1f, -72.9f);

glEnd();

glDisable(GL_TEXTURE_2D);

glBegin(GL_QUADS);//绘制投影仪 glColor3f(1,1,1);

//glNormal3f(-1.0f, 0.0f, 0.0f); glVertex3f( 5.0f, 29.9f, -78.0f);

glVertex3f( -32.0f, 29.9f, -78.0f);

glVertex3f( 5.0f, projectory, -78.0f); glVertex3f( -32.0f, projectory, -78.0f);

glEnd();

glColor3f(0.521f,0.121f,0.0547f);

GLfloat diffusion2[]={0.521f,0.121f,0.0547f,1.0};

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,diffusion2); glEnable(GL_TEXTURE_2D);//启用二维纹理 glBindTexture(GL_TEXTURE_2D,texture[1]); glBegin(GL_QUADS);

glNormal3f(-1.0f, 0.0f, 0.0f);

//绘制门

glTexCoord2f(0,1);glVertex3f( 49.9f, 20.0f, -69.9f); glTexCoord2f(1,1);glVertex3f( 49.9f, 20.0f, -45.0f); glTexCoord2f(1,0);glVertex3f( 49.9f, -30.0f, -45.0f); glTexCoord2f(0,0);glVertex3f( 49.9f, -30.0f, -69.9f);

31 / 40

虚拟现实与数据可视化课程作业董元 22011207

glEnd();

glBindTexture(GL_TEXTURE_2D,texture[0]); GLint x=0,y=0; for(;x<3;x++) { }

glDisable(GL_TEXTURE_2D); GLuint i=0,j=0;//画天花板上的灯 glColor3f(1,1,1); for(;i<5;i++) {

for (;j<6;j++) {

glBegin(GL_QUADS);

glNormal3f(0.0f, -1.0f, 0.0f);

glVertex3f( -40.0f+i*18, 29.9f, -75.0f+j*20); glVertex3f( -40.0f+i*18, 29.9f, -70.0f+j*20); glVertex3f(-35.0f+i*18, 29.9f, -70.0f+j*20); glVertex3f( -35.0f+i*18, 29.9f, -75.0f+j*20); glEnd();

32 / 40

glBegin(GL_QUADS);

glTexCoord2f(0,1);

glColor3f(0.521f,0.121f,0.0547f); //绘制右窗户 glVertex3f( 49.9f, 20.0f, -30.9f+x*30); glTexCoord2f(1,1);

glVertex3f( 49.9f, 20.0f, -13.9f+x*30); glTexCoord2f(1,0);

glVertex3f( 49.9f, 0.0f, -13.9f+x*30); glTexCoord2f(0,0);

glVertex3f( 49.9f, 0.0f, -30.9f+x*30);

glEnd();

glBegin(GL_QUADS);

//glNormal3f(-1.0f, 0.0f, 0.0f);

//绘制窗户

glTexCoord2f(0,1);glVertex3f( -49.9f, 20.0f, -60.9f+x*28); glTexCoord2f(1,1);glVertex3f( -49.9f, 20.0f, -43.9f+x*28); glTexCoord2f(1,0);glVertex3f( -49.9f, 0.0f, -43.9f+x*28); glTexCoord2f(0,0);glVertex3f( -49.9f, 0.0f, -60.9f+x*28);

glEnd();

虚拟现实与数据可视化课程作业董元 22011207

}

}

} j=0;

glPushMatrix();//黑板前一块高地 glColor3f(0.8f,1.0f,0.8f);

glTranslatef(0.0f,-29.0f,-70.0f);//

glScalef(65.0f,3.0f,10.0f);//将立方体变成长方体 glutSolidCube(1.0); glPopMatrix();

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff1);

glPushMatrix();

glColor3f(0.521f,0.121f,0.0547f);//讲台 glTranslatef(-0.0f,-20.0f,-65.0f);//

glScalef(20.0f,30.0f,6.0f);//将立方体变成长方体 glutSolidCube(1.0); glPopMatrix();

glPushMatrix();

glColor3f(0.521f,0.121f,0.0547f);//讲台 glTranslatef(0.0f,-5.0f,-60.0f);//

glScalef(30.0f,2.0f,8.0f);//将立方体变成长方体 glutSolidCube(1.0); glPopMatrix();

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff1);

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff1);

/***************函数名称:

projector_dispaly1*************************************************** ****************函数作用:制造投影仪收起效果

****************************************************/ void projector_dispaly1(void) { }

33 / 40

projectory=projectory+0.05f; if(projectory>=28.0f) { }

glutPostRedisplay();

projectory=28.0f;

虚拟现实与数据可视化课程作业董元 22011207

/***************函数名称:

projector_dispaly2*************************************************** ****************函数作用:制造投影仪放下效果

****************************************************/ void projector_dispaly2(void) { }

/***************函数名称:

dispaly*************************************************************** ****************函数作用:显示回调函数

**********************************************************/ void display(void) { }

/***************函数名称:

reshape*************************************************************** ****************函数作用:窗口大小改变回调函数

***************************************************/ void reshape(intw,inth) {

WinWidth = w; WinHeight

= h;

glViewport(0,0,(GLsizei) w, (GLsizei) h);//???????

glMatrixMode( GL_PROJECTION);//指定哪一个矩阵是当前矩阵(看的程序好像都有这glLoadIdentity();//?????

gluPerspective(75.0f, (GLfloat)w/(GLfloat)h, 0.01f, 120.0f);

34 / 40

projectory=projectory-0.05f; if(projectory<=-5.0f) { }

glutPostRedisplay();

projectory=-5.0f;

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glColor3f(1,1,1); DrawRoom(); DrawBlackboard(); DrawOtherThings(); DrawDesk(); glFlush();

个)?????

虚拟现实与数据可视化课程作业董元 22011207

}

glMatrixMode(GL_MODELVIEW); glLoadIdentity();

glLightfv(GL_LIGHT0,GL_POSITION,light_position); gluLookAt(Eye.x, Eye.y, Eye.z, 0, 0, 0, 0, 1, 0);

/***************函数名称:

OnKeyboard************************************************************ ****************函数作用:响应键盘操作

**********************************************************/ GLvoid OnKeyboard(unsignedcharkey, intx, inty) { }

/***************函数名称:

OnSpecial************************************************************* ****************函数作用:响应特殊事件操作(其实也是响应键盘操作)********************************/ GLvoid OnSpecial(intkey, intx, inty) {

35 / 40

switch(key) { case 27: }

exit(0); break;

switch(key) {

caseGLUT_KEY_LEFT:

Eye.x -= 0.5; break;

caseGLUT_KEY_RIGHT:

Eye.x += 0.5; break;

caseGLUT_KEY_UP:

Eye.y += 0.5; break;

caseGLUT_KEY_DOWN:

Eye.y -= 0.5; break;

虚拟现实与数据可视化课程作业董元 22011207

caseGLUT_KEY_PAGE_DOWN: Eye.z -= 0.5;

break;

caseGLUT_KEY_PAGE_UP: Eye.z += 0.5;

break;

caseGLUT_KEY_F1: glEnable(GL_LIGHT6);

break;

caseGLUT_KEY_F2: glDisable(GL_LIGHT6);

break;

caseGLUT_KEY_F3: glutIdleFunc(projector_dispaly2);

break;

caseGLUT_KEY_F4: glutIdleFunc(projector_dispaly1); break;

caseGLUT_KEY_F5: if(blackboard1_y>=-16) blackboard1_y-=0.5; break;

caseGLUT_KEY_F6:

if(blackboard1_y<0) blackboard1_y+=0.5;

break;

caseGLUT_KEY_F7: if(blackboard2_y>=-16) blackboard2_y-=0.5; break;

caseGLUT_KEY_F8:

if(blackboard2_y<0) blackboard2_y+=0.5;

break;

caseGLUT_KEY_F9:

if(blackboard3_y>=-16)

36 / 40

虚拟现实与数据可视化课程作业董元 22011207

}

}

blackboard3_y-=0.5; break;

if(blackboard3_y<0) blackboard3_y+=0.5; break; InitFMOD(); break;

FSOUND_Sample_Free (handle1); FSOUND_Close(); break;

caseGLUT_KEY_F10:

caseGLUT_KEY_F11:

caseGLUT_KEY_F12:

reshape(WinWidth, WinHeight); glutPostRedisplay();

GLvoid OnIdle() { }

/***************函数名称:

InitFMOD************************************************************** ****************函数作用:载入并播放音乐

********************************************************/ GLvoid InitFMOD(void) { }

/***************函数名称:

PrintInformation*******************************************************

37 / 40

glutPostRedisplay();

// 载入音频文件

if (FSOUND_Init(44100, 32, 0)) { }

// 载入文件bgmusic.mp3

handle1=FSOUND_Sample_Load (0,\春晖曲.mp3\,0, 0); FSOUND_PlaySound (0,handle1);

// 把声音初始化为44khz

虚拟现实与数据可视化课程作业董元 22011207

****************函数作用:在窗口中显示提示信息

***************************************************/ GLvoid PrintInformation() { }

------------------main.cpp结束--------------------------------------- printf(\); printf(\虚拟现实与数据可视化课程作业************** \\n\); printf(\东南大学仪器科学与工程学院董元22011207****** \\n\); printf(\);

printf(\相关操作按键信息: \\n\); printf(\键关闭窗口 \\n\);

printf(\上下左右及PgUp PgDn键控制变化视角和前进后退 \\n\); printf(\、F2键分别控制开灯、关灯 \\n\); printf(\、F4键分别控制投影仪放下和收起 \\n\); printf(\、F6键控制左边黑板上下 \\n\); printf(\、F8键控制中间黑板上下 \\n\); printf(\、F10键控制右边黑板上下 \\n\);

printf(\、F12键控制播放以及停止播放春晖曲 \\n\); printf(\如对本源码有意见与建议望请分享. QQ529693812\\n\); printf(\);

printf(\); printf(\最后,我知道……***************** \\n\); printf(\这个教室画风有点奇怪***************** \\n\); printf(\看起来也不是那么漂亮******************* \\n\); printf(\但最终版就是这样了**************** \\n\); printf(\虽然花了很多时间但是是个很有趣的过程********* \\n\); printf(\谢谢观赏……********************** \\n\);

printf(\);

printf(\);

2、头文件

//--------------------定义视点结构

----------------------------------------------- typedefstructEyePoint {

//-------------------纹理相关的一些定义----------------------------------------- #define

WIDTH

64

//位图宽度

38 / 40

GLfloat x; GLfloat y; GLfloat z;

}EYEPOINT;

虚拟现实与数据可视化课程作业董元 22011207

#define GLubyte GLfloat GLint

HEIGHT 64 //位图高度

#definePI 3.14159

Image[WIDTH][HEIGHT][4]; xRot = 0.0f;

Image1;

iWidth, iHeight, iMode; pImage;

//位图数据

AUX_RGBImageRec * GLubyte *

//------------------------光照相关的一些参数---------------------------------------- GLfloat mat_specular[]={0.8,1.0,1.0,1.0}; GLfloat mat_shininess[]={5.0};

GLfloat mat_ambient[]={0.1,0.1,0.1,1}; GLfloat light_position[]={40,19,-70,1.0}; GLfloat light_position0[]={40,19.9,-60,1.0}; GLfloat light_position1[]={40,19.9,-0,1.0}; GLfloat light_position2[]={20,19.9,-60,1.0}; GLfloat light_position3[]={20,19.9,0,1.0}; GLfloat light_position4[]={-20,19.9,-60,1.0}; GLfloat light_position5[]={-20,19.9,0,1.0}; GLfloat light_position6[]={-40,19.9,-60,1.0}; GLfloat light_position7[]={-40,19.9,0,1.0}; GLfloat white_light[]={1.0,1.0,1.0,1.0}; //------------------------材质相关的一些参数---------------------------------------- GLfloat mat_amb_diff1[]={1,1,0.45,1.0}; GLfloat mat_spec1[]={1.0f,1.0f,1.0f,1.0f}; GLfloat mat_shine1[]={10.0f};

GLfloat mat_amb_diff2[]={0.3f,0.35f,0.3f,1.0}; GLfloat mat_amb_diff3[]={0.0664,0.2578,0.1211,1.0}; GLfloat mat_amb_diff4[]={1.0f,1.0f,1.0f,1.0}; GLfloat mat_amb_diff5[]={0.0f,0.0f,0.0f,1.0}; GLfloat mat_amb_diff6[]={0.0f,0.0f,0.0f,1.0}; GLfloat model_ambient[]={0.05f,0.05f,0.05f,1.0f}; GLfloat mat_emiss[]={0.65f,0.65f,0.4f,0.0f}; GLfloat no_mat[]

= {0.0f, 0.0f, 0.0f, 1.0f};

//无材质色

//彩色环境色 //漫反射 //无反光 //低反光 //自发光

GLfloat mat_ambient_color[] = {0.8f, 0.8f, 0.2f, 1.0f}; GLfloat mat_diffuse1[] GLfloat no_shininess[] GLfloat low_shininess[] GLfloat mat_emission[] GLfloat projectory=28.0;

GLfloat blackboard1_y=0,blackboard2_y=0,blackboard3_y=0; EYEPOINT Eye;

39 / 40

= {0.1f, 0.5f, 0.8f, 1.0f}; = {0.0f}; = {5.0f};

GLfloat high_shininess[] = {100.0f}; //高反光

= {0.3f, 0.2f, 0.2f, 0.0f};

虚拟现实与数据可视化课程作业董元 22011207

GLint WinWidth; GLint

WinHeight;

GLuint texture[5];

//--------------------------函数声明

-------------------------------------------------- AUX_RGBImageRec *LoadBitmap(char *Filename); int LoadTexture1(); int LoadTexture2(); int LoadTexture3(); int LoadTexture4(); void initlight(void); void init(void); void DrawRoom(void); void DrawDesk(void); void DrawOtherThings(void); void DrawBlackboard(void); void display(void);

void projector_dispaly1(void); void projector_dispaly2(void); void reshape(int w,int h);

GLvoid OnKeyboard(unsignedchar key, int x, int y); GLvoid OnSpecial(int key, int x, int y); GLvoid OnIdle();

GLvoid PrintInformation();

GLvoid InitFMOD(void);

40 / 40

本文来源:https://www.bwwdw.com/article/ca45.html

Top