资源描述:
《哈工大威海计算机图形学实验报告》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、计算机图形学实验报告实验一、二技术之三维变换计算机图形学基础知识-三维变换变换足计算机图形学屮重要概念,包拈最基本的三维变换,即儿何变换、投影变换、裁剪变换、视U变换。1.从三维空间到二维平側1.1相机模拟在真实世界里,所有的物体都足三维的。似是,这些三维物体在计算机世界中却必须以二维平而物体的形式表现出来。那么,这些物体足怎样从三维变换到二维的呢?卜‘面我们采川相机(Came⑼模拟的方式来讲述这个概念。实际上,从三维空间到二维平Ifti,就如同川相机扪照一样,通常都耍经历以下几个步骤(括兮内表示的是相应的阁形学概念):第一步,将相机置于三角架
2、上,让它对准三维景物(视点、变换,ViewingTransformation)o策二步,将三维物体放在近当的位置(榄型变换,ModelingTransformation)0第三步,选择相机镜头卯调焦,使三维物体投影在二维胶/f上(投影变换,ProjectionTransformation)o第四步,决定二维像片的人小(视U变换,ViewportTransformation)o这样,一个三维空间甩的物体就nJ以用相应的二维平而物体表示了,也就能在二维的电脑屏幕上正确显示了。1.2三维图形显示流程运用相机模拟的万式比较通俗地讲解了三维图形显示的基木
3、过程,但在具体编程时,还必须了解三维图形世界中的几个特殊坐标系的概念,以及用这些概念表达的三维图形显示流程。计算机本身只能处理数字,阁形在计算机内也是以数字的形式进行加工和处理的。大家都知道,坐标建立了阁形和数字之间的联系。为了使被显示的物体数字化,要在被显示的物体所在的空间中定义一个來标系。这个來标系的长度肀位和少标轴的方向要适合对被显示物体的描述,这个华标系称为世界飧标系。计算机对数字化的显示物体作了加工处理后,要在图形显示器上显示,这就要在图形显示器屏幕上定义一个二维直角坐标系,这个坐标系称为屏幕坐标系。这个坐标系坐标轴的方句通常取成平行
4、于屏幕的边缘,叱标原点取在左下角,长度单位常取成-个象素的长度,大小可以足整型数。为了使显示的物体能以合适的位置、人小和方句显示出來,必须要通过投影。投影的方法有两种,即正射投影和透视投影。冇时为了突出图形的一部分,只把图形的某一部分显示出來,这时吋以定义一个三维视景体(ViewingVolume)。正射投影时一般是一个长方体的视景体,透视投影时一般是一个梭台形的视景体。只有视景体内的物体能被投影在显示平而上,其他部分则不能。在屏幕窗口内可以定义一个矩形,称为视口(Viewport),视景体投影后的图形就在视U内显示。为了适hV:物理设备坐标和
5、视口所在坐标的差别,还要作一适灰物理坐标的变换。这个坐标系称为物理设备华标系。根据上面所述,三维图形的显示流程应如图所示。世界坐标系中的三维物体S2.儿何变换实际上,上述所说的视点变换和模型变换本质上都足一回事,即图形学屮的儿何变换。只是视点变换一般只有平移和旋转,没杏比例变换。当视点进行平移或旋转时,视点坐标系屮的物体就相当于在世界坐标系中作反方向的平移或旋转。因此,从某种意义上讲,二者可以统一,只是各自出发点小一样而已。读存可以根拋具体情况,选择;屮一个角度去考虑,这样便于理解2.1平移°22.2旋转2.3缩放和反射3、投影变换投影变换是一
6、种很关键的阁形变换,有两种投影方式,一种是d•:射投影,另一种是透视投影。事实上,投影变换的目的就是定义一个视景体,使得视枭体外多余的部分裁剪掉,最终阁像只是视景体内的有关部分。实验截图及主要代码:实验一:主耍代码:voidrenderScene(void){glClear(GL_COLOR_BUFFER_BIT);glColor4f(1.0,1.0,1.0,1.0);//矩形脸glRectf(-0.6,0.7z0.6,-0.7);glColor3f(0,1.0,0);glBegin(GL_TRIANGLES);//三角形昂了glVertex3
7、f(0.1,-0.15,0.0);glVertex3f(0,0.2,0.0);glVertex3f(-0.1,-0.15,0.0);glEndO;glColor3f(0.0,0.0,1.0);//设置当前颜色为蓝色glRectf(0.15,0.25,0.3,0.4);//绘制一个矩形眼睛glRectf(-0.15,0.25,-0.3,0.4};//绘制一个矩形glColor3f(1.0,0.0,0.0);//红色glBegin(GLJ^0LYG0N);//4:屏幕上绘制一个四边形嘴巴glVertex2f(-0.2,-0.4);glVertex2
8、f(-0.3,-0.3);glVertex2f(0.3,-0.3);glVertex2f(0.2,-0.4);glEnd();glColor3f(0.