计算机图形学课程设计(论文)-花园小屋设计_第1页
计算机图形学课程设计(论文)-花园小屋设计_第2页
计算机图形学课程设计(论文)-花园小屋设计_第3页
计算机图形学课程设计(论文)-花园小屋设计_第4页
计算机图形学课程设计(论文)-花园小屋设计_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

PAGEXX大学计算机图形学课程设计论文(花园小屋设计)院系:专业:班级:学号:姓名:日期:年月日目录一、系统的初始化 11.画图前的初始化 12.数据载入 12.1定义纹理 12.2光照的载入 52.3显示列表的载入 53.对象模型的建立 63.1空间背景 63.2月亮 73.3小屋 83.4树 93.5桌子和凳子 103.6喷泉 10二、场景光照及材质属性的设置 11三、交互设计 11四、程序运行效果图 12第13页共13页一、系统的初始化1.画图前的初始化本程序中光照的使用,首先由于模拟的室外场景且四面和天空都是有纹理构成,因此不能有明确的边界,必须关闭光照;其次小屋和石桌及树都仅展示材质,所以必须开启光照。为了便于程序统一,所以默认情况下开启光照、关闭纹理。glClearColor(0.1,0.4,0.8,0.0);glViewport(0,0,500,500); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glPushMatrix();glEnable(GL_AUTO_NORMAL);glEnable(GL_NORMALIZE); glDepthFunc(GL_LESS); //深度测试glEnable(GL_DEPTH_TEST); qobj=gluNewQuadric(); loadlight();pondcaculate();glFrontFace(GL_CCW);glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);glPixelStorei(GL_UNPACK_ALIGNMENT,1);2.数据载入2.1定义纹理选择图片:结合数字图像处理课程中队bmp图像读取技术,本程序使用的纹理是bmp位图。为避免复杂的调色板所以处理一律使用24位图;并且由于OpenGL纹理要求使用的宽和高都是2的n次幂。打开位图文件后将其中的图像数据存储到内存中们作为纹理数据的来源,由于位图文件的像素样式存储顺序为GBR,因此必须将其调整后方可以使用。使用glTexParaneteri和glTexImage2D定义纹理属性。voidreadimage(char*filename,BYTE*imagedata)//所读图片均为24位bmp,且宽度补齐至四字节边界{ BITMAPFILEHEADERbf;//文件头 BITMAPINFOHEADERbi;//信息头 intm_ImageWidth;//图象宽度 intm_ImageHeight;//图象高度 FILE*fp1;//文件指针,fp1为源文件 //打开文件,到文件指针 if((fp1=fopen(filename,"rb"))==NULL) { MessageBox(NULL,"文件打开错误","warning",MB_OK); } fread((LPSTR)&bf,sizeof(BITMAPFILEHEADER),1,fp1);//读取文件头,读取以后文件指针在文件头末尾(即信息头) fread((LPSTR)&bi,sizeof(BITMAPINFOHEADER),1,fp1);//读取信息头 m_ImageWidth=bi.biWidth;//给图象宽度赋值 m_ImageHeight=bi.biHeight;//给图象高度赋值 fread(imagedata,m_ImageHeight*m_ImageWidth*3,1,fp1);//读取图象数据 fclose(fp1);}voidadjustimage(BYTE*imagedata,intw,inth){ BYTEtemp; for(inti=0;i<w*h;i++) { temp=imagedata[i*3]; imagedata[i*3]=imagedata[i*3+2]; imagedata[i*3+2]=temp; }}voidloadtexture(){//侧面的纹理glGenTextures(5,&texName);glBindTexture(GL_TEXTURE_2D,texName);{ BYTEimagemoon[256][256][3]; //月亮的纹理 readimage("moon.bmp",&imagemoon[0][0][0]); adjustimage(&imagemoon[0][0][0],256,256); 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_RGB,256,256,0,GL_RGB,GL_UNSIGNED_BYTE,imagemoon);}{ BYTEimagesky[256][64][3]; readimage("starlow.bmp",&imagesky[0][0][0]); adjustimage(&imagesky[0][0][0],256,64); glBindTexture(GL_TEXTURE_2D,texName+1); 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_RGB,256,64,0,GL_RGB,GL_UNSIGNED_BYTE,imagesky);}{ BYTEimagefloor[256][256][3];//地面的纹理 readimage("floor.bmp",&imagefloor[0][0][0]); adjustimage(&imagefloor[0][0][0],256,256); glBindTexture(GL_TEXTURE_2D,texName+2); 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_RGB,256,256,0,GL_RGB,GL_UNSIGNED_BYTE,imagefloor);}{ BYTEimagedoor[256][256][3]; //栅栏面的纹理 readimage("door.bmp",&imagedoor[0][0][0]); adjustimage(&imagedoor[0][0][0],256,256); glBindTexture(GL_TEXTURE_2D,texName+3); 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_RGB,256,256,0,GL_RGB,GL_UNSIGNED_BYTE,imagedoor);}{ BYTEimageroof[128][128][3];//屋顶的纹理 readimage("roof.bmp",&imageroof[0][0][0]); adjustimage(&imageroof[0][0][0],128,128); glBindTexture(GL_TEXTURE_2D,texName+4); 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_RGB,128,128,0,GL_RGB,GL_UNSIGNED_BYTE,imageroof);}}2.2光照的载入使用一个方向光源,亮度稍暗。voidloadlight(){ GLfloatlight_ambient[]={0.8,0.8,0.8,1.0}; GLfloatlight_diffuse[]={0.6,0.6,0.6,1.0}; GLfloatlight_specular[]={0.6,0.6,0.6,1.0}; GLfloatlight_position[]={30.0,60.0,50.0,0.0}; glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient); glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse); glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular); glLightfv(GL_LIGHT0,GL_POSITION,light_position); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0);2.3显示列表的载入本程序中大多数模型绘图均用显示裂变完成,在纹理载入之后,载入显示列表,以供主绘图函数display调用。 drawwalllist=glGenLists(1); glNewList(drawwalllist,GL_COMPILE); glDisable(GL_LIGHTING); glEnable(GL_TEXTURE_2D); glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL); glBindTexture(GL_TEXTURE_2D,texName+3); glBegin(GL_QUADS); glTexCoord2f(0.0,0.0);glVertex3f(-150,-100,-150); glTexCoord2f(1.0,0.0);glVertex3f(150,-100,-150); glTexCoord2f(1.0,1);glVertex3f(150,100,-150); glTexCoord2f(0.0,1);glVertex3f(-150,100,-150); glTexCoord2f(0.35,0.35);glVertex3f(-150,100,-150); glTexCoord2f(0.35,1.0);glVertex3f(150,100,-150); glTexCoord2f(1.0,1.0);glVertex3f(150,100,150); glTexCoord2f(1.0,0.35);glVertex3f(-150,100,150); glEnd();3.对象模型的建立3.1空间背景空间由六个面的正长方体构成,长和宽为300,高为200,在绘图时按里面为逆时针绘制,关闭光照,直接贴纹理。voiddrawWalls() drawwalllist=glGenLists(1); glNewList(drawwalllist,GL_COMPILE); glDisable(GL_LIGHTING);//关闭光照,开启二维纹理 glEnable(GL_TEXTURE_2D); glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL); glBindTexture(GL_TEXTURE_2D,texName+3);//贴四周的纹理 glBegin(GL_QUADS); glTexCoord2f(0.0,0.0);glVertex3f(-150,-100,-150); glTexCoord2f(1.0,0.0);glVertex3f(150,-100,-150); glTexCoord2f(1.0,1);glVertex3f(150,100,-150); glTexCoord2f(0.0,1);glVertex3f(-150,100,-150); glTexCoord2f(0.35,0.35);glVertex3f(-150,100,-150); glTexCoord2f(0.35,1.0);glVertex3f(150,100,-150); glTexCoord2f(1.0,1.0);glVertex3f(150,100,150); glTexCoord2f(1.0,0.35);glVertex3f(-150,100,150); glEnd(); glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL); glBindTexture(GL_TEXTURE_2D,texName+1);//贴天空的纹理 glBegin(GL_QUADS); glTexCoord2f(0.0,1.0);glVertex3f(150,100,-150); glTexCoord2f(0.0,0.0);glVertex3f(150,-100,-150); glTexCoord2f(1.0,0.0);glVertex3f(150,-100,150); glTexCoord2f(1.0,1.0);glVertex3f(150,100,150); glTexCoord2f(0.0,1.0);glVertex3f(150,100,150); glTexCoord2f(0.0,0.0);glVertex3f(150,-100,150); glTexCoord2f(1.0,0.0);glVertex3f(-150,-100,150); glTexCoord2f(1.0,1.0);glVertex3f(-150,100,150); glTexCoord2f(1.0,1.0);glVertex3f(-150,100,-150); glTexCoord2f(0.0,1.0);glVertex3f(-150,100,150); glTexCoord2f(0.0,0.0);glVertex3f(-150,-100,150); glTexCoord2f(1.0,0.0);glVertex3f(-150,-100,-150); glEnd(); glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL); glBindTexture(GL_TEXTURE_2D,texName+2);//贴地面的纹理 glBegin(GL_QUADS); glTexCoord2f(0.0,0.0);glVertex3f(150,-100,-150); glTexCoord2f(1.0,0.0);glVertex3f(-150,-100,-150); glTexCoord2f(1.0,1.0);glVertex3f(-150,-100,150); glTexCoord2f(0.0,1.0);glVertex3f(150,-100,150); glEnd(); glDisable(GL_TEXTURE_2D);//关闭二维纹理光照,开启光照 glEnable(GL_LIGHTING); glEndList();}3.2月亮月亮的绘制由一个gluSphere函数绘制,为使月亮看起来更真实。贴上纹理,在这里纹理坐标计算使用自动纹理生成。voidMoon(){ moonlist=glGenLists(1); glNewList(moonlist,GL_COMPILE); glDisable(GL_LIGHTING); glEnable(GL_TEXTURE_GEN_S); glEnable(GL_TEXTURE_GEN_T); glEnable(GL_TEXTURE_2D); glTexGeni(GL_S,GL_TEXTURE_GEN_MODE,GL_SPHERE_MAP); glTexGeni(GL_T,GL_TEXTURE_GEN_MODE,GL_SPHERE_MAP); glEnable(GL_TEXTURE_2D); glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL); glBindTexture(GL_TEXTURE_2D,texName); gluSphere(qobj,25,20,20); glDisable(GL_TEXTURE_GEN_S); glDisable(GL_TEXTURE_GEN_T); glDisable(GL_TEXTURE_2D); glEnable(GL_LIGHTING); glEndList();}3.3小屋小屋的构建是用glut库中的glutSolidCone和glutSulidCube分别构成屋顶和房体,屋顶上使用自动计算纹理坐标贴上纹理,窗子和门用正方体通过几何变换构成。voidroof(){ rooflist=glGenLists(1); glNewList(rooflist,GL_COMPILE); glEnable(GL_TEXTURE_GEN_S); glEnable(GL_TEXTURE_GEN_T); glEnable(GL_TEXTURE_2D); glTexGeni(GL_S,GL_TEXTURE_GEN_MODE,GL_OBJECT_LINEAR); glTexGeni(GL_T,GL_TEXTURE_GEN_MODE,GL_OBJECT_LINEAR); glEnable(GL_TEXTURE_2D); glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL); glBindTexture(GL_TEXTURE_2D,texName+4); glutSolidCone(50,50,10,10); glTranslatef(-50,0,30); glutSolidCone(50,50,10,10); glDisable(GL_TEXTURE_GEN_S); glDisable(GL_TEXTURE_GEN_T); glDisable(GL_TEXTURE_2D); glEndList();}3.4树树是整个场景中较为复杂的部分,有三部分构成,树冠有一个球体构成,树干有一个上小下大的圆合成,树下的小土坡由二维求值器生成。voidtree(){ treelist=glGenLists(1); glNewList(treelist,GL_COMPILE); glPopMatrix(); glPushMatrix(); material(0.2,0.1,0.1,0.2,0.1,0.1,0.0,0.0,0.0); glTranslatef(0,10,0); glRotatef(-90,1,0,0); gluCylinder(qobj,6,2,40,20,10); glPopMatrix(); glPushMatrix(); glTranslatef(0,75,0); material(0.1,0.3,0.1,0.1,0.3,0.1,0.0,0.0,0.0); glScalef(0.7,1,0.7); gluSphere(qobj,30,20,20); glPopMatrix(); glPushMatrix(); glScalef(0.6,1,0.6); glRotatef(-90,1,0,0); glEnable(GL_TEXTURE_2D); glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL); glBindTexture(GL_TEXTURE_2D,texName+2); glEvalMesh2(GL_FILL,0,20,0,20); glDisable(GL_TEXTURE_2D); glEndList();}3.5桌子和凳子桌子和凳子由一个压扁的正方体做桌面,用一个上小下大的圆台做支柱;凳子由一个球体拉长在上面做一个正方体片构成。桌子和凳子均使用一种暗灰色的材质,无镜面反射。3.6喷泉喷泉程序的生成是用粒子运动。这段程序使用链表管理粒子的状态,每个粒子都有有关它们自身状态的一个数据结构。structparticle{floatt;//粒子的寿命floatv;//粒子的运动速度floatd;//粒子的运动方向floatx,y,z;//粒子的位置坐标floatxd,zd;//X和Z方向上的增量chartype;//粒子的状态(移动或淡化)floata;//粒子淡化的alpha值s

温馨提示

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

评论

0/150

提交评论