西安科技大学计算机图形学课程设计,长方体体的光照效果计算机图形学课程设计...

《长方体体的光照效果计算机图形学课程设计》由会员分享,可在线阅读,更多相关《长方体体的光照效果计算机图形学课程设计(29页珍藏版)》请在人人文库网上搜索。

1、西安科技大学计算机图形学课程设计题目: 长方体体的光照效果 专业班级: 信计1102班 小组成员:陈维多1108060216邹世林1108060224左 力1108060225李 优1108060229日期: 2013年1月2日 目录一 课程设计题目 31.题目要求 32.任务 3二 任务分析算法介绍 31.任务分析 32.算法介绍 4三 总体设计 51.定义三维齐次向量结构体 52.定义三维齐次坐标结构 53.定义面的结构 64.定义点的结构 65.长方体顶点定义及初始化 76. 面表 77.定义点光源、视线方向、光照方向 88.各面可见性计算和判断 99.窗口-视区变换 1110.路径填充。

2、 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 Vector3Dfloat 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;/标识符float kd; /漫反射率。

5、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= -2; pts3.z= 1; 。

6、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=5; faces1.v2=1;。

7、 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;illuminant.z = 10。

8、0;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; i0)facesi.flag = VISIABLE; elsefacesi.flag = UNVISIABLE;3)计算各个面的中心点for(i=0; i0)facesi.flag = VISIABLE; elsefacesi.flag = UNVISIABLE;/计算各个面的中心。

9、点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.0f ;facesi.center.w = (ptsfa。

10、cesi.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)*GetModule(light_veci);/计算各个面环境光反射。

11、光强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*c);for(i=0;iptn;i+)pts2Di.。

12、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.v3.x,pts2Dfacesj.v3.y);/dc.S。

13、electObject(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.DeleteObject();void CDraw3D。

14、View: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.x=x*cos(b)+z*sin(b);ptsi.z=。

15、-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 tempVector;VECTOR CDraw3DView:VecCr。

16、oss(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)/计算两个向量。

17、的内积return (vec1.x*vec2.x + vec1.y*vec2.y + vec1.z*vec2.z);float CDraw3DView:GetModule(VECTOR vec)/计算向量的模return (sqrt(vec.x*vec.x+vec.y*vec.y+vec.z*vec.z);void CDraw3DView:OnKeyLeft() / TODO: Add your command handler code herey_angle-;RedrawWindow();void CDraw3DView:OnKeyUp() / TODO: Add your command。

18、 handler code herex_angle+;RedrawWindow();void CDraw3DView:OnKeyRight() / TODO: Add your command handler code herey_angle+;RedrawWindow();void CDraw3DView:OnKeyDown() / TODO: Add your command handler code herex_angle-;RedrawWindow();六、程序运行效果图运行开始效果 按键旋转后效果七、总结通过这次课程设计,加深了我们对计算机图形学这门课的学习,也让我们体会到完成一个设。

19、计任务的方法和思路,培养了我们独立思考的能力,在完成任务的同时,也锻炼了我们团队分工协作的能力。这一周里,感谢老师对我们在课设上不厌其烦的指导,让我们我产生的疑问一一的被解答,正是这些疑问的解答才使得我们的课设内容能够做得更加完美,也让我感受到了,计算机图形学课程的魅力所在,使我对这门课程的学习有了更大的乐趣。 我们的设计的内容长方体体的光照效果,在听了老师的仔细讲解,我们小组的几个成员通过进一步的设计改进,探讨和研究,最终在老师的细心指导下顺利完成了课设。虽然我们已经有过几次课程设计的经验,但是每次都有不同的收获,尤其是在和老师交流时我们总能发现自己知识的局限,感谢老师的指导,让我们在不断的探讨和进步中顺利地完成设计任务参考文献1 谭浩强.C+面向对象程序设计M.北京:清华大学出版社,20062 孔令德,张岳新,马锐.VisualC+程序设计与实验指导M.北京:兵器工业出版社,20043 孔令德,叶瑶,杨慧炯. C+程序设计案列精编M.北京:中国铁道工业出版社,20044 孔令德.计算机图形学基础教程(VisualC+版)M.北京:清华大学出版社,200829。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值