三维图形变换

三维图形变换

是在二维方法基础上增加了对z坐标的考虑得到的。与二维变换类似,引入齐次坐标表示,即:三维空间中某点的变换可以表示成点的齐次坐标与四阶的三维变换矩阵相乘。

一、平移变换

 

二.比例变换

 

例如:对长方体进行比例变换,

 

         

三、旋转变换

跟二维的相同

四、对称变换

有关于坐标平面、坐标轴的对称变换

(1)关于坐标平面的对称

绕哪个面变换,那个面不变

 

变换矩阵为:

其它均类似

(2)关于坐标轴变换

 

6.2 投影变换

投影变换就是把三维物体投射到投影面上得到二维平面图形

 

两种投影法的本质区别在于:透视投影的投影中心到投影面之间的距离是有限的;而另一个的距离是无限的。

一、中心(透视)投影

特点:投影线均通过投影中心,物体的投影视图由计算投影线与观察平面交点而得

 

在投影中心相对投影面确定的情况下,空间的一个点在投影面上只存在唯一一个投影。

 

透视投影生成真实感视图,但不保证相关比例。

二、平行投影

1、把透视投影的中心移至无穷远处,则各投影线称为相互平行的直线,这种投影

2、分为正投影和斜投影

 

3、特点:保持物体的有关比例不变

三、平面集合投影的分类

 

6.3 三视图

一、

1、根据投影面与坐标轴的夹角可分为两类:三视图和正轴侧图。

当投影面与某一坐标轴垂直时,得到的投影为三视图,这是投影方向与这个坐标轴的方向一致;否则,得到的投影为正轴侧图

 

2、三视图包括主、侧、俯视图三种,投影面分别于x/y/z轴垂直

3、优点:反映形体的实际尺寸,工程制图中常用三视图来测量形体间的距离、角度以及相互位置关系。

4、缺点:三视图上只有物体一个面的投影,只有将三个图放在一起,才能综合物体的空间形状

二、三视图的计算

1>确定三维物体上个点的位置坐标

2>引入齐次坐标,求出所做变换相应的变换矩阵

3>将所做变换用矩阵表示,通过运算求得三维物体上各点经变换后的点坐标值

4>由变换后得到的二维点绘出三维物体投影后的三视图

三、

1>主视图:将三维物体xoz面(又称v面)做垂直投影,得到主视图

 

2>俯视图:将三维物体xoy面(又称h面)做垂直投影,得到俯视图

 

为了让其与主视图在一个平面内,让俯视图绕x轴旋转90°。并让两者产生一定的间距,让其再沿Z轴负方向移动些距离

 

3>侧视图:将三维物体yoz面(又称w面)做垂直投影,得到侧视图

 

三种结果:

 

四、正轴侧

1、当投影面与三个坐标轴之间的夹角都相等时为等轴测

当投影面与两个坐标轴之间的夹角都相等时为正二测

投影面与三个坐标轴之间的夹角都不相等时为正三测

 

 

6.4  透视投影

一、

1、平行投影表示真实大小和形状的物体

透视投影表示真实看到的物体,比轴测图更富有立体感和真实感

2、透视投影是为了获得接近真实三维物体的视觉效果而在二维的纸或者画布平面上绘图或者渲染的一种方法,能逼真地反映形体的空间形象,也称为透视图。

3D渲染的基本概念,也是3D程序设计的基础。

3、透视投影图是用中心投影法形成的,视点在有限远处。

4、透视基本原理:位于空间的任何一个点,它之所以能被人们的眼睛所看见,是因为从该点出发射出来的一条光线能够达到人们的眼睛。

 

可以通过求出顶点的透视投影而获得空间任意立体的透视投影

二、

1、透视图的特点:

1>近大远小,近高远低

2>近长远短,近疏远密

3>互相平行的直线,其透视会交于一点

2、影响透视的两个因素:

1>视角:观察物体的角度

2>视距:眼睛到物体之间的距离

3、透视图的分类:

1>一点透视:也称平行透视。互相平行的直线汇聚成一个点,此点称为灭点,而且只有一个,所以称为一点透视。

 

2>两点透视:称成角透视。通过物体旋转一定角度或者视点转动一定角度

其边线的延长线会相交于视平行线上立方体左右两侧的两点(灭点),所以叫两点透视

       

3>、三点透视

一般常见于物体的俯视和仰视,物体各个边的延长线会分别消失于三个点。

 

两点透视是最常用的透视关系,其次是一点透视,而三点透视只适合表现高大物体,并不常用

三、

1、生成透视投影图的方法

(1)透视坐标与z值成反比,即z值越大,透视坐标值越小

(2)D的取值不同,可以对形成的透视图有放大和缩小的功能。当d值较大时,形成的透视图越大,反之缩小。

第一个矩阵为透视变换矩阵,第二个矩阵为在x0y面上投影

转载于:https://www.cnblogs.com/keguniang/p/9721508.html

三维图c语言编写,可以缩放图。 /* Note:Your choice is C IDE */ #include "stdio.h" #include "graphics.h" #include "math.h" void hua(int T[8][3]) { moveto(T[0][0]/T[0][2],T[0][1]/T[0][2]); lineto(T[1][0]/T[1][2],T[1][1]/T[1][2]); lineto(T[2][0]/T[2][2],T[2][1]/T[2][2]); lineto(T[3][0]/T[3][2],T[3][1]/T[3][2]); lineto(T[0][0]/T[0][2],T[0][1]/T[0][2]); moveto(T[4][0]/T[4][2],T[4][1]/T[4][2]); lineto(T[5][0]/T[5][2],T[5][1]/T[5][2]); lineto(T[6][0]/T[6][2],T[6][1]/T[6][2]); lineto(T[7][0]/T[7][2],T[7][1]/T[7][2]); lineto(T[4][0]/T[4][2],T[4][1]/T[4][2]); moveto(T[0][0]/T[0][2],T[0][1]/T[0][2]); lineto(T[4][0]/T[4][2],T[4][1]/T[4][2]); moveto(T[1][0]/T[1][2],T[1][1]/T[1][2]); lineto(T[5][0]/T[5][2],T[5][1]/T[5][2]); moveto(T[2][0]/T[2][2],T[2][1]/T[2][2]); lineto(T[6][0]/T[6][2],T[6][1]/T[6][2]); moveto(T[3][0]/T[3][2],T[3][1]/T[3][2]); lineto(T[7][0]/T[7][2],T[7][1]/T[7][2]); } /*/////////////////////////////////////////////////////////////////////////*/ void x(int T[8][3],float af) { int i; float theta =0.00017* af; for(i=0;i<8;i++) { T[i][0]=T[i][0]; T[i][1]=T[i][0]*0+T[i][1]*cos(theta)+T[i][2]*(-sin(theta)); T[i][2]=T[i][0]*0+T[i][1]*sin(theta)+T[i][2]*cos(theta); } hua(T); } /*//////////////////////////////////////////////////////////////////////*/ void y(int T[8][3],float af) { int i; float theta =0.00017* af; for(i=0;i<8;i++) { T[i][0]=T[i][0]*cos(theta)+T[i][2]*sin(theta); T[i][1]=T[i][1]; T[i][2]=T[i][0]*(-sin(theta))+T[i][2]*cos(theta); } hua(T); } /*/////////////////////////////////////////////////////////////////////////*/ void z(int T[8][3],float af) { int i; float theta =0.00017* af; for(i=0;i<8;i++) { T[i][0]=T[i][0]*cos(theta)+T[i][1]*(-sin(theta)); T[i][1]=T[i][1]*sin(theta)+T[i][1]*cos(theta); T[i][2]=T[i][2]; } hua(T); } /*//////////////////////////////////////////////////////////////*/ void projection(int T[8][3],float af,float af1) { int i; float theta =0.017* af; float theta1 =0.017* af1; for(i=0;i<8;i++) { T[i][0]=T[i][0]*cos(theta)+T[i][1]*(-sin(theta)); T[i][1]=0; T[i][2]=T[i][0]*(-sin(theta)*sin(theta1))+T[i][1]*(-cos(theta)*sin(theta1))+T[i][2]*cos(theta1); } hua(T); } /*////////////////////////////////////////////////////////////////////*/ void perspective(int T[8][4],float af,float af1,float q) { int i; float theta =0.017* af; float theta1 =0.017* af1; for(i=0;i<8;i++) { T[i][0]=T[i][0]*cos(theta)+T[i][1]*(-sin(theta)); T[i][1]=0; T[i][2]=T[i][0]*(-sin(theta)*sin(theta1))+T[i][1]*(-cos(theta)*sin(theta1))+T[i][2]*cos(theta1); T[i][3]=T[i][0]*q*sin(theta)*cos(theta1)+T[i][1]*q*cos(theta)*cos(theta1)+T[i][2]*q*sin(theta1)+T[i][3]; } hua(T); } /*//////////////////////////////////////////////////////////////////////*/ void Zperspective(int T[8][3]) { int i; for(i=0;i<8;i++) { T[i][0]=T[i][0]*0.707+T[i][1]*(-0.707); T[i][1]=0; T[i][2]=T[i][0]*(-0.408)+T[i][1]*(-0.408)+T[i][2]*(0.816); } hua(T); } /*==============================================================================================================*/ main() { int gdriver=DETECT,gmode; int T[8][3]={530,390,1,500,420,1,560,420,1,590,390,1,530,450,1,500,480,1,560,480,1,590,450,1}; int TT[8][3]={80,50,1,50,80,1,110,80,1,140,50,1,80,110,50,140,110,140,140,110,80,110,1}; float af,af1,q; initgraph(&gdriver,&gmode,""); cleardevice(); setbkcolor(9);setcolor(4); hua(T); printf("input af:"); scanf("%f",&af); x(T,af); /*****************************/ printf("input af:"); scanf("%f",&af); x(T,af); /*****************************/ printf("input af:"); scanf("%f",&af); x(T,af); /*****************************/ printf("input af:"); scanf("%f",&af); y(T,af); /*****************************/ printf("input af:"); scanf("%f",&af); z(T,af); /*****************************/ /* printf("input af,af1:"); scanf("%f%f",&af,&af1); projection(T,af,af1); printf("input af,af1,q:"); scanf("%f%f%f",&af,&af1,&q); perspective(T,af,af1,q); Zperspective(T); */ getch(); closegraph(); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值