OpenGL室内三维环境(北邮计算机图形学作业)_第1页
OpenGL室内三维环境(北邮计算机图形学作业)_第2页
OpenGL室内三维环境(北邮计算机图形学作业)_第3页
OpenGL室内三维环境(北邮计算机图形学作业)_第4页
OpenGL室内三维环境(北邮计算机图形学作业)_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、计算机图形学第二次作业 姓 名: 学 号: 学 院: 任课教师: 2 一. 设计要求 试设计一个室内三维环境,并利用 OPEN G展示它的三维 效果。要求: (1)包含基本的实体元素:球,多面体,椎体, 柱体,曲面等; (2)有全局光照和纹理功能 (3)程序具有交互功能 二. 交互说明 键盘的4个按键: 上键:视角上移 下键:视角下移 左键:视角左移 右键:视角右移 三. 效果展示 门址 + 代1506Debugl SOSexe 口 - 園开;学辛円匸笹环埠 2 3 疋 +?!竺誓1ebugl * 3 四. 程序代码 #i nclude #i nclude #i nclude III! #in

2、 clude III! #in elude #pragma comment( lib ,) #define checklmageWidth 64 #define checkImageHeight 64 static GLubyte checkImage checkImageHeight checkImageWidth 4; static GLui nt texName; staticGLfloat xrot=0; staticGLfloat yrot=0; /函数功能:绘制地面纹理图案 void makeChecklmage(void ) int i, j, c; for (i = 0; i

3、checkImageHeight ; i+) for (j = 0; j checkImageWidth ; j+) c = (i checkImageij0 = (GLubyte)c; checkImageij1 = (GLubyte)c; checkImageij2 = (GLubyte)c; 10 checklmageij3 = ( GLubyte) 255; /函数功能:初始化 void SetupRC(void ) glEnable( GL_LIGHTING 启用灯源 glEnable( GL_LIGHT0;/ 启用 0号灯 glShadeModel( GL_SMOOTH /设置光滑

4、着色模式 glEnable( GL_DEPTH_TEST / 启用深度测试 glEnable( GL_NORMALIZE/ 启用法向量 glClearColor, , , ;/为色彩缓冲区指定用于清除的值 /设置表面材料的属性 GLfloat mat_ambient = ,; GLfloat mat_diffuse = ,; GLfloat mat_specular = ,; GLfloat mat_shininess = ; glMaterialfv( GL FRONTGL AMBIENTnat ambie nt); /指定环境泛光的强度 glMaterialfv( glMaterialfv

5、( GL_FRON TGL_DIFFUSEmat_diffuse); GL_FRONTGL_SPECULARiat_specular); /漫反射的强度 /镜面反射的强度 glMaterialfv(GL_FRON|TGL_SHININESSmat_sh inin ess);/ 镜面反射光的会聚强度 /纹理 makeChecklmage();/绘制地面纹理图案 glPixelStorei(GL_UNPACK_ALIGNMENT 控制像素存储模式 glGenTextures(1, /用来生成纹理的数量为1 glBindTexture( GL_TEXTURE_2texName);/ 绑定纹理 /纹理

6、滤波,图象从纹理图象空间映射到帧缓冲图象空间 glTexParameteri( GL_TEXTURE_2DGL_TEXTURE_WRAP_SL_REPEAT glTexParameteri( GL_TEXTURE_2DGL_TEXTURE_WRAP_TL_REPEAT glTexParameteri( GL_TEXTURE_2DGL_TEXTURE_MAG_FILTEGL_NEAREST glTexParameteri( GL_TEXTURE_2DGL_TEXTURE_MIN_FILTjER3L_NEAREST glTexImage2D( GL_TEXTURE_2D GL_RGBAcheckl

7、mageWidth , checkImageHeight , 0, GL_RGBAGL_UNSIGNED_BYTEecklmage); /函数功能:绘制墙壁 void DrawWall( void ) /矩阵堆栈压入 glPushMatrix(); gITranslated, , ;/将变换矩阵与当前矩阵相乘,使原点移动到(参数值坐标)| gIScaled, , ;/将比例矩阵与当前矩阵相乘,将当前图形沿x,y,z轴分别放大为原来的(参 数值)倍 glutSolidCube;/size=的实心立方体 gIPopMatrix();/矩阵堆栈弹岀 /函数功能:绘制立方柱体 void DrawPil

8、lar( void ) glPushMatrix(); glTra nslated(0, , 0);| glScaled,; glutSolidCube; glPopMatrix(); /函数功能:绘制桌子 void DrawTable( void ) glPushMatrix(); glTra nslated,; glScaled,; glutSolidCube; glPopMatrix(); /绘制桌面 glPushMatrix(); | glTra nslated, 0,; DrawPillar(); glTranslated(0, 0, ;| /绘制桌腿 DrawPillar(); /

9、绘制桌腿 glTra nslated, 0,; DrawPillar(); /绘制桌腿 glTranslated(0, 0, ;| DrawPillar(); /绘制桌腿 glPopMatrix(); /函数功能:绘图 void RenderScene( void ) GLfloat light_position=, , , ; glLightfv( GL_LIGHT0GL_POSITIONght_position);/ 指定0号光源的位置 glMatrixMode( GL_PROJECTIQN/对投影矩阵应用随后的矩阵操作 glLoadldentity();/将当前的用户坐标系的原点移到了

10、屏幕中心 GLfloat h = ;/窗口的一半高度 glOrtho(-h*64/, h*64/, -h, h, , ; /将当前的可视空间设置为正投影空间:左,右,下,上, 近,远。 glMatrixMode( GL_MODELVIEW/对模型视景矩阵堆栈应用随后 的矩阵操作 glLoadIde ntity(); gluLookAt(2, , 2, 0, , 0, 0, 1, 0);/ 设置观察坐标系 /开始绘制 glRotatef(xrot, , , ;/旋转轴经过原点,方向为(1,0,0),旋转角度为xrot, 方向满足右手定则 glRotatef(yrot, , , ;/旋转轴经过原点

11、,方向为(0,1,0),旋转角度为yrot glClear( GL_COLOR_BUFFER_BITGL_DEPTH_BUFFER_BIT glPushMatrix(); | glRotated,; DrawWall(); /绘制一面墙壁 glPopMatrix(); glPushMatrix(); glRotated,; DrawWall(); glPopMatrix(); /绘制另一面墙壁 glPushMatrix(); glTra nslated, 0,; DrawTable(); glPopMatrix(); /绘制桌子 glPushMatrix(); glTra nslated,;

12、glScaled,; glutSolidCube; /绘制箱子 glPopMatrix(); glPushMatrix(); | glTra nslated,; glRotated(-100, 0, 1, 0); glutSolidTeapot; / 绘制茶壶 glPopMatrix(); glPushMatrix(); gITra nslated,; gIRotated(180, 0, 180, 180); glutSolidTorus, , 25, 50);/绘制手镯【丝状花环】 glPopMatrix(); glPushMatrix(); glTra nslated,; glutSoli

13、dSphere, 15, 50); /绘制球体 glPopMatrix(); glPushMatrix(); glTra nslated,; glScaled,; glutSolidCube; /绘制灯柱 glPopMatrix(); glPushMatrix(); glTra nslated,; glRotated(190, 180, 200, 270); glutSolidCone, , 30, 25);/ 绘制圆锥型灯罩 glPopMatrix(); /绘制纹理 glEnable( GL_TEXTURE_2D/ 开启纹理 glTexEnvf( GL_TEXTURE_ENVGL_TEXTU

14、RE_ENV_M,ODE_DECAL 映射方式 glBegin( GL_QUAD;S/ 绘制地面 /绘制四边形并给出当前顶点所对应的纹理坐标 glTexCoord2f, ; glVertex3f,; glTexCoord2f, ; glVertex3f,; glTexCoord2f, ; glVertex3f,; glTexCoord2f, ; glVertex3f,; glEn d(); glDisable( GL_TEXTURE_2D / 关闭纹理 glFlush();/绘图结果显示到屏幕上 /函数功能:处理按键交互信息 void SpecialKeys( int key, int x,

15、int y) switch ( key) case GLUT_KEY_U P / 上键 xrot +=; break; case GLUT_KEY_DOWN / 下键 xrot -=; break; case GLUT_KEY_LEFT/ 左键 yrot +=; break; case GLUT_KEY_RIGHT / 右键 yrot -=; break; default : break; glutPostRedisplay();/标记当前窗口需要重新绘制 glFlush();/绘图结果显示到屏幕上 /函数功能:改变窗口大小 void ChangeSize( int w int h) GLfl

16、oat lightPos = ,; GLfloat nRange =; if ( h = 0) h = 1; glViewport(0, 0, w h);/重新设置屏幕上的窗口大小 glMatrixMode( GL_PROJECTION/后继操作都在投影变换范围内 glLoadIdentity();/设置当前矩阵为单位矩阵 /正交投影 if ( w= h) glOrtho (-nRange, nRange, -nRange*h/ w, nRange* h/w -nRange, nRange); else glOrtho (-nRange* w/ h, nRange* w/ h, -nRange, nRange, -nRange, nRange); glMatrixMode( GL_MODELVIEW glLoadIde ntity(); /选择模型观察矩阵 /设置当前矩阵为单位矩阵 glLightfv( GL_LIGHT0 GL_POSITIONlightPos); / 重新定义光源 void main () glutlnitDisplayMode(GLUT_SINGLE GLUT_RG|B GLUT_DEPTH 双缓存 glutI nitWin dowSize(600, 400); /窗口大小 glutI nit

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论