您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 计算机图形学课程设计
计算机图形学《计算机图形学》课程设计(2015----2016学年第二学期)学院专业班级学号学生姓名老师编写日期:2016年xx月xx日2/42目录真实感游戏场景绘制.......................................................................................3一实验目的......................................................................................................3二实验内容......................................................................................................3三实验分工......................................................................................................4四理论基础......................................................................................................41雾化模型...............................................................................................42颜色模型...............................................................................................53光照模型...............................................................................................64纹理模型...............................................................................................6五系统描述....................................................................................................131墙壁、地面、箱子.............................................................................132石柱、雪人.........................................................................................143玻璃球.................................................................................................154天空.....................................................................................................17六心得体会....................................................................................................19七附录:程序源代码....................................................................................19计算机图形学3/42真实感游戏场景绘制【摘要】本次课程设计绘制了一个真实感的三维场景,并实现场景漫游。主要绘制了墙壁与地面、天空、石柱、箱子、玻璃球、雪人、雾等对象。以VisualStudio2012为平台用OpenGL基础知识实现此真实感场景的绘制。一实验目的1.熟悉OpenGL基础函数,并了解其用法。2.通过程序模拟真实感游戏场景,掌握图形综合展示效果,基于专业背景,结合实验课内容与课程设计要求,使用OpenGL绘制简单的3D真实感游戏场景,包括光栅化算法、多边形裁剪计算以及消隐算法在场景绘制中的应用。二实验内容和效果光栅化算法、多边形裁剪计算以及消隐算法在场景绘制中的应用,其中真实感场景绘制包括颜色模型、纹理模型、雾化模型、运动模型以及环境光、漫反射、镜面反射等光照模型设置。图1游戏场景整体效果4/42三实验分工本次课程设计实验,小组成员齐心协力。首先从自己尝试编写没有成功到后来的各种搜集资料,寻找3D游戏场景的绘制代码,到最后小组成员分工解析代码并注释,做PPT,演讲PPT等,大家合作都很用心。这次的实验中我们小组每个成员在每一个环节都参与任务,因代码过多,也都参与到代码解析中。具体安排如下:姓名任务xxx搜集资料,代码解析注释,做PPT,PPT演讲xxx搜集资料,代码解析并注释,做PPT,PPT演讲xxx搜集资料,代码解析注释,做PPT,PPT演讲xxx搜集资料,代码解析注释,做PPT,PPT演讲四理论基础1雾化模型OpenGL中提供了完整的雾化接口,我们只需要选择合适的雾气的混合因子、密度、颜色、起始位置等。在OpenGL中,雾的工作模式有两种:线性模式和指数模式。这两种模式是根据雾的浓度变化来区分的。在线性模式下,只需要提供一个距离视点的开始位置和结束位置。从开始位置到结束位置之间,雾的浓度越来越高,浓度的变化和距离成正比。在指数模式下,雾的浓度随着距离的增加呈指数增长。这种模式通常用来用于烟雾、烟幕等效果。glFogf(GL_FOG_START,1.0f)确定了雾的开始初离屏幕有多近。glFogf(GL_FOG_END,5.0),它告诉OpenGL雾能离开屏幕有多远glHint(GL_FOG_HINT,GL_DONT_CARE)确定了雾的渲染方式,使用GL_DONT_CARE是因为并不关心建议值。这个项的不同值之间的区别:计算机图形学5/42GK_DONT_CARE:让OPENGL自己来确定雾的渲染方式,每顶点或是每像素。GL_NICEST:对每一像素进行雾的渲染,它看起来是极棒的。GL_FASTEST:对每一顶点进行雾的渲染,它速度较快,但是不够美丽我们的雾气设置如下:修改函数里面的参数改变雾的颜色和浓度:图2改变颜色(蓝色)和浓度的雾气2颜色模型OpenGL支持两种颜色模式:一种是RGBA,一种是颜色索引模式。不同的是,RGBA模式中,数据直接就代表了颜色;而颜色索引模式中,数据代表的是一个索引,要得到真正的颜色,还必须去查索引表。RGBA颜色6/42RGBA模式中,每一个像素会保存以下数据:R值(红色分量)、G值(绿色分量)、B值(蓝色分量)和A值(alpha分量)。其中红、绿、蓝三种颜色相组合,就可以得到我们所需要的各种颜色,而alpha不直接影响颜色。3光照模型光照模型包括许多因素,如物体的类型,物体相对光源与其他物体的位置以及场景中所设置的光源属性,物体的透明度,物体的表面光亮程度,甚至物体的各种表面纹理等。光照到物体表面时,物体对光会发生反射、透射、吸收、衍射、折射和干涉。通常观察不透明、不发光的物体,人眼所观察到的是从物体表面的得到的反射光,它是由场景中的光源和其他物体表面的反射光共同作用产生的。简单光照明模型模拟物体表面对直接光照的反射作用,包括镜面反射和漫反射,而物体间的光反射作用没有被充分考虑到,仅仅用一个与物体周围和视点、光源位置都无关的环境光常量来近似表示。可以用如下表达式表示:入射光=环境光+漫反射+镜面反射光4纹理模型(因为我们的场景大量使用了纹理模型,且我主要也负责纹理模型,因此处会详细解释。)我们都知道物体表面通常并不是具有简单颜色的平滑面,而是有着花纹图案等丰富细节的。计算机三维图形通过给面贴纹理来表现表面细节。OpenGL默认设置是关闭贴纹理的,所以必须先用命令打开纹理计算。计算机图形学7/42glEnable(GL_TEXTURE_2D);//启用二维纹理glDisable(GL_TEXTURE_2D);//禁用二维纹理1、启用纹理和载入纹理如同我们曾经学习过的OpenGL光照、混合等功能一样。在使用纹理前,必须启用它。OpenGL支持一维纹理、二维纹理、三维纹理和四维纹理。一般情况下使用二维纹理即可。使用纹理前,必须载入纹理。利用glTexImage2D函数可以载入一个二维的纹理,该函数有多达九个参数,glTexImage2D(GL_TEXTURE_2D,Glintlevel,Glintcomponents,Glsizeiwidth,GlsizeiHeight,Glintorder,Glenumype,constGlvoid*pixels)详细说明如下:第一个参数为指定的目标,在我们的入门教材中,这个参数将始终使用GL_TEXTURE_2D。第二个参数为“多重细节层次”,现在我们并不考虑多重纹理细节,因此这个参数设置为零。第三个参数有两种用法。在OpenGL最初的版本中,使用整数来表示颜色分量数目,例如:像素数据用RGB颜色表示,总共有红、绿、蓝三个值,因此参数设置为3,而如果像素数据是用RGBA颜色表示,总共有红、绿、蓝、alpha四个值,因此参数设置为4。而在后来的版本中,可以直接使用GL_RGB或GL_RGBA来表示以上情况,显得更直观。注意:虽然我们使用Windows的BMP文件作为纹理时,一般是蓝色的像素在最前,其真实的格式为GL_BGR而不是GL_RGB,在数据的顺序上有所不同,但因为同样是红、绿、蓝三种颜色,因此这里仍然使用GL_RGB。如果使用GL_BGR,OpenGL将无法识别这个参数,造成错误。第四、五个参数是二维纹理像素的宽度和高度。在使用纹理时要特别注意其大小,必须使用大小为2的整数次方的纹理。在很长一段时间内,很多图形程序都喜欢使用256*256大小的纹理,不仅因为256是2的整数次方,也因为某些硬件可以使用8位的整数来表示纹理坐标,2的8次方正好是256,这一巧妙的组合为处理纹理坐标时的硬件优化创造了一些不错的条件。第六个参数是纹理边框的大小。8/42最后三个参数分别是纹理的图像数据格式,数据类型和纹理图像的像素数据的存储地址。举个例子,如果有一幅大小为width*height,格式为Windows系统中使用最普遍的24位BGR,保存在pixels中的像素图像。则把这样一幅图像载入为纹理可使用以下代码:glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,width,height,0,GL_BGR_EXT,GL_UNSIGNED_BYTE,pixels);下面一段为我们的游戏场景中的载入纹理的代码://对于指定的多个纹理,要根据自己的需要映射到不同的面上,需要对位图创建一个数组,//用来存储位图的名称,然后在初始化OpenGL的时候,可以读取这些位图,然后生成多个纹理存储到一个纹理数组中,接着就可以指定绘制的某个面,对该指定的面进行纹理映射//加载位图AUX_RGBImageRec*LoadBMP(char*Filename)//根据位图文件的名称进行加载。AUX_RGBImageRec定义纹理数据的格式{FILE*File=NULL;//文件指针if(!Filename)//确保文件名已提供{returnNULL;//如果没有提供,返回null}File=fopen(Filename,r);//根据指定的位图文件名称,打开该位图文件if(File)//
本文标题:计算机图形学课程设计
链接地址:https://www.777doc.com/doc-5516965 .html