3D图形变换汇总.docx
《3D图形变换汇总.docx》由会员分享,可在线阅读,更多相关《3D图形变换汇总.docx(24页珍藏版)》请在冰豆网上搜索。
3D图形变换汇总
3D图形变换
一.实验目的:
掌握3D图像的变换,了解多数的3D变换,平移,旋转等几何变换,还有投影变换等知识。
二.实验原理:
3D图像的移动,比例变化,旋转等几何变换算法原理及各种投影变换算法原理。
三.实验步骤:
一.建立MFC单文档程序,用来编写3D变换。
二.建立Mainframe,并设计,添加相应的ID及映射函数。
三.实验的主要代码:
1、设计3维图形平移变换算法的实现程序;
voidCMyView:
:
OnTranslation()
{
m_Select=SEL_TS;
m_str="平移";
CBaseClassmy1;//构造新的CBaseClass对象
inti,j;
for(i=1;i<=4;++i)
{
for(j=1;j<=4;++j)
my1.A[i][j]=0;
}
my1.A[1][1]=1;
my1.A[2][2]=1;
my1.A[4][4]=1;
my1.A[3][3]=1;
my1.A[4][1]=20;//x轴方向上平移
my1.A[4][2]=28;//y轴方向上平移
my1.A[4][3]=28;//z轴方向上平移
my1.Draw();
}
2、设计3维图形缩放变换算法的实现程序;
voidCMyView:
:
OnScalingS()
{
m_Select=SEL_MO;
m_str="整体变比";
CBaseClassmy1;//构造新的CBaseClass对象
inti,j;
for(i=1;i<=4;++i)
{
for(j=1;j<=4;++j)
my1.A[i][j]=0;
}
my1.A[1][1]=1;
my1.A[2][2]=1;
my1.A[3][3]=1;
my1.A[4][4]=0.5;
my1.Draw();
}
voidCMyView:
:
OnScalingXyz()
{
m_Select=SEL_MO;
m_str="XYZ变比";
CBaseClassmy1;//构造新的CBaseClass对象
inti,j;
for(i=1;i<=4;++i)
{
for(j=1;j<=4;++j)
my1.A[i][j]=0;
}
my1.A[1][1]=2;//x轴方向上比例
my1.A[2][2]=1;//y轴方向上比例
my1.A[3][3]=2;//z轴方向上比例
my1.A[4][4]=1;
my1.Draw();}
3、设计3维图形旋转变换算法的实现程序。
voidCMyView:
:
OnRotationX()
{
m_Select=SEL_RX;
m_str="关于X轴旋转";
CBaseClassmy1;//构造新的CBaseClass对象
inti,j;
for(i=1;i<=4;++i)
{
for(j=1;j<=4;++j)
my1.A[i][j]=0;
}
my1.A[1][1]=1;
my1.A[2][2]=cos(70*PI/180);//旋转70度
my1.A[3][2]=sin(70*PI/180);
my1.A[2][3]=-sin(70*PI/180);
my1.A[3][3]=cos(70*PI/180);
my1.A[4][4]=1;
my1.Draw();
}
voidCMyView:
:
OnRotationY()
{
m_Select=SEL_RY;
m_str="关于Y轴旋转";
CBaseClassmy1;//构造新的CBaseClass对象
inti,j;
for(i=1;i<=4;++i)
{
for(j=1;j<=4;++j)
my1.A[i][j]=0;
}
my1.A[2][2]=1;
my1.A[1][1]=cos(80*PI/180);//旋转80度
my1.A[3][1]=sin(80*PI/180);
my1.A[1][3]=-sin(80*PI/180);
my1.A[3][3]=cos(80*PI/180);
my1.A[4][4]=1;
my1.Draw();
}
voidCMyView:
:
OnRotationZ()
{
m_Select=SEL_RZ;
m_str="关于Z轴旋转";
CBaseClassmy1;//构造新的CBaseClass对象
inti,j;
for(i=1;i<=4;++i)
{
for(j=1;j<=4;++j)
my1.A[i][j]=0;
}
my1.A[3][3]=1;
my1.A[1][1]=cos(60*PI/180);//旋转60度
my1.A[1][2]=sin(60*PI/180);
my1.A[2][1]=-sin(60*PI/180);
my1.A[2][2]=cos(60*PI/180);
my1.A[4][4]=1;
my1.Draw();
}
4.设计3维图形错切变换算法的实现程序:
voidCMyView:
:
OnShX()
{
//TODO:
Addyourcommandhandlercodehere
m_Select=SEL_SHX;
m_str="X方向错切";
CBaseClassmy1;//构造新的CBaseClass对象
inti,j;
for(i=1;i<=4;++i)
{
for(j=1;j<=4;++j)
my1.A[i][j]=0;
}
my1.A[1][1]=1;
my1.A[2][2]=1;
my1.A[3][3]=1;
my1.A[4][4]=1;
my1.A[1][2]=0.5;//为0错切平面离开Z轴,沿X方向移动
my1.A[1][3]=0.5;//为0错切平面离开Y轴,沿X方向移动
my1.Draw();
}
voidCMyView:
:
OnShY()
{
//TODO:
Addyourcommandhandlercodehere
m_Select=SEL_SHY;
m_str="Y方向错切";
CBaseClassmy1;//构造新的CBaseClass对象
inti,j;
for(i=1;i<=4;++i)
{
for(j=1;j<=4;++j)
my1.A[i][j]=0;
}
my1.A[1][1]=1;
my1.A[2][2]=1;
my1.A[3][3]=1;
my1.A[4][4]=1;
my1.A[1][2]=0.5;//为0错切平面离开Z轴,沿Y方向移动
my1.A[3][2]=0.5;//为0错切平面离开X轴,沿Y方向移动
//RedrawWindow();
my1.Draw();
}
voidCMyView:
:
OnV()
{
//TODO:
Addyourcommandhandlercodehere
m_Select=SEL_V;
m_str="主视图";
inti,j;
CBaseClassmy1;//构造新的CMyClass对象
//将主视图变换矩阵清零
for(i=1;i<=4;++i)
{
for(j=1;j<=4;++j)
my1.A[i][j]=0;
}
//给主视图变换矩阵赋值
my1.A[1][1]=1;
my1.A[3][3]=1;
my1.A[4][4]=1;
RedrawWindow();
my1.Display();
}
5.设计3维图形对称变换算法的实现程序:
voidCMyView:
:
OnMirrorO()
{
//TODO:
Addyourcommandhandlercodehere
m_Select=SEL_MO;
m_str="关于原点对称";
CBaseClassmy1;//构造新的CBaseClass对象
inti,j;
for(i=1;i<=4;++i)
{
for(j=1;j<=4;++j)
my1.A[i][j]=0;
}
my1.A[1][1]=-1;
my1.A[2][2]=-1;
my1.A[3][3]=-1;
my1.A[4][4]=1;
my1.Draw();
}
voidCMyView:
:
OnMirrorOxy()
{
//TODO:
Addyourcommandhandlercodehere
m_Select=SEL_MOXY;
m_str="关于OXY平面对称";
CBaseClassmy1;//构造新的CBaseClass对象
inti,j;
for(i=1;i<=4;++i)
{
for(j=1;j<=4;++j)
my1.A[i][j]=0;
}
my1.A[1][1]=1;
my1.A[2][2]=1;
my1.A[3][3]=-1;
my1.A[4][4]=1;
my1.Draw();
}
voidCMyView:
:
OnMirrorOyz()
{
//TODO:
Addyourcommandhandlercodehere
m_Select=SEL_MOYZ;
m_str="关于OYZ平面对称";
CBaseClassmy1;//构造新的CBaseClass对象
inti,j;
for(i=1;i<=4;++i)
{
for(j=1;j<=4;++j)
my1.A[i][j]=0;
}
my1.A[1][1]=-1;
my1.A[2][2]=1;
my1.A[3][3]=1;
my1.A[4][4]=1;
my1.Draw();
}
voidCMyView:
:
OnMirrorOzx()
{
//TODO:
Addyourcommandhandlercodehere
m_Select=SEL_MOZX;
m_str="关于OZX平面对称";
CBaseClassmy1;//构造新的CBaseClass对象
inti,j;
for(i=1;i<=4;++i)
{
for(j=1;j<=4;++j)
my1.A[i][j]=0;
}
my1.A[1][1]=1;
my1.A[2][2]=-1;
my1.A[3][3]=1;
my1.A[4][4]=1;
my1.Draw();
}
voidCMyView:
:
OnMirrorX()
{
//TODO:
Addyourcommandhandlercodehere
m_Select=SEL_MX;
m_str="关于X对称";
CBaseClassmy1;//构造新的CBaseClass对象
inti,j;
for(i=1;i<=4;++i)
{
for(j=1;j<=4;++j)
my1.A[i][j]=0;
}
my1.A[1][1]=1;
my1.A[2][2]=-1;
my1.A[3][3]=-1;
my1.A[4][4]=1;
my1.Draw();
}
voidCMyView:
:
OnMirrorY()
{
//TODO:
Addyourcommandhandlercodehere
m_Select=SEL_MY;
m_str="关于Y对称";
CBaseClassmy1;//构造新的CBaseClass对象
inti,j;
for(i=1;i<=4;++i)
{
for(j=1;j<=4;++j)
my1.A[i][j]=0;
}
my1.A[1][1]=-1;
my1.A[2][2]=1;
my1.A[3][3]=-1;
my1.A[4][4]=1;
my1.Draw();
}
voidCMyView:
:
OnMirrorZ()
{
//TODO:
Addyourcommandhandlercodehere
m_Select=SEL_MZ;
m_str="关于Z对称";
CBaseClassmy1;//构造新的CBaseClass对象
inti,j;
for(i=1;i<=4;++i)
{
for(j=1;j<=4;++j)
my1.A[i][j]=0;
}
my1.A[1][1]=-1;
my1.A[2][2]=-1;
my1.A[3][3]=1;
my1.A[4][4]=1;
my1.Draw();
}
6.设计3维图形平行投影变换算法的实现程序:
voidCMyView:
:
OnV()
{
//TODO:
Addyourcommandhandlercodehere
m_Select=SEL_V;
m_str="主视图";
inti,j;
CBaseClassmy1;//构造新的CMyClass对象
//将主视图变换矩阵清零
for(i=1;i<=4;++i)
{
for(j=1;j<=4;++j)
my1.A[i][j]=0;
}
//给主视图变换矩阵赋值
my1.A[1][1]=1;
my1.A[3][3]=1;
my1.A[4][4]=1;
RedrawWindow();
my1.Display();
}
voidCMyView:
:
OnW()
{
//TODO:
Addyourcommandhandlercodehere
m_Select=SEL_H;
m_str="侧视图";
inti,j;
CBaseClassmy1;//构造新的CMyClass对象
//将俯视图变换矩阵清零
//将侧视图变换矩阵清零
for(i=1;i<=4;++i)
{
for(j=1;j<=4;++j)
my1.Aw[i][j]=0;
}
//给侧视图变换矩阵赋值
my1.Aw[2][1]=-1;
my1.Aw[3][3]=1;
my1.Aw[4][4]=1;
RedrawWindow();
my1.Display();
}
voidCMyView:
:
OnH()
{
//TODO:
Addyourcommandhandlercodehere
m_Select=SEL_H;
m_str="俯视图";
inti,j;
CBaseClassmy1;//构造新的CMyClass对象
//将俯视图变换矩阵清零
for(i=1;i<=4;++i)
{
for(j=1;j<=4;++j)
my1.Ah[i][j]=0;
}
//给俯视图变换矩阵赋值
my1.Ah[1][1]=1;
my1.Ah[2][3]=-1;
//my1.Ah[4][3]=10;//俯视图平移量
my1.Ah[4][4]=1;
RedrawWindow();
my1.Display();
}
voidCMyView:
:
OnSe()
{
//TODO:
Addyourcommandhandlercodehere
m_Select=SEL_SE;
m_str="斜等测视图";
inti,j;
CBaseClassmy1;//构造新的CBaseClass对象
for(i=1;i<=4;++i)
{
for(j=1;j<=4;++j)
my1.A[i][j]=0;
}
my1.A[1][1]=1;
my1.A[2][2]=1;
my1.A[3][1]=0.707f;//X方向错切位移量
my1.A[3][2]=0.707f;//Y方向错切位移量
my1.A[4][4]=1;
RedrawWindow();
my1.Drawse();
}
voidCMyView:
:
OnSt()
{
//TODO:
Addyourcommandhandlercodehere
m_Select=SEL_ST;
m_str="斜二测视图";
inti,j;
CBaseClassmy1;//构造新的CMyClass对象
for(i=1;i<=4;++i)
{
for(j=1;j<=4;++j)
my1.A[i][j]=0;
}
my1.A[1][1]=1;
my1.A[2][2]=1;
my1.A[3][1]=0.3535f;//X方向错切位移量
my1.A[3][2]=0.3535f;//Y方向错切位移量
my1.A[4][4]=1;
RedrawWindow();
my1.Drawvt();
}
voidCMyView:
:
OnVe()
{
//TODO:
Addyourcommandhandlercodehere
m_Select=SEL_VE;
m_str="正等测视图";
inti,j;
CBaseClassmy2;//构造新的CMyClass对象
my2.theta_y=45;//Y轴夹角
my2.phi_x=125;//X轴夹角
//给正等测变换矩阵清零
for(i=1;i<=4;++i)
{
for(j=1;j<=4;++j)
my2.A[i][j]=0;
}
//给正等测变换矩阵赋值
my2.A[1][1]=(float)cos(my2.theta_y*PI/180);
my2.A[1][2]=(float)sin(my2.theta_y*PI/180)*(float)sin(my2.phi_x*PI/180);
my2.A[2][2]=(float)cos(my2.phi_x*PI/180);
my2.A[3][1]=(float)sin(my2.theta_y*PI/180);
my2.A[3][2]=(float)-cos(my2.theta_y*PI/180)*(float)sin(my2.phi_x*PI/180);
my2.A[4][4]=1;
RedrawWindow();
my2.Drawve();
}
voidCMyView:
:
OnVt()
{
//TODO:
Addyourcommandhandlercodehere
m_Select=SEL_VT;
m_str="正二测视图";
inti,j;
CBaseClassmy2;//构造新的CMyClass对象
my2.theta_y=115;//Y轴夹角25-115
my2.phi_x=25;//X轴夹角
//给正二测变换矩阵清零
for(i=1;i<=4;++i)
{
for(j=1;j<=4;++j)
my2.A[i][j]=0;
}
//给正二测变换矩阵赋值
my2.A[1][1]=(float)cos(my2.theta_y*PI/180);
my2.A[1][2]=(float)sin(my2.theta_y*PI/180)*(float)sin(my2.phi_x*PI/180);
my2.A[2][2]=(float)cos(my2.phi_x*PI/180);
my2.A[3][1]=(float)sin(my2.theta_y*PI/180);
my2.A[3][2]=(float)-cos(my2.theta_y*PI/180)*(float)sin(my2.phi_x*PI/180);
my2.A[4][4]=1;
RedrawWindow();
my2.Drawvt();
}
四.实验结果:
1.原三维图:
2.平移:
3.旋转:
(沿x,y,z轴)
4.变比:
5.对称
6.错切:
7.平行投影->三视图:
8.平行投影->正轴测图:
9.平行投影->斜轴测图:
10.透视图:
五.心得体会:
通过上机写程序对3D图像变换有了更深刻的了解。
图像学跟现实中的很多科技联系紧密。
对图形学这门学科也有了跟深刻的认识。