OpenGL室内三维环境北邮计算机图形学作业.docx
- 文档编号:27106308
- 上传时间:2023-06-27
- 格式:DOCX
- 页数:13
- 大小:571.61KB
OpenGL室内三维环境北邮计算机图形学作业.docx
《OpenGL室内三维环境北邮计算机图形学作业.docx》由会员分享,可在线阅读,更多相关《OpenGL室内三维环境北邮计算机图形学作业.docx(13页珍藏版)》请在冰豆网上搜索。
OpenGL室内三维环境北邮计算机图形学作业
OpenGL室内三维环境(北邮计算机图形学作业)
计算机图形学第二次作业
姓名:
学 号:
学院:
任课教师:
一.设计要求
试设计一个室内三维环境,并利用OPENGL展示它的三维效果。
要求:
(1)包含基本的实体元素:
球,多面体,椎体,柱体,曲面等;
(2)有全局光照和纹理功能
(3)程序具有交互功能
二.交互说明
键盘的4个按键:
上键:
视角上移
下键:
视角下移
左键:
视角左移
右键:
视角右移
三.效果展示
四.程序代码
#include
#include
#include"glew.h"
#include"glut.h"
#include
#pragmacomment(lib,"glew32.lib")
#definecheckImageWidth64
#definecheckImageHeight64
staticGLubytecheckImage[checkImageHeight][checkImageWidth][4];
staticGLuinttexName;
staticGLfloatxrot=0;
staticGLfloatyrot=0;
//函数功能:
绘制地面纹理图案
voidmakeCheckImage(void)
{
inti,j,c;
for(i=0;i for(j=0;j c=((((i&0x16)==0)^((j&0x16))==0))*255; checkImage[i][j][0]=(GLubyte)c; checkImage[i][j][1]=(GLubyte)c; checkImage[i][j][2]=(GLubyte)c; checkImage[i][j][3]=(GLubyte)255; } } } //函数功能: 初始化 voidSetupRC(void) { glEnable(GL_LIGHTING);//启用灯源 glEnable(GL_LIGHT0);//启用0号灯 glShadeModel(GL_SMOOTH);//设置光滑着色模式 glEnable(GL_DEPTH_TEST);//启用深度测试 glEnable(GL_NORMALIZE);//启用法向量 glClearColor(1.0f,1.0f,1.0f,0.0f);//为色彩缓冲区指定用于清除的值 //设置表面材料的属性 GLfloatmat_ambient[]={0.6f,0.6f,0.6f,1.0f}; GLfloatmat_diffuse[]={0.5f,0.5f,0.5f,1.0f}; GLfloatmat_specular[]={1.0f,1.0f,1.0f,1.0f,}; GLfloatmat_shininess[]={40.0f}; glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient);//指定环境泛光的强度 glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);//漫反射的强度 glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);//镜面反射的强度 glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);//镜面反射光的会聚强度 //纹理 makeCheckImage();//绘制地面纹理图案 glPixelStorei(GL_UNPACK_ALIGNMENT,1);//控制像素存储模式 glGenTextures(1,&texName);//用来生成纹理的数量为1 glBindTexture(GL_TEXTURE_2D,texName);//绑定纹理 //纹理滤波,图象从纹理图象空间映射到帧缓冲图象空间 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,checkImageWidth, checkImageHeight,0,GL_RGBA,GL_UNSIGNED_BYTE,checkImage); } //函数功能: 绘制墙壁 voidDrawWall(void) { glPushMatrix();//矩阵堆栈压入 glTranslated(1.2,0.01,1.2);//将变换矩阵与当前矩阵相乘,使原点移动到(参数值坐标) glScaled(2.4,0.02,2.4);//将比例矩阵与当前矩阵相乘,将当前图形沿x,y,z轴分别放大为原来的(参数值)倍 glutSolidCube(1.0);//size=1.0的实心立方体 glPopMatrix();//矩阵堆栈弹出 } //函数功能: 绘制立方柱体 voidDrawPillar(void) { glPushMatrix(); glTranslated(0,0.15,0); glScaled(0.02,0.3,0.02); glutSolidCube(1.0); glPopMatrix(); } //函数功能: 绘制桌子 voidDrawTable(void) { glPushMatrix(); glTranslated(0.05,0.3,0.05); glScaled(0.6,0.02,0.6); glutSolidCube(1.0);//绘制桌面 glPopMatrix(); glPushMatrix(); glTranslated(0.275,0,0.275); DrawPillar();//绘制桌腿 glTranslated(0,0,-0.45); DrawPillar();//绘制桌腿 glTranslated(-0.45,0,0.45); DrawPillar();//绘制桌腿 glTranslated(0,0,-0.45); DrawPillar();//绘制桌腿 glPopMatrix(); } //函数功能: 绘图 voidRenderScene(void) { GLfloatlight_position[]={2.0f,6.0f,3.0f,0.0f}; glLightfv(GL_LIGHT0,GL_POSITION,light_position);//指定0号光源的位置 glMatrixMode(GL_PROJECTION);//对投影矩阵应用随后的矩阵操作 glLoadIdentity();//将当前的用户坐标系的原点移到了屏幕中心 GLfloath=1.0;//窗口的一半高度 glOrtho(-h*64/48.0,h*64/48.0,-h,h,0.1,100.0);//将当前的可视空间设置为正投影空间: 左,右,下,上,近,远。 glMatrixMode(GL_MODELVIEW);//对模型视景矩阵堆栈应用随后的矩阵操作 glLoadIdentity(); gluLookAt(2,1.6,2,0,0.2,0,0,1,0);//设置观察坐标系 //开始绘制 glRotatef(xrot,1.0f,0.0f,0.0f);//旋转轴经过原点,方向为(1,0,0),旋转角度为xrot,方向满足右手定则 glRotatef(yrot,0.0f,1.0f,0.0f);//旋转轴经过原点,方向为(0,1,0),旋转角度为yrot glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glPushMatrix(); glRotated(90.0,0.0,0.0,1.0); DrawWall();//绘制一面墙壁 glPopMatrix(); glPushMatrix(); glRotated(-90.0,1.0,0.0,0.0); DrawWall();//绘制另一面墙壁 glPopMatrix(); glPushMatrix(); glTranslated(0.4,0,0.4); DrawTable();//绘制桌子 glPopMatrix(); glPushMatrix(); glTranslated(0.2,0.1,0.85); glScaled(0.8,0.8,1.0); glutSolidCube(0.2);//绘制箱子 glPopMatrix(); glPushMatrix(); glTranslated(0.6,0.38,0.6); glRotated(-100,0,1,0); glutSolidTeapot(0.1);//绘制茶壶 glPopMatrix(); glPushMatrix(); glTranslated(0.3,0.33,0.5); glRotated(180,0,180,180); glutSolidTorus(0.02f,0.05,25,50);//绘制手镯【丝状花环】 glPopMatrix(); glPushMatrix(); glTranslated(0.45,0.42,0.3); glutSolidSphere(0.1,15,50);//绘制球体 glPopMatrix(); glPushMatrix(); glTranslated(1.0,0.35,0.3); glScaled(0.03,0.7,0.03); glutSolidCube(1.0);//绘制灯柱 glPopMatrix(); glPushMatrix(); glTranslated(1.0,0.7,0.3); glRotated(190,180,200,270); glutSolidCone(0.15,0.25f,30,25);//绘制圆锥型灯罩 glPopMatrix(); //绘制纹理 glEnable(GL_TEXTURE_2D);//开启纹理 glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);//映射方式 glBegin(GL_QUADS);//绘制地面 //绘制四边形并给出当前顶点所对应的纹理坐标 glTexCoord2f(0.0,0.0);glVertex3f(0.0,0.0,0.0); glTexCoord2f(0.0,1.0);glVertex3f(0.0,0.0,2.4); glTexCoord2f(1.0,1.0);glVertex3f(2.4,0.0,2.4); glTexCoord2f(1.0,0.0);glVertex3f(2.4,0.0,0.0); glEnd(); glDisable(GL_TEXTURE_2D);//关闭纹理 glFlush();//绘图结果显示到屏幕上 } //函数功能: 处理按键交互信息 voidSpecialKeys(intkey,intx,inty) { switch(key){ caseGLUT_KEY_UP: //上键 xrot+=1.0; break; caseGLUT_KEY_DOWN: //下键 xrot-=1.0; break; caseGLUT_KEY_LEFT: //左键 yrot+=1.0; break; caseGLUT_KEY_RIGHT: //右键 yrot-=1.0; break; default: break; } glutPostRedisplay();//标记当前窗口需要重新绘制 glFlush();//绘图结果显示到屏幕上 } //函数功能: 改变窗口大小 voidChangeSize(intw,inth) { GLfloatlightPos[]={-50.f,50.0f,100.0f,1.0f}; GLfloatnRange=1.9f; 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);//选择模型观察矩阵 glLoadIdentity();//设置当前矩阵为单位矩阵 glLightfv(GL_LIGHT0,GL_POSITION,lightPos);//重新定义光源 } voidmain() { glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH);//双缓存 glutInitWindowSize(600,400);//窗口大小 glutInitWindowPosition(300,100);//窗口位置 glutCreateWindow("xdyroom");//创建窗口,名为xdyroom SetupRC();//自定义的初始化函数 glutDisplayFunc(RenderScene);//显示回调函数,用于绘图 glutReshapeFunc(ChangeSize);//处理改变窗口大小 glutSpecialFunc(SpecialKeys);//处理按键交互信息 glutMainLoop();//让GLUT框架开始运行,处理交互事件 }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- OpenGL 室内 三维 环境 计算机 图形学 作业