版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、计算机图形学课程设计报告题目 自然场景设计院(系、部)专业班级学号姓名成绩1设计目的与要求1.1设计题目自然场景设计1.2设计目的以小组合作的方式绘制一个自然场景,给绘制的实体添加纹理光照效果,进一步巩固所学知识,提高团队合作能力1 3设计要求(1) 采用真实感图形学技术设计一个自然场景(2) 模拟出水、云、山体等至少三种景物(3) 实现场景的漫游(4) 对设计出的图像进行光照处理(5) 将图片的纹理贴附到物体表面2总体设计2.1功能简介创建一个900*600的windows窗口,在窗口中显示冰箱、电灯、茶壶三个实体,根据电灯位 置在地面上绘制个实体的投影;为茶壶添加纹理;利用键盘的方向键控制
2、冰箱旋转,实现场 景漫游2. 2功能模块图2. 3软件各模块功能介绍2. 3.1冰箱和茶壶的绘制由四边形拼接出冰箱,通过平移旋转函数放置到指定位置,同时实现茶壶的绘制,在茶壶上添加纹理效果,通过平移旋转变换放置到冰箱上面2. 3. 2顶灯的绘制绘制出一个带灯罩的电灯,并且将光源放置在灯泡的位置2. 3. 3设置光照设置光照的各种参数,为场景添加光照效果,让实体具有立体效果2. 3.4纹理图片生成用数组存储一幅自己设计的纹理图片,方便实体添加纹理效果时的调用2. 3. 5影子生成根据需求为场景中的实体添加阴影效果,使得场景效果更加逼真2. 3. 6法向量设置为场景设置法向量,确保实体在不同的角度
3、都能被看到3详细设计及关键代码3. 1光照模块详细设计3.1.1光照设置功能设置光照的各种参数,为场景添加光照效果,让实体具有立体效果3.1.2光照设置设计1设置光照的初值包括:环境光照强度、漫反射光照强度、镜面反射光照强度、光源位置2在实体绘制函数中开启光照效果3.1.3具体代码实现glfloatambient light = 0. 3f, 0. 3f,1. 3f,1.of;glfloatdiffuselight= 0. 7f, 0. 7f,0. 7f,1.of;glfloat specular = 1. of, 1. of, 1. of, 1. of ;glfloatlightpos =
4、346. of, 400. of,-20. of,0.of ;glfloatspecref = 1. of,1. of, 1. of,1. of;void light (void)/光照函数glfloat points3 3 = -30. of, -149. of, -400. of , -30. of, -149. of, -420. of , 40. of, -149. of, -420. of ;glenable(gl depth test);glmatrixmode(gl projection);glfrontface(gl_ccw);/ counter clock-wise poly
5、gons face outglenable(gl cull face);g1materia1fv(gl_front_axd_back, gl_ambient, ambientlight); glmaterialfv(gl_front_axd_back, gl_dtffuse, diffuselight); glmaterialfv(gl ekont and. back, gl specular, specular): glmaterialf(gl_front_and_back, gl_shininess, 75); gllightfv(gl lighto,gl ambient, ambient
6、light);gllightfv (gl_light0, gl_diffuse, mffuselight); gllightfv(gl_ltghto, gl_specular, specular); gllightfv(gl 丄ighto, gl position, lightpos);glenable(gl_lighto);glenable(gl color material);glcolormaterial(gl_froxt, gl_ambient_axd_diffuse); glmaterialfv(gl_front, gl_specular, specref);glmateriali(
7、gl front, gl shininess, 128): glclearcolor(0. 4f, 0. 3f, 0. 6f, 1. of);gldepthfunc(gl less);glenable(gl_auto_normal);glenable(gl_normaltze); glfrontface(gl_ cw);3.1.4光照设置限制条件光源位置设置必须在预先设置好的空间中3.2纹理模块设置3.2.1纹理设置模块功能用数组存储一幅自己设计的纹理图片,通过设置对应坐标在指定的实体上添加纹理效果3. 2. 2纹理添加模块设计1>.利用三维数组存储纹理图片中每个点的颜色值,在给实体添加
8、纹理时调用纹理图片生成函数,将三维数组中存储的纹理图案添加到实体上2>.从文件中读取一张图片,按照需要将纹理图片添加到对应的实体上3. 2. 3纹理添加模块数据结构描述1>.所用数据结构为一个三维数组,用于存储纹理图片的每点颜色值2>.文件存储纹理图片3. 2. 4纹理添加模块具体实现代码1>.纹理图片自己绘制void get_mandeldrot_iinage(void)/生成纹理图片double min_a, max_a, min_b, max_b, stcp_a, stcp_b, a, b;int n=64,x, y, k, t;/n=180 for a juli
9、a setfloat scale二255. 0/n, width二300, height=400;for (x二0; x<width; x+)/b=min_b;for ( y=0; y<height; y+)k二(x/80+2)%2;t=(y/50+2)%2;if(t=o&&k=o)mandelbrot imagexy0=255;mandelbrot_imagexy1=255; mandelbrot_imagexy2=0;elsemandelbrot_imagexy0=255;mandelbrot_imagexyl=0; mandelbrot imagexy2=25
10、5;给实体添加纹理glpushattrib(gl_all_attrib_bits);glgentextures(l, &texture):glbindtexture(gl_texture_2d, texture);gltexparameteri(gl_textlre_2d, gl_texture_mag_filter, gl_nearest); gltexparameteri (gl textire 21), gl texture min filter, gl nearest);gltcxenvi(gl_textcre_env, gl_texture_env_mode, gl_repl
11、ace);get mandeldrot image();glteximage2d(gl_texture_2d, 0, gl_rgb, 300, 400, 0, gl_rgb, gl_unsigned_byte, hkindelbrot_image);glenable(gl texture 2d);glmatrixmodc(gl_textire);glmatrixmode(gl modelview);glcolor3f(1.0, 1.0, 0. 00);/glrotatef(90, l.of, 0. of, 0. of):gltranslated (0. of, 118. of, 一40. of
12、);glutsolidtcapot (15) ;/绘制茶壶 glpopattribo ;2>.纹理图片由文件读入aux kgbimagerec *loadbmp(char *eilename)/ 载入位图图象file *尺订e=null;文件句柄if (!filename)return null;file=fopen(filename, "abc");if (mie)fclose(f订e);return auxdlblmagcloacla(filcname);return null;int loaclgltcxturcs ()int status二false;aux_
13、rgbiinagerec *textur*etmagel;memset (textureimage, 0, sizeof (void *)*1);if (textureimage0 =loaclbmp(''menu, bmp")status二true;glgentextures(1, &texture0);glbindtexture(gl_texture_2d, texture0);/生成纹理glteximage2d(gl_texture_2d, 0, 3, textureimage0->sizex,textureimage0->sizey, 0,
14、 gl rgb, gl unsigned byte,textureimage0->data);gltexparaineteri(gl_textire_2d, gl_texture_min_f1lter, gl_linear) ; / 线形滤波 gltexparameteri(gl_texture_2d, gl_texture_mag_ftlter, gljjnear) ; / 线形滤波 if (texturclmageoj)if (texturelmageoj->data)free (textureimage0->data);free (texturelmage0);retu
15、rn status;/ 返回 status3. 2. 5纹理添加模块限制条件纹理图片添加时应注意比例3. 3法向量设置模块3. 3.1法向量设置模块功能为场景设置法向量,确保实体在不同的角度都能被看到3.3.2法向量设置模块设计首先用两个点算出一个向显,用同样的方法计算出另外一个向晁,对求的的两个向量做笛卡尔积求出平面的法向量3. 3.2法向量设置模块数据结构利用数组存储每个点的坐标值3.3.4法向量设置模块具体实现代码void calcnormal(float v33, float out3)float vl 31,丫2;staticconstintx =0:staticconstinty
16、=1;staticconstintz 二2;/ calculatetwo vectors from the three pointsvlx = v0 x - vlx;vly = v0y 一 vly;vlz = v0z 一 vlz;v2xj = vlx 一 vx;v2y = vly - v2y;v2z = vl z - vz;/ take the cross product of the two vectors to get/ the normal vector which wi11 be stored in outout x=vl y*v2z-vlz*v2y;outy=vl z*v2 x-vl
17、 x*v2z;outz=vlx*v2y-vly*v2x;/ normalize thevector(shortenlength to on巳)reducetounit (out);3. 4影子生成模块详细设计3.4.1影子生成模块功能根据需求为场景中的实体添加阴影效果,使得场景效果更加逼真3. 4. 2影子生成模块设计将所需要添加阴影效果的实体与投影面做求交运算,得到一个边界,将这个区域填充为黑色实现阴影效果3. 4. 3影子生成模块具体实现代码void drawjet(bool bshadow)float normal3;/ storeage for calculated surface n
18、onnal/ nose cone 111/1/i/ set material color, note we only have to set to black/ for the shadow onceif (!bshadow)glcolor3ub (0, 255, 200);else设置填充颜色为黑色 glcolor3ub(0, 0, 0);实体各点坐标3. 5顶灯绘制模块3. 5.1顶灯绘制模块功能绘制出一个带灯罩的电灯,并且将光源放置在灯泡的位置3. 5. 2顶灯绘制模块设计灯泡的绘制调用opengl库函数glutsol idsphere ()绘制一个球并为其添加颜色2>.灯罩绘制和
19、电线绘制调用opengi库函数glbegin(gl_quads)绘制一个独立填充四边形为其设置颜色,通过平移变换放置到合适位置,电线绘制与灯罩绘制方法类似3. 5. 3顶灯绘制模块具体实现代码void draw lampo/绘制电灯glcolor3f(. of, .of, .of);gl begin(gl_quads); 电线glvcrtcx3f(345, 500, -200);glvertex3f(347,500,-200);glvertex3f(347, 380,-200);glvertex3f(345, 380,-200);glendo ;glcolor3f(. of, 1. of,.
20、of);灯罩/glbegin(gl triangles);glbegin(gl_quads);glvertex3f(347,380,-200);glvertex3f(367, 360,-200);glvertex3f(325, 360,-200);glvertex3f(345,380,-200);glendo ;glcolor3f(2. of, 2. of,. of);灯泡gltranslated (346. of, 362. of, -200. of);glscalcf(0. 4, 0. 4, 0. 4);glutsolidsphere(25. of, 10, 10);3. 5. 4顶灯绘制
21、模块限制条件绘制j实体时应该注意绘制的先后顺序,最先绘制的实体将遮挡后面绘制的实体3. 6冰箱和茶壶绘制模块3. 6.1冰箱茶壶绘制模块功能由四边形拼接出冰箱,通过平移旋转函数放置到指定位置,同时实现茶壶的绘制,在茶壶上 添加纹理效果,通过平移旋转变换放置到冰箱上面3. 6. 2冰箱茶壶绘制模块设计1>.冰箱绘制调用opengl库函数g i beg i n (gl.quads)根据设计要求绘制独立填充四边形,由多个四边 形 组合成冰箱2>.茶壶绘制调用opengl库函数glutsol idteapot ();绘制一个茶壶,通过平移旋转变换放置到指定位3. 6. 3冰箱茶壶绘制模块具
22、体实现代码绘制冰箱void draw_refrigerator () /绘制冰箱glpushmatrix 0;glcolor3f( 0. of, l.of, 0. of); gltranslated (210. of, 230. of, -40. of); glscalef (0. 6, 0. 6, 0. 6);glrotatef (yrot, 0. of, 1. of, 0. of); glutsolidteapot (12);/绘制茶壶 glpopmatrixo ;glpushmatrix ();glcolor3f (. of,. of,. of); glbcgin(gl_lines);g
23、lvertex3f(210. of, 230. of, -40. of); glvertex3f(165, 200,-50);glvertex3f(210. of, 230. of, -40. of); glvertex3f(215, 200, -50);glvcrtcx3f(210. of, 230. of, -40. of); glvertex3f(190,210, -90);glvertex3f(210. of, 230. of, -40. of); glvertex3f(240,210, -90);glend();glcolor3f(. of,. of,. of); glbegin(gl_quads);glvertex3f(165, 100, -50); glvertex3f(165, 102,-50); glvertex3f(215, 102, -50); glvertex3f(215, 100,-50);glendo ;glcolor3f(. of, .of, .of);glbegin(gl quads);glvertex3f(165, 130, -50);glvertex3f(165, 132, -50);glvertex
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 水粉烟花课件教学课件
- 出游应急预案
- 旅游业安全规范解析
- 2024年大型并网风力发电机组发电机项目资金需求报告代可行性研究报告
- 物业小区危险源识别
- 吉林省2024七年级数学上册第1章有理数1.7有理数的减法课件新版华东师大版
- 彩色的雨教案反思
- 建筑业薪酬政策
- 林业安防施工合同
- 影视制作薪酬管理
- 小学语文古诗词教学探究的开题报告
- 动静脉内瘘栓塞的原因分析及干预措施课件
- 小学一年级10以内加减法口诀表
- 换热站的安装调试
- 幼儿园中班数学鲜花分一分教案ppt【幼教课件】
- 防洪评价课件
- 普通地质学教材
- 我的连衣裙【经典绘本】
- 农村公路畅通工程质量检测方案第三方检测及交工验收
- 急性冠脉综合征特殊人群抗血小板治疗中国专家建议解读
- 1 220kV外护套电缆试验报告
评论
0/150
提交评论