计算机图形学实验报告.docx
- 文档编号:25925059
- 上传时间:2023-06-16
- 格式:DOCX
- 页数:16
- 大小:28.48KB
计算机图形学实验报告.docx
《计算机图形学实验报告.docx》由会员分享,可在线阅读,更多相关《计算机图形学实验报告.docx(16页珍藏版)》请在冰豆网上搜索。
计算机图形学实验报告
实验成绩:
《计算机图形学》实验报告6
班级:
1420551
专业:
网络工程
学号:
姓名:
《计算机图形学》课程实验报告(六)
班级
1420551
实验日期
2016.12.08
姓名
学号
实验名称
球面光源与材质交互作用算法
实
验
目
的
及
要
求
1.材质模型
2.光源模型
3.光照模型
算
法
及
实
验
步
骤
1.读入球面的顶点表和面表。
2.循环访问三角形面片和四边形面片的每个顶点,调用光照函数计算所获得的光强。
3.使用双缓冲技术绘制球面小面片的二维透视投影图。
4.使用有效边表填充算法填充三角形面片和四边形面片。
5.使用深度缓冲算法对球面进行动态消隐。
6.使用定时器改变球面的转角生成旋转动画。
调
试
过
程
及
实
验
结
果
过程:
1.初始化左窗格控件
2.左窗格控件响应函数
3.设计光源类
4.设计材质类
5.设计光照类
6.右窗格内更新视图
结果:
总
结
附
录
(核心源程序清单)
1.初始化左窗格控件:
voidCLeftPortion:
:
OnInitialUpdate()
{
CFormView:
:
OnInitialUpdate();
//TODO:
Addyourspecializedcodehereand/orcallthebaseclass
//设置左窗格控件的初始状态
CheckRadioButton(IDC_GOLD,IDC_BERYL,IDC_RUBY);
CheckRadioButton(IDC_LEFTTOP,IDC_RIGHTDOWN,IDC_RIGHTTOP);
m_Ambient=TRUE;
m_Diffuse=TRUE;
m_Specular=TRUE;
UpdateData(FALSE);
}
2.左窗格控件响应函数:
voidCLeftPortion:
:
OnAmbient()//环境光
{
//TODO:
Addyourcontrolnotificationhandlercodehere
CTestDoc*pDoc=(CTestDoc*)CFormView:
:
GetDocument();
pDoc->UpdateAllViews(NULL,1);
}
voidCLeftPortion:
:
OnDiffuse()//漫反射光
{
//TODO:
Addyourcontrolnotificationhandlercodehere
CTestDoc*pDoc=(CTestDoc*)CFormView:
:
GetDocument();
pDoc->UpdateAllViews(NULL,2);
}
voidCLeftPortion:
:
OnSpecular()//镜面反射光
{
//TODO:
Addyourcontrolnotificationhandlercodehere
CTestDoc*pDoc=(CTestDoc*)CFormView:
:
GetDocument();
pDoc->UpdateAllViews(NULL,3);
}
voidCLeftPortion:
:
OnGold()//“金”材质
{
//TODO:
Addyourcontrolnotificationhandlercodehere
CTestDoc*pDoc=(CTestDoc*)CFormView:
:
GetDocument();
pDoc->UpdateAllViews(NULL,4);
}
voidCLeftPortion:
:
OnSilver()//“银”材质
{
//TODO:
Addyourcontrolnotificationhandlercodehere
CTestDoc*pDoc=(CTestDoc*)CFormView:
:
GetDocument();
pDoc->UpdateAllViews(NULL,5);
}
voidCLeftPortion:
:
OnRuby()//“红宝石”材质
{
//TODO:
Addyourcontrolnotificationhandlercodehere
CTestDoc*pDoc=(CTestDoc*)CFormView:
:
GetDocument();
pDoc->UpdateAllViews(NULL,6);
}
voidCLeftPortion:
:
OnBeryl()//“绿宝石”材质
{
//TODO:
Addyourcontrolnotificationhandlercodehere
CTestDoc*pDoc=(CTestDoc*)CFormView:
:
GetDocument();
pDoc->UpdateAllViews(NULL,7);
}
voidCLeftPortion:
:
OnLefttop()//光源位于“左上”
{
//TODO:
Addyourcontrolnotificationhandlercodehere
CTestDoc*pDoc=(CTestDoc*)CFormView:
:
GetDocument();
pDoc->UpdateAllViews(NULL,8);
}
voidCLeftPortion:
:
OnLeftdown()//光源位于“左下”
{
//TODO:
Addyourcontrolnotificationhandlercodehere
CTestDoc*pDoc=(CTestDoc*)CFormView:
:
GetDocument();
pDoc->UpdateAllViews(NULL,9);
}
voidCLeftPortion:
:
OnRighttop()//光源位于“右上”
{
//TODO:
Addyourcontrolnotificationhandlercodehere
CTestDoc*pDoc=(CTestDoc*)CFormView:
:
GetDocument();
pDoc->UpdateAllViews(NULL,10);
}
voidCLeftPortion:
:
OnRightdown()//光源位于“右下”
{
//TODO:
Addyourcontrolnotificationhandlercodehere
CTestDoc*pDoc=(CTestDoc*)CFormView:
:
GetDocument();
pDoc->UpdateAllViews(NULL,11);
}
3.设计光源类:
classCLight
{
public:
CLight();
virtual~CLight();
voidSetDiffuse(CRGB);//设置光源的漫反射光
voidSetSpecular(CRGB);//设置光源的镜面反射光
voidSetPosition(double,double,double);//设置光源的直角坐标位置
voidSetGlobal(double,double,double);//设置光源的球坐标位置
voidSetCoef(double,double,double);//设置光强的衰减系数
voidSetOnOff(BOOL);//设置光源开关状态
voidGlobalToXYZ();//球坐标转换为直角坐标
public:
CRGBL_Diffuse;//光的漫反射颜色
CRGBL_Specular;//光的镜面高光颜色
CP3L_Position;//光源的位置
doubleL_R,L_Phi,L_Theta;//光源球坐标
doubleL_C0;//常数衰减系数
doubleL_C1;//线性衰减系数
doubleL_C2;//二次衰减系数
BOOLL_OnOff;//光源开关
BOOLb_Specular;
BOOLb_Diffuse;
BOOLb_Ambient;
};
CLight:
:
CLight()
{
L_Diffuse=CRGB(0.0,0.0,0.0);//光源的漫反射颜色
L_Specular=CRGB(1.0,1.0,1.0);//光源镜面高光颜色
L_Position.x=0.0,L_Position.y=0.0,L_Position.z=1000;//光源位置直角坐标
L_R=1000,L_Phi=0,L_Theta=0;//光源位置球坐标
L_C0=1.0;//常数衰减系数
L_C1=0.0;//线性衰减系数
L_C2=0.0;//二次衰减系数
L_OnOff=TRUE;//光源开启
b_Specular=TRUE;
b_Diffuse=TRUE;
b_Ambient=TRUE;
}
CLight:
:
~CLight()
{
}
voidCLight:
:
SetDiffuse(CRGBdif)
{
L_Diffuse=dif;
}
voidCLight:
:
SetSpecular(CRGBspe)
{
L_Specular=spe;
}
voidCLight:
:
SetPosition(doublex,doubley,doublez)
{
L_Position.x=x;
L_Position.y=y;
L_Position.z=z;
}
voidCLight:
:
SetGlobal(doubler,doublephi,doubletheta)
{
L_R=r;
L_Phi=phi;
L_Theta=theta;
}
voidCLight:
:
SetOnOff(BOOLonoff)
{
L_OnOff=onoff;
}
voidCLight:
:
SetCoef(doublec0,doublec1,doublec2)
{
L_C0=c0;
L_C1=c1;
L_C2=c2;
}
voidCLight:
:
GlobalToXYZ()
{
L_Position.x=L_R*sin(L_Phi*PI/180)*cos(L_Theta*PI/180);
L_Position.y=L_R*sin(L_Phi*PI/180)*sin(L_Theta*PI/180);
L_Position.z=L_R*cos(L_Phi*PI/180);
}
4.设计材质类:
classCMaterial
{
public:
CMaterial();
virtual~CMaterial();
voidSetAmbient(CRGB);//设置材质对环境光的反射率
voidSetDiffuse(CRGB);//设置材质对漫反射光的反射率
voidSetSpecular(CRGB);//设置材质对镜面反射光的反射率
voidSetEmit(CRGB);//设置材质自身辐射的颜色
voidSetExp(double);//设置材质的高光指数
public:
CRGBM_Ambient;//材质对环境光的反射率
CRGBM_Diffuse;//材质对漫反射光的反射率
CRGBM_Specular;//材质对镜面反射光的反射率
CRGBM_Emit;//材质自身辐射的颜色
doubleM_n;//材质的高光指数
};
CMaterial:
:
CMaterial()
{
M_Ambient=CRGB(0.2,0.2,0.2);//材质对环境光的反射率
M_Diffuse=CRGB(0.8,0.8,0.8);//材质对漫反射光的反射率
M_Specular=CRGB(0.0,0.0,0.0);//材质对镜面反射光的反射率
M_Emit=CRGB(0.0,0.0,0.0);//材质自身发散的颜色
M_n=1.0;//高光指数
}
CMaterial:
:
~CMaterial()
{
}
voidCMaterial:
:
SetAmbient(CRGBc)
{
M_Ambient=c;
}
voidCMaterial:
:
SetDiffuse(CRGBc)
{
M_Diffuse=c;
}
voidCMaterial:
:
SetSpecular(CRGBc)
{
M_Specular=c;
}
voidCMaterial:
:
SetEmit(CRGBemi)
{
M_Emit=emi;
}
voidCMaterial:
:
SetExp(doublen)
{
M_n=n;
}
5.设计光照类:
classCLighting
{
public:
CLighting();
CLighting(int);
virtual~CLighting();
voidSetLightNumber(int);//设置光源数量
CRGBLighting(CP3,CP3,CVector,CMaterial*);//计算光照
public:
intLightNum;//光源数量
CLight*Light;//光源数组
CRGBAmbient;//环境光
};
CLighting:
:
CLighting()
{
LightNum=1;
Light=newCLight[LightNum];
Ambient=CRGB(1.0,1.0,1.0);//环境光恒定不变
}
CLighting:
:
~CLighting()
{
if(Light)
{
delete[]Light;
Light=NULL;
}
}
voidCLighting:
:
SetLightNumber(intlnum)
{
if(Light)
delete[]Light;
LightNum=lnum;
Light=newCLight[lnum];
}
CLighting:
:
CLighting(intlnum)
{
LightNum=lnum;
Light=newCLight[lnum];
Ambient=CRGB(0.3,0.3,0.3);
}
CRGBCLighting:
:
Lighting(CP3ViewPoint,CP3Point,CVectorNormal,CMaterial*pMaterial)
{
CRGBLastC=pMaterial->M_Emit;//材质自身发散色为初始值
for(inti=0;i { if(Light[i].L_OnOff) { CRGBInitC; InitC.red=0.0,InitC.green=0.0,InitC.blue=0.0; CVectorVL(Point,Light[i].L_Position);//指向光源的矢量 doubled=VL.Mag();//光传播的距离,等于矢量VL的模 VL=VL.Normalize();//单位化光矢量 CVectorVN=Normal; VN=VN.Normalize();//单位化法矢量 //第1步,加入漫反射光 if(Light[i].b_Diffuse) { doubleCosTheta=MAX(Dot(VL,VN),0); InitC.red+=Light[i].L_Diffuse.red*pMaterial->M_Diffuse.red*CosTheta; InitC.green+=Light[i].L_Diffuse.green*pMaterial->M_Diffuse.green*CosTheta; InitC.blue+=Light[i].L_Diffuse.blue*pMaterial->M_Diffuse.blue*CosTheta; } //第2步,加入镜面反射光 if(Light[i].b_Specular) { CVectorVV(Point,ViewPoint);//VV为视矢量 VV=VV.Normalize();//单位化视矢量 CVectorVH=(VL+VV)/(VL+VV).Mag();//平分矢量 doublenHN=pow(MAX(Dot(VH,VN),0),pMaterial->M_n); InitC.red+=Light[i].L_Specular.red*pMaterial->M_Specular.red*nHN; InitC.green+=Light[i].L_Specular.green*pMaterial->M_Specular.green*nHN; InitC.blue+=Light[i].L_Specular.blue*pMaterial->M_Specular.blue*nHN; } //第3步,光强衰减 doublec0=Light[i].L_C0;//c0为常数衰减因子 doublec1=Light[i].L_C1;//c1线性衰减因子 doublec2=Light[i].L_C2;//c2二次衰减因子 doublef=(1.0/(c0+c1*d+c2*d*d));//光强衰减函数 f=MIN(1.0,f); LastC+=InitC*f; } else { LastC+=Point.c;//物体自身颜色 } } //第4步,加入环境光 if(Light[0].b_Ambient) { LastC+=Ambient*pMaterial->M_Ambient; } //第5步,颜色归一化到[0,1]区间 LastC.Normalize(); //第6步,返回所计算顶点的光强颜色 returnLastC; } 6.右窗格内更新视图: voidCTestView: : OnUpdate(CView*pSender,LPARAMlHint,CObject*pHint) { //TODO: Addyourspecializedcodehereand/orcallthebaseclass switch(lHint) { case1: //环境光 pLight->Light[0].b_Ambient=! pLight->Light[0].b_Ambient; break; case2: //漫反射光 pLight->Light[0].b_Diffuse=! pLight->Light[0].b_Diffuse; break; case3: //镜面反射光 pLight->Light[0].b_Specular=! pLight->Light[0].b_Specular; break; case4: //金 pMaterial->SetAmbient(CRGB(0.247,0.2,0.075));//材质对环境光的反射率 pMaterial->SetDiffuse(CRGB(0.752,0.606,0.226));//材质对环境光和漫反射光的反射率相等 pMaterial->SetSpecular(CRGB(1.0,1.0,1.0));//材质对镜面反射光的反射率 pMaterial->SetEmit(CRGB(0.2,0.2,0.0));//材质自身发散的颜色 pMaterial->SetExp(50);//高光指数 break; case5: //银 pMaterial->SetAmbient(CRGB(0.192,0.192,0.192));//材质对环境光的反射率 pMaterial->SetDiffuse(CRGB(0.508,0.508,0.508));//材质对环境光和漫反射光的反射率相等 pMaterial->SetSpecular(CRGB(1.0,1.0,1.0));//材质对镜面反射光的反射率 pMaterial->SetEmit(CRGB(0.2,0.2,0.2));//材质自身发散的颜色 pMaterial->SetExp(50);//高光指数 break; case6: //红宝石 pMaterial->SetAmbient(CRGB(0.175,0.012,0.012));//材质对环境光的反射率 pMaterial->SetDiffuse(CRGB(0.614,0.041,0.041));//材质对环境光和漫反射光的反射率相等 pMaterial->SetSpecular(CRGB(1.0,1.0,1.0));//材质对镜面反射光的反射率 pMaterial->SetEmit(CRGB(0.2,0.0,0.0));//材质自身发散的颜色 pMaterial->SetExp(30);//高光指数 break; case7: //绿宝石 pMaterial->SetAmbient(CRGB(0.022,0.175,0.023));//材质对环境光的反射率 pMaterial->SetDiffuse(CRGB(0.076,0.614,0.075));//材质对环境光和漫反射光的反射率相等 pMaterial->SetSpecular(CRGB(1.0,1.0,1.0));//材质对镜面反射光的反射率 pMaterial->SetEmit(CRGB(0.0,0.2,0.0));//材质自身发散的颜色 pMaterial->SetExp(30);//高光指数 break; case8: //左上 pLight->Light[0].SetPosition(-800,800,800);//设置光源位置坐标 break; case9: //左下 pLight->Light[0].SetPosition(-800,-800,800);//设置光源位置坐标 break; case10: //右上 pLight->Light[0].SetPosition(800,800,800);//设置光源位置坐标 break; case11: //右下 pLight->Light[0].SetPosition(800,-800,800);//设置光源位置坐标 bre
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 图形学 实验 报告