计算机图形学实验-三维变换

第一步:创建三维正方体

创建新类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
  • 3
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值