资源描述:
《课程实验指导5-投影》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、课程实验指导五实验5投影1.实验目的:了解透视图投影原理,利用VC+OpenGL实现立方体的一点、两点、三点透视图算法。2.实验内容:(1)理解投影原理;(2)读懂示范代码;(3)增加键盘控制,控制一点透视点产生正方体的移动、旋转效果;(4)实现两点透图效果。3.实验原理:本次实验内容为绘制立方体的一点透视图。透视投影按照主灭点的个数分为一点透视、二点透视和三点透视,如下图1所示。灭点灭点灭点灭点灭点灭点图1立方体的三类透视其中一点透视情况如图2所示,设z轴上有一观察点(即视点)V(0,0,d),从V点出发将物体上的点P(x,y,z)投影到XOY平面上得到P'(x',y',0),由相似三角形
2、可知一点透视变换矩阵为:图2一点透视示意…………………………….(1)根据以上,可得一点透视变换的步骤如下:(1)将三维形体平移到适当位置lx、ly、lz;(2)令视点在z轴(0,0,d),利用上述公式(1)进行透视变换;4.实验代码://Projection.cpp:Definestheentrypointfortheconsoleapplication.//#include"stdafx.h"#include#include#includestructMatrix{doublep[4][4];Matrixoperator*(Matr
3、ix&);Matrix();//单位矩阵};Matrix::Matrix(){for(longi=0;i<4;i++){for(longj=0;j<4;j++){if(i==j)p[i][j]=1;elsep[i][j]=0;}}}MatrixMultiply(Matrix&m1,Matrix&m2){Matrixm;for(inti=0;i<4;i++)for(intj=0;j<4;j++)for(intk=0;k<4;k++)m.p[i][j]+=(m1.p[i][k]*m2.p[k][j]);returnm;}structPt2D{intx,y;Pt2D(){x=0;y=0;};Pt2
4、D(intpx,intpy){x=px;y=py;};};structPt3D{floatx,y,z;Pt3D(){x=0;y=0;z=0;};Pt3D(floatpx,floatpy,floatpz){x=px;y=py;z=pz;};};structFaceInfo{//第一列为每个面的顶点数;其余列为面的顶点编号intnum,idx1,idx2,idx3,idx4;FaceInfo(){num=0;idx1=0;idx2=0;idx3=0;idx4=0;};FaceInfo(intfnum,intfidx1,intfidx2,intfidx3,intfidx4){num=fnum;id
5、x1=fidx1;idx2=fidx2;idx3=fidx3;idx4=fidx4;};};doublelx=480,ly=460,lz=240;doublephi=0;doubled=-500;MatrixmT,mR,mP,mTemp,mA;Pt3DboxPt[8];Pt2DboxPt2d[8];FaceInfofInfo[6];voidInitParameter()//初始化参数{mT.p[3][0]=lx;mT.p[3][1]=ly;mT.p[3][2]=lz;mR.p[0][0]=cos(phi);mR.p[0][2]=-sin(phi);mR.p[2][0]=sin(phi);mR
6、.p[2][2]=cos(phi);mP.p[2][2]=0;mP.p[2][3]=-1/d;mTemp=Multiply(mT,mR);mA=Multiply(mTemp,mP);}voidProject(Pt3Dpt,Pt2D&pt2D)//透视变换{doubleptH[4];ptH[0]=pt.x;//ptH[1]=pt.y;ptH[2]=pt.z;ptH[3]=1;doubleres[4];for(inti=0;i<4;i++)res[i]=0;for(i=0;i<4;i++)for(intj=0;j<4;j++)res[i]+=(ptH[j]*mA.p[j][i]);pt2D=Pt
7、2D(res[0]/res[3],res[1]/res[3]);}voidLineGL(Pt2Dpt0,Pt2Dpt1){glBegin(GL_LINES);glColor3f(1.0f,0.0f,0.0f);glVertex2f(pt0.x,pt0.y);glColor3f(0.0f,1.0f,0.0f);glVertex2f(pt1.x,pt1.y);glEnd();}intGetPtIdx(FaceIn