计算机图形学实验报告
UpdateData(FALSE);
}
2.左窗格控件响应函数:
void CLeftPortion::OnAmbient()//环境光
{
// TODO: Add your control notification handler code here
CTestDoc *pDoc=(CTestDoc*)CFormView::GetDocument();
void SetPosition(double,double,double);//设置光源的直角坐标位置
void SetGlobal(double,double,double);//设置光源的球坐标位置
void SetCoef(double,double,double);//设置光强的衰减系数
void SetOnOff(BOOL);//设置光源开关状态
pDoc->UpdateAllViews(NULL,11);
}
3.设计光源类:
class CLight
{
public:
CLight();
virtual ~CLight();
void SetDiffuse(CRGB);//设置光源的漫反射光
void SetSpecular(CRGB);//设置光源的镜面反射光
{
M_Specular=c;
}
void CMaterial::SetEmit(CRGB emi)
{
M_Emit=emi;
}
void CMaterial::SetExp(double n)
{
M_n=n;
}
5.设计光照类:
class CLighting
{
public:
CLighting();
CLighting(int);
//设置左窗格控件的初始状态
CheckRadioButton(IDC_GOLD,IDC_BERYL,IDC_RUBY);
CheckRadioButton(IDC_LEFTTOP,IDC_RIGHTDOWN,IDC_RIGHTTOP);
m_Ambient=TRUE;
m_Diffuse=TRUE;
m_Specular=TRUE;
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.设计材质类:
class CMaterial
{
public:
CMaterial();
virtual ~CMaterial();
pDoc->UpdateAllViews(NULL,10);
}
void CLeftPortion::OnRightdown()//光源位于“右下”
{
// TODO: Add your control notification handler code here
CTestDoc *pDoc=(CTestDoc*)CFormView::GetDocument();
void GlobalToXYZ();//球坐标转换为直角坐标
public:
CRGB L_Diffuse;//光的漫反射颜色
CRGB L_Specular;//光的镜面高光颜色
CP3 L_Position;//光源的位置
double L_R,L_Phi,L_Theta;//光源球坐标
double L_C0;//常数衰减系数
pDoc->UpdateAllViews(NULL,7);
}
void CLeftPortion::OnLefttop()//光源位于“左上”
{
// TODO: Add your control notification handler code here
CTestDoc *pDoc=(CTestDoc*)CFormView::GetDocument();
实验成绩:
《计算机图形学》实验报告6
班级:1420551
专业:网络工程
学号:
姓名:
《计算机图形学》课程实验报告(六)
班级
1420551
实验日期
2016.12.08
姓名
学号
实验名称
球面光源与材质交互作用算法
实
验
目
的
及
要
求
1.材质模型
2.光源模型
3.光照模型
算
法
及
实
验
步
骤
1.读入球面的顶点表和面表。
2.循环访问三角形面片和四边形面片的每个顶点,调用光照函数计算所获得的光强。
{
L_Diffuse=dif;
}
void CLight::SetSpecular(CRGB spe)
{
L_Specular=spe;
}
void CLight::SetPosition(double x,double y,double z)
{
L_Position.x=x;
L_Position.y=y;
L_Position.z=z;
}
void CLight::SetGlobal(double r,double phi,double theta)
{
L_R=r;
L_Phi=phi;
L_Theta=theta;
}
void CLight::SetOnOff(BOOL onoff)
{
L_OnOff=onoff;
3.使用双缓冲技术绘制球面小面片的二维透视投影图。
4.使用有效边表填充算法填充三角形面片和四边形面片。
5.使用深度缓冲算法对球面进行动态消隐。
6.使用定时器改变球面的转角生成旋转动画。
调
试
过
程
及
实
验
结
果
过程:
1.初始化左窗格控件
2.左窗格控件响应函数
3.设计光源类
4.设计材质类
5.设计光照类
6.右窗格内更新视图
pDoc->UpdateAllViews(NULL,1);
}
void CLeftPortion::OnDiffuse()//漫反射光
{
// TODO: Add your control notification handler code here
CTestDoc *pDoc=(CTestDoc*)CFormView::GetDocument();
double L_C1;//线性衰减系数
double L_C2;//二次衰减系数
BOOL L_OnOff;//光源开关
BOOL b_Specular;
BOOL b_Diffuse;
BOOL b_Ambient;
};
CLight::CLight()
{
L_Diffuse=CRGB(0.0,0.0,0.0);//光源的漫反射颜色
pDoc->UpdateAllViews(NULL,2);
}
void CLeftPortion::OnSpecular()//镜面反射光
{
// TODO: Add your control notification handler code here
CTestDoc *pDoc=(CTestDoc*)CFormView::GetDocument();
L_C1=0.0;//线性衰减系数
L_C2=0.0;//二பைடு நூலகம்衰减系数
L_OnOff=TRUE;//光源开启
b_Specular=TRUE;
b_Diffuse=TRUE;
b_Ambient=TRUE;
}
CLight::~CLight()
{
}
void CLight::SetDiffuse(CRGB dif)
pDoc->UpdateAllViews(NULL,4);
}
void CLeftPortion::OnSilver()//“银”材质
{
// TODO: Add your control notification handler code here
CTestDoc *pDoc=(CTestDoc*)CFormView::GetDocument();
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;//常数衰减系数
pDoc->UpdateAllViews(NULL,6);
}
void CLeftPortion::OnBeryl()//“绿宝石”材质
{
// TODO: Add your control notification handler code here
CTestDoc *pDoc=(CTestDoc*)CFormView::GetDocument();
public:
CRGBM_Ambient;//材质对环境光的反射率
CRGB M_Diffuse;//材质对漫反射光的反射率
CRGB M_Specular;//材质对镜面反射光的反射率
CRGB M_Emit;//材质自身辐射的颜色
double M_n;//材质的高光指数
};
CMaterial::CMaterial()
pDoc->UpdateAllViews(NULL,3);
}
void CLeftPortion::OnGold()//“金”材质