版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、西安科技大学计算机图形学课程设计题目: 长方体体的光照效果 专业班级: 信计1102班 小组成员:陈维多1108060216 邹世林1108060224 左 力1108060225 李 优1108060229日期: 2013年1月2日 目录一 课程设计题目 31.题目要求 32.任务 3二 任务分析算法介绍 3 1.任务分析 3 2.算法介绍 4三 总体设计 5 1.定义三维齐次向量结构体 5 2.定义三维齐次坐标结构 53.定义面的结构 64.定义点的结构 65.长方体顶点定义及初始化 7 6. 面表 77.定义点光源、视线方向、光照方向 88.各面可见性计算和判断 99.窗口-视区变换 1
2、110.路径填充 12四 流程图 13五 源程序 14六 程序运行效果图 27七 总结 28参考文献 29一、 课程设计题目 长方体体的光照效果1.题目要求对长方体,建立一个点光源,采用环境光和点光源漫反射光的光照模型,应用flat明暗处理方法,显示平行投影后的长方体光照效果。2.任务本题目主要包括五个任务,1)长方体表面模型的建立 2)长方体的可见面判断 3)可见面的背光性判断4)可见面光照计算5)可见面光照效果显示附加:通过键盘上下左右按键对图形进行旋转二、 任务分析算法介绍1.任务分析任务1)中,定义三维齐次坐标结构和面的结构;定义顶点表和面表,对长方体绕x轴旋转和绕y轴旋转。任务2)中
3、对每一个面计算其外法向量及可见性任务3)中对每个可见面计算其光线向量,并判断其是否为背光面。任务4)计算每个见光面的环境光和点光源的漫反射分量。任务5)用该面的光强显示该可见面附加: 人机交互2.算法介绍1)旋转变换绕x轴旋转变换的坐标表示绕y轴旋转变换的坐标表示2) 平行投影在xoy平面投影后坐标3) 环境光模型 物体没有受到光源的直射,但其表面仍有一定亮度,这是由于环境光的作用。表示环境光反射强度表示环境光反射率表示环境光入射强度4)漫反射光模型漫反射光可认为是在点光源的照射下,光被物体表面吸收后,然后重新反射出来的光。表示漫反射光强度表示漫反射反射率表示点光源入射强度大小入射光与物体表面
4、法矢量夹角三、总体设计1.定义三维齐次向量结构体typedef struct vector3d float x; float y; float z; int f; /f表示所在的平面的编号vector;2. 定义三维齐次坐标结构typedef struct taghomocoordfloat x;float y;float z;float w;homocoord;3.定义面的结构typedef struct tagplaneint v0, v1, v2, v3;vector n; /外法向量homocoord center; /中心点float id; /漫反射光强int flag;/标识符f
5、loat kd; /漫反射率float ka; /环境光反射率float ie; /环境光反射光强float i; /光强plane;4.定义点的结构typedef struct tagmypointfloat x,y;mypoint;5.长方体顶点定义及初始化pts=new homocoordptn; pts0.x= 1;pts0.y= 2; pts0.z= 1; pts0.w=1;pts1.x= -1; pts1.y= 2; pts1.z= 1; pts1.w=1;pts2.x= -1; pts2.y= -2; pts2.z= 1; pts2.w=1;pts3.x= 1;pts3.y= -
6、2; pts3.z= 1; pts3.w=1;pts4.x= 1;pts4.y= 2; pts4.z= -1; pts4.w=1;pts5.x= -1; pts5.y= 2; pts5.z= -1; pts5.w=1;pts6.x= -1; pts6.y= -2; pts6.z= -1; pts6.w=1;pts7.x= 1;pts7.y= -2; pts7.z= -1; pts7.w=1;6.面表 fn=6;faces=new planefn;faces0.v0=0; faces0.v1=1; faces0.v2=2; faces0.v3=3; faces1.v0=4; faces1.v1=
7、5; faces1.v2=1; faces1.v3=0; faces2.v0=5; faces2.v1=6; faces2.v2=2; faces2.v3=1; faces3.v0=6; faces3.v1=7; faces3.v2=3; faces3.v3=2; faces4.v0=7; faces4.v1=4; faces4.v2=0; faces4.v3=3; faces5.v0=7; faces5.v1=6; faces5.v2=5; faces5.v3=4;7.定义点光源、视线方向、光照方向1)点光源illuminant.x = -100;illuminant.y = -100;il
8、luminant.z = 100;ia = 0.5;/环境光入射强度ip = 0.5;/漫反射入射光强度2)视线方向vector eye_vec;eye_vec.x = 0;eye_vec.y = 0;eye_vec.z = -1;3)定义光照方向light_vec = new vectorfn;vectorvector62 ;for(i=0; i6; i+)vectori0 = calculatevector(ptsfacesi.v0, pts facesi.v1, i );vectori1 = calculatevector(ptsfacesi.v0, pts facesi.v2, i )
9、;8.各面可见性计算和判断1)计算各个面的外法向量faces0.n = veccross(vector00, vector01 );for(i=0; i6; i+)facesi.n = veccross(vectori0, vectori1 );2)各个面的可见性判定float cos_angle;for(i=0; i0)facesi.flag = visiable; elsefacesi.flag = unvisiable;3)计算各个面的中心点for(i=0; ifn; i+)facesi.center.x = (ptsfacesi.v0.x+ptsfacesi.v1.x+ptsfaces
10、i.v2.x+ptsfacesi.v3.x)/4.0f ;facesi.center.y = (ptsfacesi.v0.y+ptsfacesi.v1.y+ptsfacesi.v2.y+ptsfacesi.v3.y)/4.0f ;facesi.center.z = (ptsfacesi.v0.z+ptsfacesi.v1.z+ptsfacesi.v2.z+ptsfacesi.v3.z)/4.0f ;facesi.center.w = (ptsfacesi.v0.w+ptsfacesi.v1.w+ptsfacesi.v2.w+ptsfacesi.v3.w)/4.0f ;4)计算各个面的光照方向f
11、or(i=0; ifn; i+)light_veci = calculatevector(illuminant, facesi.center, eof);5)计算各个面的漫反射光强for(i=0; ifn; i+)facesi.id = ip*facesi.kd*(-1)*(innerproduct(facesi.n, light_veci)/(getmodule(facesi.n)*getmodule(light_veci);6)计算各个面环境光反射光强for(i=0; ifn; i+)facesi.ie = facesi.ka*ia;7)计算各个面光强(漫反射光强和环境反射光强之和)for
12、(i=0; ifn; i+)facesi.i = facesi.id+facesi.ie ;/窗口-视区变换实现过程float wxl=-5,wxr=5,wyb=-5,wyt=5;int vxl=0,vxr=800,vyb=0,vyt=600;9.窗口-视区变换int a = (int)(vxr-vxl)/(wxr-wxl);int b = (int)(vxl-wxl*a);int c = (int)(vyt-vyb)/(wyt-wyb);int d = (int)(vyb-wyb*c);for(i=0;iptn;i+)pts2di.x = a*ptsi.x+b;pts2di.y = c*pt
13、si.y+d;10. 路径填充cbrush brush;brush.createsolidbrush(rgb(facesj.i*255,facesj.i*255,facesj.i*255+40);pd.selectobject(&brush);pd.beginpath();pd.moveto(p0);for(int i=1;i4;i+)pd.lineto(pi);pd.lineto(p0);pd.endpath();pd.fillpath();brush.deleteobject();四、流程图五、源程序draw3dview.h文件/定义三维齐次向量结构体typedef struct vect
14、or3dfloat x;float y;float z;int f; /f表示所在的平面的编号vector;/定义三维齐次坐标结构typedef struct taghomocoordfloat x;float y;float z;float w;homocoord;/定义面的结构typedef struct tagplaneint v0, v1, v2, v3;vector n; /外法向量homocoord center; /中心点float id; /漫反射光强int flag;float kd; /漫反射率float ka; /环境光反射率float ie; /环境光反射光强float
15、 i; /光强plane;/定义点的结构,需要浮点数的x,ytypedef struct tagmypointfloat x,y;mypoint;public:vector calculatevector(homocoord start, homocoord end, int face);/计算一个3维向量的函数,/从start点指向end点的属于face面的向量vector veccross(vector vec1, vector vec2);/计算两个向量叉积,即外法向量float innerproduct(vector vec1, vector vec2);/计算两个向量的内积float
16、 getmodule(vector vec); /计算向量的模void rotatey(int angle); /绕y轴逆时针旋转void rotatex(int angle); /绕x轴逆时针旋转void drawmy3dgraphics(); /绘制长方体virtual cdraw3dview();protected:homocoord illuminant; /定义光源坐标float ip; /定义光源光强float ia; /环境光光强vector *light_vec; /各个面的光照方向指针homocoord *pts; /三维顶点指针mypoint *pts2d; /自定义的二维
17、浮点数结构,表示变换后的二维点plane *faces; /长方体的面指针int ptn,fn; /顶点个数与面的个数draw3dview.cpp文件int x_angle = 0;int y_angle = 0;void cdraw3dview:drawmy3dgraphics()int i;/形体定义ptn=8;pts=new homocoordptn; /设置长方体pts0.x=1;pts0.y=2;pts0.z=1; pts0.w=1;pts1.x=-1; pts1.y=2;pts1.z=1; pts1.w=1;pts2.x=-1; pts2.y=-2; pts2.z=1; pts2.
18、w=1;pts3.x=1;pts3.y=-2; pts3.z=1; pts3.w=1;pts4.x=1;pts4.y=2;pts4.z=-1; pts4.w=1;pts5.x=-1; pts5.y=2;pts5.z=-1; pts5.w=1;pts6.x=-1; pts6.y=-2; pts6.z=-1; pts6.w=1;pts7.x=1;pts7.y=-2; pts7.z=-1; pts7.w=1;/给定义面的指针分配内存;fn=6;faces=new planefn;/设置立方体各面faces0.v0=0; faces0.v1=1; faces0.v2=2; faces0.v3=3; f
19、aces1.v0=4; faces1.v1=5; faces1.v2=1; faces1.v3=0; faces2.v0=5; faces2.v1=6; faces2.v2=2; faces2.v3=1; faces3.v0=6; faces3.v1=7; faces3.v2=3; faces3.v3=2; faces4.v0=7; faces4.v1=4; faces4.v2=0; faces4.v3=3; faces5.v0=7; faces5.v1=6; faces5.v2=5; faces5.v3=4; pts2d=new mypointptn;for(i=0; ifn; i+)fac
20、esi.ka = 0.8;facesi.kd = 0.8;/定义点光源illuminant.x = -100;illuminant.y = -100;illuminant.z = 100;ia = 0.5;ip = 0.5;/定义视线方向vector eye_vec;eye_vec.x = 0;eye_vec.y = 0;eye_vec.z = -1;/定义光照方向light_vec = new vectorfn;/旋转调用rotatex(x_angle); rotatey(y_angle);/定义并计算各个面的两条相交的向量vectorvector62 ;for(i=0; i6; i+)ve
21、ctori0 = calculatevector(ptsfacesi.v0, pts facesi.v1, i );vectori1 = calculatevector(ptsfacesi.v0, pts facesi.v2, i );/计算各个面的外法向量faces0.n = veccross(vector00, vector01 );for(i=0; i6; i+)facesi.n = veccross(vectori0, vectori1 );/各个面的可见性判定float cos_angle;for(i=0; i0)facesi.flag = visiable; elsefacesi.
22、flag = unvisiable;/计算各个面的中心点for(i=0; ifn; i+)facesi.center.x = (ptsfacesi.v0.x+ptsfacesi.v1.x+ptsfacesi.v2.x+ptsfacesi.v3.x)/4.0f ;facesi.center.y = (ptsfacesi.v0.y+ptsfacesi.v1.y+ptsfacesi.v2.y+ptsfacesi.v3.y)/4.0f ;facesi.center.z = (ptsfacesi.v0.z+ptsfacesi.v1.z+ptsfacesi.v2.z+ptsfacesi.v3.z)/4.0
23、f ;facesi.center.w = (ptsfacesi.v0.w+ptsfacesi.v1.w+ptsfacesi.v2.w+ptsfacesi.v3.w)/4.0f ;/计算各个面的光照方向for(i=0; ifn; i+)light_veci = calculatevector(illuminant, facesi.center, eof);/计算各个面的漫反射光强for(i=0; ifn; i+)facesi.id = ip*facesi.kd*(-1)*(innerproduct(facesi.n, light_veci)/(getmodule(facesi.n)*getmod
24、ule(light_veci);/计算各个面环境光反射光强for(i=0; ifn; i+)facesi.ie = facesi.ka*ia;/计算各个面光强for(i=0; ifn; i+)facesi.i = facesi.id+facesi.ie ;/平行投影变换for(i=0;iptn;i+)ptsi.x=ptsi.x;ptsi.y=ptsi.y;/ 窗口-视区变换int a = (int)(vxr-vxl)/(wxr-wxl);int b = (int)(vxl-wxl*a);int c = (int)(vyt-vyb)/(wyt-wyb);int d = (int)(vyb-wyb
25、*c);for(i=0;iptn;i+)pts2di.x = a*ptsi.x+b;pts2di.y = c*ptsi.y+d;/图形显示cclientdc pd(this);cpoint p4;for(int j=0; j6; j+)if(facesj.flag=visiable)p0=cpoint(pts2dfacesj.v0.x,pts2dfacesj.v0.y);p1=cpoint(pts2dfacesj.v1.x,pts2dfacesj.v1.y);p2=cpoint(pts2dfacesj.v2.x,pts2dfacesj.v2.y);p3=cpoint(pts2dfacesj.v
26、3.x,pts2dfacesj.v3.y);/dc.selectobject(pold); /把画笔设置为原来的cbrush brush;/(dkgray_brush,rgb(64,64,64);brush.createsolidbrush(rgb(facesj.i*255,facesj.i*255,facesj.i*255+40);pd.selectobject(&brush);pd.beginpath();pd.moveto(p0);for(int i=1;i4;i+)pd.lineto(pi);pd.lineto(p0);pd.endpath();pd.fillpath();brush.
27、deleteobject();void cdraw3dview:rotatex(int angle) /绕x轴逆时针旋转float a=angle*pi/180;for(int i=0;iptn;i+)float y,z;y=ptsi.y; z=ptsi.z;ptsi.y=y*cos(a)-z*sin(a);ptsi.z=y*sin(a)+z*cos(a);void cdraw3dview:rotatey(int angle) /绕y轴逆时针旋转float b=angle*pi/180;for(int i=0;iptn;i+)float x,z;x=ptsi.x; z=ptsi.z;ptsi.
28、x=x*cos(b)+z*sin(b);ptsi.z=-x*sin(b)+z*cos(b);vector cdraw3dview:calculatevector(homocoord start, homocoord end, int face)/计算一个3维向量的函数,从start点指向end点的属于face面的向量 vector tempvector;tempvector.x = end.x-start.x;tempvector.y = end.y-start.y;tempvector.z = end.z-start.z;tempvector.f = face;return tempvect
29、or;vector cdraw3dview:veccross(vector vec1, vector vec2)/计算两个向量叉积,即外法向量vector tempnvector;tempnvector.x = (1)*(vec1.y*vec2.z - vec2.y*vec1.z);tempnvector.y = (-1)*(vec1.x*vec2.z-vec2.x*vec1.z);tempnvector.z = (1)*(vec1.x*vec2.y - vec2.x*vec1.y);return tempnvector;float cdraw3dview:innerproduct(vector vec1, vector vec2)/计算两个向量的内积return (vec1.x*vec2.x + vec1.y*vec2.y + vec1.z*vec2.z);float cdraw3dview:getmodule(vector vec)/计算向量的模ret
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 报废食品销售合同
- 舞蹈表演培训课程
- 山西省2024八年级物理上册第二章声现象第2节声音的特性课件新版新人教版
- 河北省唐山市部分学校2024-2025学年高一上学期11月期中联考化学试卷(含答案)
- 《麻纺织品中木质素含量的测定 硫酸溶解法》
- 钢业生产安全防范
- 福建省漳州第一中学2024-2025学年七年级上学期11月期中历史试题
- 企业植树节活动方案
- 城市燃气相关行业投资方案范本
- 老年体位性低血压的护理
- 世界足球日介绍主题班会模板课件
- 电大学前教育本教育实习教学活动设计
- 河北省廊坊市各县区乡镇行政村村庄村名居民村民委员会明细
- 农业合作社盈余及盈余分配表
- 学校班级图书箱管理制度
- 写给老婆最催泪挽回感情的信范文(5篇)
- 煤化工企业设备设施风险分级管控清单参考模板范本
- 广东省中小学生学籍管理的实施细则
- 四年级上册数学课件-7.1 认 识 垂 线 |冀教版 (共18张PPT)
- IATF16949 年度内审审核方案
- 计算机应用基础(中等职业学校校本教材)
评论
0/150
提交评论