最新c用C语言设计实体光照模型-课程设计报告.doc

上传人:1595****071 文档编号:34717433 上传时间:2022-08-18 格式:DOC 页数:56 大小:254KB
返回 下载 相关 举报
最新c用C语言设计实体光照模型-课程设计报告.doc_第1页
第1页 / 共56页
最新c用C语言设计实体光照模型-课程设计报告.doc_第2页
第2页 / 共56页
点击查看更多>>
资源描述

《最新c用C语言设计实体光照模型-课程设计报告.doc》由会员分享,可在线阅读,更多相关《最新c用C语言设计实体光照模型-课程设计报告.doc(56页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、Four short words sum up what has lifted most successful individuals above the crowd: a little bit more.-author-datec用C语言设计实体光照模型-课程设计报告c用C语言设计实体光照模型-课程设计报告学号2016-2017学年 第2学期1608220203实体光照模型课程名称课程设计报告题目:用C语言设计实体光照模型专业:网络工程(对口)班级:16(3)姓名:聂代应豪指导教师:代美丽成绩:计算机学院2017年4月25日目录课程设计题目:实体光照模型一 需求分析2二 总体设计2三 详细设

2、计3四 源代码11一 需求分析如对长方体,建立一个点光源,采用环境光和点光源漫反射光的光照模型,应用FLAT明暗处理方法,显示平行投影后的长方体光照效果。二 总体设计图形介绍光照模型效果图可见面光照计算可见面背光性判断可见面判断表面模型三 详细设计1、原理光照模型是真实感图形技术的重要组成部分,它主要研究的是如何根据光学物理的有关定律,采用计算机来模拟自然界中光照明的物理过程。本文通过对光源特性和物体表面特性、局部光照模型和整体光照模型的具体分析,完成对光照模型的 系统阐述。关键词:光源特性、局部光照模型、全局光照模型、真实感图形2、详细分支定义三维齐次坐标结构和面的结构;定义顶点表和面表,对

3、长方体绕X轴旋转和绕Y轴旋转。对每一个面计算其外法向量及可见性对每个可见面计算其光线向量,并判断其是否为背光面。计算每个见光面的环境光和点光源的漫反射分量。用该面的光强显示该可见面3、设计介绍(1)旋转变换 绕X轴旋转变换的坐标表示 绕Y轴旋转变换的坐标表示(2) 平行投影在XOY平面投影后坐标(3) 环境光模型物体没有受到光源的直射,但其表面仍有一定亮度,这是由于环境光的作用。表示环境光反射强度 表示环境光反射率 表示环境光入射强度(4)漫反射光模型漫反射光可认为是在点光源的照射下,光被物体表面吸收后,然后重新反射出来的光。 表示漫反射光强度 表示漫反射反射率 表示点光源入射强度大小 入射光

4、与物体表面法矢量夹角4、定义结构及分析(1)定义三维齐次向量结构体 typedef struct Vector3D float x; float y; float z; int f; /f表示所在的平面的编号 VECTOR; ; (2) 定义三维齐次坐标结构 typedef struct tagHOMOCOORD float x; float y; float z; float w; HOMOCOORD; (3)定义面的结构 typedef struct tagPLANE int v0, v1, v2, v3; VECTOR n; /外法向量 HOMOCOORD center; /中心点 fl

5、oat Id; /漫反射光强 int flag; /标识符 float kd; /漫反射率 float ka; /环境光反射率 float Ie; /环境光反射光强 float I; /光强 PLANE; (4)定义点的结构 typedef struct tagMYPOINT float x,y; MYPOINT; ; (5)长方体顶点定义及初始化 ptsnew HOMOCOORDptn pts0.x 1;pts0.y 2; pts0.z 1; pts0.w1; pts1.x -1; pts1.y 2; pts1.z 1; pts1.w1; pts2.x -1; pts2.y -2;pts2.

6、z 1; pts2.w1; pts3.x 1;pts3.y -2;pts3.z 1; pts3.w1; pts4.x 1;pts4.y 2; pts4.z -1; pts4.w1; pts5.x -1; pts5.y 2; pts5.z -1; pts5.w1; pts6.x -1; pts6.y -2;pts6.z -1; pts6.w1; pts7.x 1;pts7.y -2;pts7.z -1; pts7.w1; ; (6)面表 fn6; facesnew PLANEfn; faces0.v00; faces0.v11; faces0.v22; faces0.v33; faces1.v0

7、4; faces1.v15; faces1.v21; faces1.v30; faces2.v05; faces2.v16; faces2.v22; faces2.v31; faces3.v06; faces3.v17; faces3.v23; faces3.v32; faces4.v07; faces4.v14; faces4.v20; faces4.v33; faces5.v07; faces5.v16; faces5.v25; faces5.v34; (7)定义点光源、视线方向、光照方向 1、点光源 illuminant.x -100; illuminant.y -100; illumi

8、nant.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 ; fori0; i6; i+ vectori0 CalculateVectorptsfacesi.v0, pts facesi.v1, i ; vectori1 CalculateVectorptsfacesi.v0, pts facesi.v2, i ; (8)各面可见性计算和判

9、断 1、计算各个面的外法向量 faces0.n VecCrossvector00, vector01 ; fori0; i6; i+ facesi.n VecCrossvectori0, vectori1 ; 2、各个面的可见性判定 float cos_angle; fori0; i6; i+ cos_angle -1.0*InnerProductfacesi.n, eye_vec/GetModulefacesi.n*GetModuleeye_vec; ifcos_angle0 facesi.flag VISIABLE; else facesi.flag UNVISIABLE; 3、计算各个面

10、的中心点 fori0; 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 ptsfacesi.v0.w+

11、ptsfacesi.v1.w+ptsfacesi.v2.w+ptsfacesi.v3.w/4.0f ; 4、计算各个面的光照方向 fori0; ifn; i+ light_veci CalculateVectorilluminant, facesi.center, EOF; 5、计算各个面的漫反射光强 fori0; ifn; i+ facesi.Id Ip*facesi.kd*-1*InnerProductfacesi.n, light_veci/GetModulefacesi.n*GetModulelight_veci; 6、计算各个面环境光反射光强 fori0; ifn; i+ faces

12、i.Ie facesi.ka*Ia; 7、计算各个面光强(漫反射光强和环境反射光强之和) fori0; ifn; i+ facesi.I facesi.Id+facesi.Ie ; /窗口-视区变换实现过程 float wxl-5,wxr5,wyb-5,wyt5; int vxl0,vxr800,vyb0,vyt600; (9)窗口-视区变换 int a intvxr-vxl/wxr-wxl; int b intvxl-wxl*a; int c intvyt-vyb/wyt-wyb; int d intvyb-wyb*c; fori0;iptn;i+ pts2Di.x a*ptsi.x+b;

13、pts2Di.y c*ptsi.y+d; (10) 路径填充 CBrush Brush;Brush.CreateSolidBrushRGBfacesj.I*255,facesj.I*255,facesj.I*255+40; pd.SelectObject&Brush; pd.BeginPath; pd.MoveTop0; forint i1;i4;i+ pd.LineTopi; pd.LineTop0; pd.EndPath; pd.FillPath; Brush.DeleteObject;四 源代码Draw3DView.h文件typedef struct Vector3D /定义三维齐次向量

14、结构体 float x;float y;float z;int f; /f表示所在的平面的编号VECTOR;typedef struct tagHOMOCOORD /定义三维齐次坐标结构 float x;float y;float z;float w;HOMOCOORD;typedef struct tagPLANE /定义面的结构 int v0, v1, v2, v3;VECTOR n; /外法向量HOMOCOORD center; /中心点float Id; /漫反射光强int flag;float kd; /漫反射率float ka; /环境光反射率float Ie; /环境光反射光强f

15、loat I; /光强PLANE;typedef struct tagMYPOINT /定义点的结构,需要浮点数的x,y float x,y;MYPOINT;public:VECTOR CalculateVectorHOMOCOORD start, HOMOCOORD end, int face; /计算一个3维向量的函数,/从start点指向end点的属于face面的向量VECTOR VecCrossVECTOR vec1, VECTOR vec2;/计算两个向量叉积,即外法向量float InnerProductVECTOR vec1, VECTOR vec2;/计算两个向量的内积floa

16、t GetModuleVECTOR vec; /计算向量的模void RotateYint angle; /绕y轴逆时针旋转void RotateXint 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.c文件int x_angle 0;int y_angle 0;void CDraw3DView:DrawMy3DGraphicsint i;/形体定义ptn8;ptsnew HOMOCOORDptn;/设置长方体pts0.x1;pts0.y2;pts0.z1; pts0.w1;pts1.x-1; pts1.y2;pts1.z1; pts1.w1;pts2.x-1; pts2.y-2; pts2.z1; pts2.w1;pts3.x1;pts3.y-2; pts3.z1; p

18、ts3.w1;pts4.x1;pts4.y2;pts4.z-1; pts4.w1;pts5.x-1; pts5.y2;pts5.z-1; pts5.w1;pts6.x-1; pts6.y-2; pts6.z-1; pts6.w1;pts7.x1;pts7.y-2; pts7.z-1; pts7.w1;/给定义面的指针分配内存;fn6;facesnew PLANEfn;/设置立方体各面faces0.v00; faces0.v11; faces0.v22; faces0.v33;faces1.v04; faces1.v15; faces1.v21; faces1.v30;faces2.v05; f

19、aces2.v16; faces2.v22; faces2.v31;faces3.v06; faces3.v17; faces3.v23; faces3.v32;faces4.v07; faces4.v14; faces4.v20; faces4.v33;faces5.v07; faces5.v16; faces5.v25; faces5.v34;pts2Dnew MYPOINTptn;fori0; ifn; i+facesi.ka 0.8;facesi.kd 0.8;/定义点光源illuminant.x -100;illuminant.y -100;illuminant.z 100;Ia 0

20、.5;Ip 0.5;/定义视线方向VECTOR eye_vec;eye_vec.x 0;eye_vec.y 0;eye_vec.z -1;/定义光照方向light_vec new VECTORfn; /旋转调用RotateXx_angle;RotateYy_angle;/定义并计算各个面的两条相交的向量VECTORvector62 ;fori0; i6; i+vectori0 CalculateVectorptsfacesi.v0, pts facesi.v1, i ;vectori1 CalculateVectorptsfacesi.v0, pts facesi.v2, i ;/计算各个面的

21、外法向量faces0.n VecCrossvector00, vector01 ;fori0; i6; i+facesi.n VecCrossvectori0, vectori1 ;/各个面的可见性判定float cos_angle;fori0; i6; i+cos_angle -1.0*InnerProductfacesi.n, eye_vec/GetModulefacesi.n*GetModuleeye_vec;ifcos_angle0facesi.flag VISIABLE; elsefacesi.flag UNVISIABLE;/计算各个面的中心点fori0; ifn; i+faces

22、i.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 ptsfacesi.v0.w+ptsfacesi.v1.w+ptsfacesi.v2.

23、w+ptsfacesi.v3.w/4.0f ;/计算各个面的光照方向fori0; ifn; i+light_veci CalculateVectorilluminant, facesi.center, EOF;/计算各个面的漫反射光强fori0; ifn; i+facesi.Id Ip*facesi.kd*-1*InnerProductfacesi.n, light_veci/GetModulefacesi.n*GetModulelight_veci;/计算各个面环境光反射光强fori0; ifn; i+facesi.Ie facesi.ka*Ia;/计算各个面光强fori0; ifn; i+

24、facesi.I facesi.Id+facesi.Ie ;/平行投影变换fori0;iptn;i+ptsi.xptsi.x;ptsi.yptsi.y;/ 窗口-视区变换int a intvxr-vxl/wxr-wxl;int b intvxl-wxl*a;int c intvyt-vyb/wyt-wyb;int d intvyb-wyb*c;fori0;iptn;i+pts2Di.x a*ptsi.x+b;pts2Di.y c*ptsi.y+d;/图形显示CClientDC pdthis;CPoint p4;forint j0; j6; j+iffacesj.flagVISIABLEp0CP

25、ointpts2Dfacesj.v0.x,pts2Dfacesj.v0.y;p1CPointpts2Dfacesj.v1.x,pts2Dfacesj.v1.y;p2CPointpts2Dfacesj.v2.x,pts2Dfacesj.v2.y;p3CPointpts2Dfacesj.v3.x,pts2Dfacesj.v3.y;/dc.SelectObjectpOld; /把画笔设置为原来的CBrush Brush;/DKGRAY_BRUSH,RGB64,64,64;Brush.CreateSolidBrushRGBfacesj.I*255,facesj.I*255,facesj.I*255+4

26、0;pd.SelectObject&Brush;pd.BeginPath;pd.MoveTop0;forint i1;i4;i+pd.LineTopi;pd.LineTop0;pd.EndPath;pd.FillPath;Brush.DeleteObject;void CDraw3DView:RotateXint angle/绕x轴逆时针旋转float aangle*PI/180;forint i0;iptn;i+float y,z;yptsi.y; zptsi.z;ptsi.yy*cosa-z*sina;ptsi.zy*sina+z*cosa;void CDraw3DView:RotateY

27、int angle /绕y轴逆时针旋转float bangle*PI/180;forint i0;iptn;i+float x,z;xptsi.x; zptsi.z;ptsi.xx*cosb+z*sinb;ptsi.z-x*sinb+z*cosb;VECTOR CDraw3DView:CalculateVectorHOMOCOORD start, HOMOCOORD end, int face/计算一个3维向量的函数,从start点指向end点的属于face面的向量VECTOR tempVector;tempVector.x end.x-start.x;tempVector.y end.y-s

28、tart.y;tempVector.z end.z-start.z;tempVector.f face;return tempVector;VECTOR CDraw3DView:VecCrossVECTOR 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 t

29、empNVector;float CDraw3DView:InnerProductVECTOR vec1, VECTOR vec2/计算两个向量的内积return vec1.x*vec2.x + vec1.y*vec2.y + vec1.z*vec2.z;float CDraw3DView:GetModuleVECTOR vec/计算向量的模return sqrtvec.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 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;-

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 成人自考

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁