
三维实体在二维平面上问题探讨11111.doc
20页三维空间实体在二维平面年的基本问题探讨试验名称:一、三维空间实体在二维平面上的投影,二、三维空间面实体在二维平面上的显示,三、三维空间实体如何实现自身的消隐,四、三维空间中多个综合实体之间的消隐,五、如何实现从不同角度观察三维实体试验目的:理解在计算机图形学中如何实现三维图形的画法,掌握一些简单三维图形的绘制及其各种变换操作,理解在显示三维图形时需要用到隐藏面的消隐及掌握常见的隐藏面消隐算法,并试着实现三维综合画面中多个物体之间的简单消隐和它们的布局,实现三维物体的一些常见功能(如:物体的变换,从不同的角度观察物体,从不同的距离观察物体,选者不同的观察中心观察三维物体等)试验内容:(一)、三维空间实体在二维平面上的投影1、 算法原理:无论是显示器还是纸,它们都是二维的,如何将三维物体(图形)在二维的显示设备上显示出来呢?为了解决这个问题,这里借鉴了照相机的成像过程,即三维物体在二维上胶卷上的投影,投影分为平行投影与透视投影两种一、平行投影,在这里我先作一个假设,即假设我的投影面是垂直于Z轴的,这样以来平行投影变的非常简单,一个三维点P(x, y, z)在垂直于Z轴的平面内的投影 点就为Q(x, y),因为我的观察方向平行于Z轴,所以Z轴上的坐标值在投影面内反映不出来。
当然我这里的平行投影是正投影,暂不考虑斜投影二、透视投影,这里我仍然沿用上面的假设,并且观察点在Z轴上,距离为d,由三角形相似知:三维空间点P(x, y, z),到二维平面点的投影点为:Q(x1,y1),其中 x1 = d ×x/(d – z),y1 = d ×y/(d – z)但实际问题并不象我假设的那样简单,即都从Z轴的方向去观察物体,不过也复杂不了多少比如我从(qx, qy ,qz)这样一个方向角去观察物体,其中qx,qy,qz分别代表我的视线与x轴,y轴及z轴所成的角度这时我只需在投影前对坐标系进行适当的旋转,使旋转后新坐标系仍然满足我上面的假设,即Z轴平行于我的视线,这样不也就将问题转化了,这里再假设此时已经有一个坐标系的旋转函数,至于怎样旋转坐标系待后再叙2、程 序:void Point3D_2D(int * x,int * y,int * z, float qx,float qy,float qz)/*投影方向为{ (qx,qy,qz)*/ XuanZhuan3D_ZBX(x,y,z,qx,1);/*坐标系的旋转函数*/ XuanZhuan3D_ZBX(x,y,z,qz,3); *x = *x; *y = *y; /*平行投影*/}void Point3D_2D(int * x,int * y,int * z,int d,float qx,float qy,float qz)/*投影方向为{ (qx,qy,qz)*/ XuanZhuan3D_ZBX(x,y,z,qx,1);/*坐标系的旋转函数*/ XuanZhuan3D_ZBX(x,y,z,qz,3); *x =d×(*x)/(d - *z); *y = d ×(*y)/(d - *z); /*透视投影*/} 这里给出一个画正方体线框图的程序 算法过程:先找到正方体八个顶点在投影面的投影点,然后再在投影面中按照正方体的连线将八 个顶点用直线连接起来即可。
/ ***********************//* 正方体线框图的算法 *//***********************/void Zft3D(Point3D A,int r,int color,float qx,float qy,float qz) /* 观察方向为(qx,qy,qz)*/{ int x,y,z,X,Y,Z; Point3D B1,B2,B3,B4,B5,B6,B7,B8; Point A1,A2,A3,A4,A5,A6,A7,A8; x = A.x; y = A.y; z = A.z; B1.x = x + r/2.0; B1.y = y - r/2.0; B1.z = z - r/2.0; B2.x = x + r/2.0; B2.y = y + r/2.0; B2.z = z - r/2.0; B3.x = x - r/2.0; B3.y = y + r/2.0; B3.z = z - r/2.0; B4.x = x - r/2.0; B4.y = y - r/2.0; B4.z = z - r/2.0; B5.x = x + r/2.0; B5.y = y - r/2.0; B5.z = z + r/2.0; B6.x = x + r/2.0; B6.y = y + r/2.0; B6.z = z + r/2.0; B7.x = x - r/2.0; B7.y = y + r/2.0; B7.z = z + r/2.0; B8.x = x - r/2.0; B8.y = y - r/2.0; B8.z = z + r/2.0; X = B1.x; Y = B1.y; Z = B1.z; Point3D_2D(&X,&Y,&Z,qx,qy,qz); A1.x = X; A1.y = Y; putpixel(X,Y,color); X = B2.x; Y = B2.y; Z = B2.z; Point3D_2D(&X,&Y,&Z,qx,qy,qz); A2.x = X; A2.y = Y; putpixel(X,Y,color); X = B3.x; Y = B3.y; Z = B3.z; Point3D_2D(&X,&Y,&Z,qx,qy,qz); A3.x = X; A3.y = Y; putpixel(X,Y,color); X = B4.x; Y = B4.y; Z = B4.z; Point3D_2D(&X,&Y,&Z,qx,qy,qz); A4.x = X; A4.y = Y; putpixel(X,Y,color); X = B5.x; Y = B5.y; Z = B5.z; Point3D_2D(&X,&Y,&Z,qx,qy,qz); A5.x = X; A5.y = Y; putpixel(X,Y,color); X = B6.x; Y = B6.y; Z = B6.z; Point3D_2D(&X,&Y,&Z,qx,qy,qz); A6.x = X; A6.y = Y; putpixel(X,Y,color); X = B7.x; Y = B7.y; Z = B7.z; Point3D_2D(&X,&Y,&Z,qx,qy,qz); A7.x = X; A7.y = Y; putpixel(X,Y,color); X = B8.x; Y = B8.y; Z = B8.z; Point3D_2D(&X,&Y,&Z,qx,qy,qz); A8.x = X; A8.y = Y; putpixel(X,Y,color); LineDDA(A1,A2,color); LineDDA(A1,A4,color); LineDDA(A1,A5,color); LineDDA(A2,A3,color); LineDDA(A2,A6,color); LineDDA(A3,A4,color); LineDDA(A3,A7,color); LineDDA(A4,A8,color); LineDDA(A5,A6,color); LineDDA(A5,A8,color); LineDDA(A7,A6,color); LineDDA(A7,A8,color); }(二)、三维空间面实体在二维平面上的显示 1、算法思想:这里只以凸多面体并且为特殊的凸多面体,即长方体为例。
我们知道,在观察长方体时,我们最多只能看到3个面,至少可以看到1个面如果我把长方体的6个面全部显示(或填充)出来 那么就不会显示出一个正常的长方体,所以我这里只填充3个相临的面,另外3个面我不用显示(或填充),从而达到视觉上呈现一个三维的长方体,并且这长方体还可以实现与X轴,Y轴及Z轴在0到90度的不同角度的被观察到重要的是这个长方体是从真正意义上的三维空间中画的 2、算法过程:首先确定要画的三个面的中心,然后再以这三个中心分别画它们的矩形面3、程 序:/***************************//** 3D空间矩形面 **//** 平行于X-Y平面 **//***************************/void Rect_3DXY(Point3D A,int a,int b,int color,float qx,float qy,float qz)/*其中点A为长方体的{ 中心,a,b,h为长宽高*/ int i,j,k,X,Y,Z; Point3D B1,B2,B3,B4;/*三维点*/ B1.x = A.x + b/2.0; B1.y = A.y - a/2.0; B1.z = A.z; B2.x = A.x + b/2.0; B2.y = A.y + a/2.0; B2.z = A.z; B3.x = A.x - b/2.0; B3.y = A.y + a/2.0; B3.z = A.z; B4.x = A.x - b/2.0; B4.y = A.y - a/2.0; B4.z = A.z; X = B1.x; Y = B1.y; Z = B1.z; i = X; j = Y; while(j <= B2.y) { while(i >= B4.x) { Point3D_2D(&X,&Y,&Z,qx,qy,qz); putpixel(X,Y,color); i--; X = i; Y = j; Z = B1.z; } j++; X = B1.x; Y = j; Z = B1.z; i = X; }}/***************************//** 3D空间矩形面 **//** 平行于X-Z平面 **//***************************/void Rect_3DXZ(Point3D A,int a,int b,int color, float qx,float qy,float qz){ int i,j,k,X,Y,Z; Point3D B1,B2,B3,B4; B1.x = A.x + a/2.0; B1.y = A.y; B1.z = A.z -。
