c用C语言设计实体光照模型课程设计报告Word文件下载.docx

上传人:b****1 文档编号:4792101 上传时间:2023-05-04 格式:DOCX 页数:19 大小:37.65KB
下载 相关 举报
c用C语言设计实体光照模型课程设计报告Word文件下载.docx_第1页
第1页 / 共19页
c用C语言设计实体光照模型课程设计报告Word文件下载.docx_第2页
第2页 / 共19页
c用C语言设计实体光照模型课程设计报告Word文件下载.docx_第3页
第3页 / 共19页
c用C语言设计实体光照模型课程设计报告Word文件下载.docx_第4页
第4页 / 共19页
c用C语言设计实体光照模型课程设计报告Word文件下载.docx_第5页
第5页 / 共19页
c用C语言设计实体光照模型课程设计报告Word文件下载.docx_第6页
第6页 / 共19页
c用C语言设计实体光照模型课程设计报告Word文件下载.docx_第7页
第7页 / 共19页
c用C语言设计实体光照模型课程设计报告Word文件下载.docx_第8页
第8页 / 共19页
c用C语言设计实体光照模型课程设计报告Word文件下载.docx_第9页
第9页 / 共19页
c用C语言设计实体光照模型课程设计报告Word文件下载.docx_第10页
第10页 / 共19页
c用C语言设计实体光照模型课程设计报告Word文件下载.docx_第11页
第11页 / 共19页
c用C语言设计实体光照模型课程设计报告Word文件下载.docx_第12页
第12页 / 共19页
c用C语言设计实体光照模型课程设计报告Word文件下载.docx_第13页
第13页 / 共19页
c用C语言设计实体光照模型课程设计报告Word文件下载.docx_第14页
第14页 / 共19页
c用C语言设计实体光照模型课程设计报告Word文件下载.docx_第15页
第15页 / 共19页
c用C语言设计实体光照模型课程设计报告Word文件下载.docx_第16页
第16页 / 共19页
c用C语言设计实体光照模型课程设计报告Word文件下载.docx_第17页
第17页 / 共19页
c用C语言设计实体光照模型课程设计报告Word文件下载.docx_第18页
第18页 / 共19页
c用C语言设计实体光照模型课程设计报告Word文件下载.docx_第19页
第19页 / 共19页
亲,该文档总共19页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

c用C语言设计实体光照模型课程设计报告Word文件下载.docx

《c用C语言设计实体光照模型课程设计报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《c用C语言设计实体光照模型课程设计报告Word文件下载.docx(19页珍藏版)》请在冰点文库上搜索。

c用C语言设计实体光照模型课程设计报告Word文件下载.docx

(1)旋转变换

绕X轴旋转变换的坐标表示

绕Y轴旋转变换的坐标表示

(2)平行投影

在XOY平面投影后坐标

(3)环境光模型

物体没有受到光源的直射,但其表面仍有一定亮度,这是由于环境光的作用。

表示环境光反射强度

表示环境光反射率

表示环境光入射强度

(4)漫反射光模型

漫反射光可认为是在点光源的照射下,光被物体表面吸收后,然后重新反射出来的光。

表示漫反射光强度

表示漫反射反射率

表示点光源入射强度大小

入射光与物体表面法矢量夹角

4、定义结构及分析

(1)定义三维齐次向量结构体

typedefstructVector3D

{floatx;

floaty;

floatz;

intf;

//f表示所在的平面的编号

VECTOR;

};

(2)定义三维齐次坐标结构

typedefstructtagHOMOCOORD

{floatx;

floaty;

floatz;

floatw;

HOMOCOORD;

};

(3)定义面的结构

typedefstructtagPLANE

{intv0,v1,v2,v3;

VECTORn;

//外法向量

HOMOCOORDcenter;

//中心点

floatId;

//漫反射光强

intflag;

//标识符

floatkd;

//漫反射率

floatka;

//环境光反射率

floatIe;

//环境光反射光强

floatI;

//光强

PLANE;

(4)定义点的结构

typedefstructtagMYPOINT

{floatx,y;

MYPOINT;

(5)长方体顶点定义及初始化

ptsnewHOMOCOORD[ptn]

{

pts[0].x1;

pts[0].y2;

pts[0].z1;

pts[0].w1;

pts[1].x-1;

pts[1].y2;

pts[1].z1;

pts[1].w1;

pts[2].x-1;

pts[2].y-2;

pts[2].z1;

pts[2].w1;

pts[3].x1;

pts[3].y-2;

pts[3].z1;

pts[3].w1;

pts[4].x1;

pts[4].y2;

pts[4].z-1;

pts[4].w1;

pts[5].x-1;

pts[5].y2;

pts[5].z-1;

pts[5].w1;

pts[6].x-1;

pts[6].y-2;

pts[6].z-1;

pts[6].w1;

pts[7].x1;

pts[7].y-2;

pts[7].z-1;

pts[7].w1;

(6)面表

fn6;

facesnewPLANE[fn];

faces[0].v00;

faces[0].v11;

faces[0].v22;

faces[0].v33;

faces[1].v04;

faces[1].v15;

faces[1].v21;

faces[1].v30;

faces[2].v05;

faces[2].v16;

faces[2].v22;

faces[2].v31;

faces[3].v06;

faces[3].v17;

faces[3].v23;

faces[3].v32;

faces[4].v07;

faces[4].v14;

faces[4].v20;

faces[4].v33;

faces[5].v07;

faces[5].v16;

faces[5].v25;

faces[5].v34;

(7)定义点光源、视线方向、光照方向

1、点光源

illuminant.x-100;

illuminant.y-100;

illuminant.z100;

Ia0.5;

//环境光入射强度

Ip0.5;

//漫反射入射光强度

2、视线方向

VECTOReye_vec;

eye_vec.x0;

eye_vec.y0;

eye_vec.z-1;

3、定义光照方向

light_vecnewVECTOR[fn];

VECTORvector[6][2];

fori0;

i6;

i++

vector[i][0]CalculateVectorpts[faces[i].v0],pts[faces[i].v1],i;

vector[i][1]CalculateVectorpts[faces[i].v0],pts[faces[i].v2],i;

(8)各面可见性计算和判断

1、计算各个面的外法向量

faces[0].nVecCrossvector[0][0],vector[0][1];

faces[i].nVecCrossvector[i][0],vector[i][1];

2、各个面的可见性判定

floatcos_angle;

cos_angle

-1.0*InnerProductfaces[i].n,eye_vec/GetModulefaces[i].n*GetModuleeye_vec;

ifcos_angle0

faces[i].flagVISIABLE;

else

faces[i].flagUNVISIABLE;

3、计算各个面的中心点

ifn;

faces[i].center.xpts[faces[i].v0].x+pts[faces[i].v1].x+pts[faces[i].v2].x+pts[faces[i].v3].x/4.0f;

faces[i].center.ypts[faces[i].v0].y+pts[faces[i].v1].y+pts[faces[i].v2].y+pts[faces[i].v3].y/4.0f;

faces[i].center.zpts[faces[i].v0].z+pts[faces[i].v1].z+pts[faces[i].v2].z+pts[faces[i].v3].z/4.0f;

faces[i].center.wpts[faces[i].v0].w+pts[faces[i].v1].w+pts[faces[i].v2].w+pts[faces[i].v3].w/4.0f;

4、计算各个面的光照方向

light_vec[i]CalculateVectorilluminant,faces[i].center,EOF;

5、计算各个面的漫反射光强

faces[i].IdIp*faces[i].kd*-1*InnerProductfaces[i].n,light_vec[i]/GetModulefaces[i].n*GetModulelight_vec[i];

6、计算各个面环境光反射光强

faces[i].Iefaces[i].ka*Ia;

7、计算各个面光强(漫反射光强和环境反射光强之和)

faces[i].Ifaces[i].Id+faces[i].Ie;

//窗口-视区变换实现过程

floatwxl-5,wxr5,wyb-5,wyt5;

intvxl0,vxr800,vyb0,vyt600;

(9)窗口-视区变换

intaintvxr-vxl/wxr-wxl;

intbintvxl-wxl*a;

intcintvyt-vyb/wyt-wyb;

intdintvyb-wyb*c;

iptn;

i++

pts2D[i].xa*pts[i].x+b;

pts2D[i].yc*pts[i].y+d;

(10)路径填充

CBrushBrush;

Brush.CreateSolidBrushRGBfaces[j].I*255,faces[j].I*255,faces[j].I*255+40;

pd.SelectObject&

Brush;

pd.BeginPath;

pd.MoveTop[0];

forinti1;

i4;

pd.LineTop[i];

pd.LineTop[0];

pd.EndPath;

pd.FillPath;

Brush.DeleteObject;

四源代码

Draw3DView.h文件

typedefstructVector3D//定义三维齐次向量结构体

floaty;

floatz;

intf;

//f表示所在的平面的编号

VECTOR;

typedefstructtagHOMOCOORD//定义三维齐次坐标结构

floatw;

HOMOCOORD;

typedefstructtagPLANE//定义面的结构

{intv0,v1,v2,v3;

VECTORn;

HOMOCOORDcenter;

floatId;

//漫反射光强

intflag;

floatkd;

//漫反射率

floatka;

//环境光反射率

floatIe;

//环境光反射光强

floatI;

//光强

PLANE;

}

typedefstructtagMYPOINT//定义点的结构,需要浮点数的x,y

{floatx,y;

MYPOINT;

public:

VECTORCalculateVectorHOMOCOORDstart,HOMOCOORDend,intface;

//计算一个3维向量的函数,

//从start点指向end点的属于face面的向量

VECTORVecCrossVECTORvec1,VECTORvec2;

//计算两个向量叉积,即外法向量

floatInnerProductVECTORvec1,VECTORvec2;

//计算两个向量的内积

floatGetModuleVECTORvec;

//计算向量的模

voidRotateYintangle;

//绕y轴逆时针旋转

voidRotateXintangle;

//绕x轴逆时针旋转

voidDrawMy3DGraphics;

//绘制长方体

virtual~CDraw3DView;

protected:

HOMOCOORDilluminant;

//定义光源坐标

floatIp;

//定义光源光强

floatIa;

//环境光光强

VECTOR*light_vec;

//各个面的光照方向指针

HOMOCOORD*pts;

//三维顶点指针

MYPOINT*pts2D;

//自定义的二维浮点数结构,表示变换后的二维点

PLANE*faces;

//长方体的面指针

intptn,fn;

//顶点个数与面的个数

Draw3DView.c文件

intx_angle0;

inty_angle0;

voidCDraw3DView:

:

DrawMy3DGraphics

inti;

//形体定义

ptn8;

ptsnewHOMOCOORD[ptn];

//设置长方体

pts[0].x1;

pts[0].y2;

pts[0].z1;

pts[1].x-1;

pts[1].y2;

pts[1].z1;

pts[2].x-1;

pts[2].y-2;

pts[2].z1;

pts[3].x1;

pts[3].y-2;

pts[3].z1;

pts[4].x1;

pts[4].y2;

pts[4].z-1;

pts[5].x-1;

pts[5].y2;

pts[5].z-1;

pts[6].x-1;

pts[6].y-2;

pts[6].z-1;

pts[7].x1;

pts[7].y-2;

pts[7].z-1;

///给定义面的指针分配内存;

fn6;

facesnewPLANE[fn];

//设置立方体各面

faces[0].v00;

faces[1].v04;

faces[2].v05;

faces[3].v06;

faces[4].v07;

faces[5].v07;

pts2DnewMYPOINT[ptn];

fori0;

faces[i].ka0.8;

faces[i].kd0.8;

//定义点光源

illuminant.x-100;

illuminant.y-100;

illuminant.z100;

Ia0.5;

Ip0.5;

//定义视线方向

VECTOReye_vec;

eye_vec.x0;

eye_vec.y0;

eye_vec.z-1;

//定义光照方向

light_vecnewVECTOR[fn];

//旋转调用

RotateXx_angle;

RotateYy_angle;

//定义并计算各个面的两条相交的向量

VECTORvector[6][2];

vector[i][0]CalculateVectorpts[faces[i].v0],pts[faces[i].v1],i;

vector[i][1]CalculateVectorpts[faces[i].v0],pts[faces[i].v2],i;

//计算各个面的外法向量

faces[0].nVecCrossvector[0][0],vector[0][1];

faces[i].nVecCrossvector[i][0],vector[i][1];

//各个面的可见性判定

floatcos_angle;

cos_angle-1.0*InnerProductfaces[i].n,eye_vec/GetModulefaces[i].n*GetModuleeye_vec;

ifcos_angle0

faces[i].flagVISIABLE;

else

faces[i].flagUNVISIABLE;

//计算各个面的中心点

faces[i].center.xpts[faces[i].v0].x+pts[faces[i].v1].x+pts[faces[i].v2].x+pts[faces[i].v3].x/4.0f;

faces[i].center.ypts[faces[i].v0].y+pts[faces[i].v1].y+pts[faces[i].v2].y+pts[faces[i].v3].y/4.0f;

faces[i].center.zpts[faces[i].v0].z+pts[faces[i].v1].z+pts[faces[i].v2].z+pts[faces[i].v3].z/4.0f;

faces[i].center.wpts[faces[i].v0].w+pts[faces[i].v1].w+pts[faces[i].v2].w+pts[faces[i].v3].w/4.0f;

//计算各个面的光照方向

light_vec[i]CalculateVectorilluminant,faces[i].center,EOF;

//计算各个面的漫反射光强

faces[i].IdIp*faces[i].kd*-1*InnerProductfaces[i].n,light_vec[i]/GetModulefaces[i].n*GetModulelight_vec[i];

//计算各个面环境光反射光强

faces[i].Iefaces[i].ka*Ia;

//计算各个面光强

faces[i].Ifaces[i].Id+faces[i].Ie;

//平行投影变换

pts[i].xpts[i].x;

pts[i].ypts[i].y;

//窗口-视区变换

intaintvxr-vxl/wxr-wxl;

intbintvxl-wxl*a;

intcintvyt-vyb/wyt-wyb;

intdintvyb-wyb*c;

pts2D[i].xa*pts[i].x+b;

pts2D[i].yc*pts[i].y+d;

///////////////////////////////////////////

//图形显示

CClientDCpdthis;

CPointp[4];

forintj0;

j6;

j++

iffaces[j].flagVISIABLE

p[0]CPointpts2D[faces[j].v0].x,pts2D[faces[j].v0].y;

p[1]CPointpts2D[faces[j].v1].x,pts2D[faces[j].v1].y;

p[2]CPointpts2D[faces[j].v2].x,pts2D[faces[j].v2].y;

p[3]CPointpts2D[faces[j].v3].x,pts2D[faces[j].v3].y;

//dc.SelectObjectpOld;

//把画笔设置为原来的

CBrushBrush;

//DKGRAY_BRUSH,RGB64,64,64;

pd.SelectObject&

pd.BeginPath;

pd.MoveTop[0];

forinti1;

pd.LineTop[i];

pd.LineTop[0];

pd.EndPath;

pd.FillPath;

Brush.DeleteObject;

RotateXintangle//绕x轴逆时针旋转

floataangle*PI/180;

forinti0;

floaty,z;

ypts[i].y;

zpts[i].z;

pts[i].yy*cosa-z*sina;

pts[i].zy*sina+z*cosa;

RotateYintangle//绕y轴逆时针旋转

floatbangle*PI/180;

floatx,z;

xpts[i].x;

pts[i].xx*cosb+z*sinb;

pts[i].z-x*sinb+z*cosb;

VECTORCDraw3DView:

CalculateVectorHOMOCOORDstart,HOMOCOORDend,intface

//计算一个3维向量的函数,从start点指向end点的属于face面的向量

VECTORtempVector;

tempVector.xend.x-start.x;

tempVector.yend.y-start.y;

tempVector.zend.z-start.z;

tempVector.fface;

returntempVector;

VecCrossVECTORvec1,VECTORvec2//计算两个向量叉积,即外法向量

VECTORtempNVector;

tempNVector.x1*vec1.y*vec2.z-vec2.y*vec1.z;

tempNVector.y-1*vec1.x*vec2.z-vec2.x*

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2