第一步:创建三维正方体
创建新类CP3,该类中有三个变量x、y、z,一个变量w,用来进行矩阵运算,一个带参构造函数,用来传入三维点。
CP2类也要创建一下。
在CView类中新建CP3类型的变量V,表示一个数组。
double类型的k,表示数组用来代替三角函数,算出视点坐标。
double类型的D和R,分别是视距和视镜。
Phi和Theta,分别是与z轴的偏转角和与y轴的偏转角,可以任意设值。
将它们在构造函数中初始化。
全都初始化之后:
CMy1202View::CMy1202View()
{
// TODO: add construction code here
V=new CP3[8];
k=new double[9];
R=400;D=350;
PI=3.1415;
Phi=60;Theta=70;
}
三维顶点初始化函数:
void CMy1202View::ReadVertex()
{
double a=50;
V[0].x=-a;V[0].y=-a;V[0].z=-a;
V[1].x=+a;V[1].y=-a;V[1].z=-a;
V[2].x=+a;V[2].y=+a;V[2].z=-a;
V[3].x=-a;V[3].y=+a;V[3].z=-a;
V[4].x=-a;V[4].y=-a;V[4].z=+a;
V[5].x=+a;V[5].y=-a;V[5].z=+a;
V[6].x=+a;V[6].y=+a;V[6].z=+a;
V[7].x=-a;V[7].y=+a;V[7].z=+a;
}
在CView.cpp中引入数学头文件
#include "math.h"
将三维顶点转换化为二维顶点的函数
初始化三角函数与视点位置:
void CMy1202View::InitP()
{
k[1]=sin(PI*Theta/180);
k[2]=sin(PI*Phi/180);
k[3]=cos(PI*Theta/180);
k[4]=cos(PI*Phi/180);
k[5]=k[2]*k[3];
k[6]=k[2]*k[1];
k[7]=k[4]*k[3];
k[8]=k[4]*k[1];
ViewPoint.x=R*k[6];
ViewPoint.y=R*k[4];
ViewPoint.z=R*k[5];
}
观察坐标系到屏幕坐标系的变换:
CP2 CMy1202View::PerProject(CP3 WorldP)
{
CP3 ViewP;
ViewP.x=k[3]*WorldP.x-k[1]*WorldP.z;
ViewP.y=-k[8]*WorldP.x+k[2]*WorldP.y-k[7]*WorldP.z;
ViewP.z=-k[6]*WorldP.x-k[4]*WorldP.y-k[5]*WorldP.z+R;
CP2 ScreenP;
ScreenP.x=D*ViewP.x/ViewP.z;
ScreenP.y=D*ViewP.y/ViewP.z;
return ScreenP;
}
将正方体对应的点连线,用来显示正方体。加了映射模式
void CMy1202View::show()
{
CDC* pDC=GetDC();
CRect rect;
GetClientRect(&rect);
pDC