c用C语言设计实体光照模型课程设计报告Word文件下载.docx
《c用C语言设计实体光照模型课程设计报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《c用C语言设计实体光照模型课程设计报告Word文件下载.docx(19页珍藏版)》请在冰点文库上搜索。
![c用C语言设计实体光照模型课程设计报告Word文件下载.docx](https://file1.bingdoc.com/fileroot1/2023-5/4/79581383-d71e-4f77-a02b-420d9810c208/79581383-d71e-4f77-a02b-420d9810c2081.gif)
(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*