计算机图形学实验报告实验一、二技术之三维变换计算机图形学基础知识-三维变换变换是计算机图形学中重要概念,包括最基本的三维变换,即几何变换、投影变换、裁剪变换、视口变换。1.从三维空间到二维平面1.1相机模拟在真实世界里,所有的物体都是三维的。但是,这些三维物体在计算机世界中却必须以二维平面物体的形式表现出来。那么,这些物体是怎样从三维变换到二维的呢?下面我们采用相机(Camera)模拟的方式来讲述这个概念。实际上,从三维空间到二维平面,就如同用相机拍照一样,通常都要经历以下几个步骤(括号内表示的是相应的图形学概念):第一步,将相机置于三角架上,让它对准三维景物(视点变换,ViewingTransformation)。第二步,将三维物体放在适当的位置(模型变换,ModelingTransformation)。第三步,选择相机镜头并调焦,使三维物体投影在二维胶片上(投影变换,ProjectionTransformation)。第四步,决定二维像片的大小(视口变换,ViewportTransformation)。这样,一个三维空间里的物体就可以用相应的二维平面物体表示了,也就能在二维的电脑屏幕上正确显示了。1.2三维图形显示流程运用相机模拟的方式比较通俗地讲解了三维图形显示的基本过程,但在具体编程时,还必须了解三维图形世界中的几个特殊坐标系的概念,以及用这些概念表达的三维图形显示流程。计算机本身只能处理数字,图形在计算机内也是以数字的形式进行加工和处理的。大家都知道,坐标建立了图形和数字之间的联系。为了使被显示的物体数字化,要在被显示的物体所在的空间中定义一个坐标系。这个坐标系的长度单位和坐标轴的方向要适合对被显示物体的描述,这个坐标系称为世界坐标系。计算机对数字化的显示物体作了加工处理后,要在图形显示器上显示,这就要在图形显示器屏幕上定义一个二维直角坐标系,这个坐标系称为屏幕坐标系。这个坐标系坐标轴的方向通常取成平行于屏幕的边缘,坐标原点取在左下角,长度单位常取成一个象素的长度,大小可以是整型数。为了使显示的物体能以合适的位置、大小和方向显示出来,必须要通过投影。投影的方法有两种,即正射投影和透视投影。有时为了突出图形的一部分,只把图形的某一部分显示出来,这时可以定义一个三维视景体(ViewingVolume)。正射投影时一般是一个长方体的视景体,透视投影时一般是一个棱台形的视景体。只有视景体内的物体能被投影在显示平面上,其他部分则不能。在屏幕窗口内可以定义一个矩形,称为视口(Viewport),视景体投影后的图形就在视口内显示。为了适应物理设备坐标和视口所在坐标的差别,还要作一适应物理坐标的变换。这个坐标系称为物理设备坐标系。根据上面所述,三维图形的显示流程应如图所示。2.几何变换实际上,上述所说的视点变换和模型变换本质上都是一回事,即图形学中的几何变换。只是视点变换一般只有平移和旋转,没有比例变换。当视点进行平移或旋转时,视点坐标系中的物体就相当于在世界坐标系中作反方向的平移或旋转。因此,从某种意义上讲,二者可以统一,只是各自出发点不一样而已。读者可以根据具体情况,选择其中一个角度去考虑,这样便于理解。2.1平移2.2旋转2.3缩放和反射3、投影变换投影变换是一种很关键的图形变换,有两种投影方式,一种是正射投影,另一种是透视投影。事实上,投影变换的目的就是定义一个视景体,使得视景体外多余的部分裁剪掉,最终图像只是视景体内的有关部分。实验截图及主要代码:实验一:主要代码:voidrenderScene(void){glClear(GL_COLOR_BUFFER_BIT);glColor4f(1.0,1.0,1.0,1.0);//矩形脸glRectf(-0.6,0.7,0.6,-0.7);glColor3f(0,1.0,0);glBegin(GL_TRIANGLES);//三角形鼻子glVertex3f(0.1,-0.15,0.0);glVertex3f(0,0.2,0.0);glVertex3f(-0.1,-0.15,0.0);glEnd();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(GL_POLYGON);//在屏幕上绘制一个四边形嘴巴glVertex2f(-0.2,-0.4);glVertex2f(-0.3,-0.3);glVertex2f(0.3,-0.3);glVertex2f(0.2,-0.4);glEnd();glColor3f(0.0,0.0,1.0);//耳朵glBegin(GL_POLYGON);glVertex2f(0.6,0.2);glVertex2f(0.7,0.25);glVertex2f(0.75,0.25);glVertex2f(0.75,0.15);glVertex2f(0.6,-0.1);glEnd();glBegin(GL_POLYGON);glVertex2f(-0.6,0.2);glVertex2f(-0.7,0.25);glVertex2f(-0.75,0.25);glVertex2f(-0.75,0.15);glVertex2f(-0.6,-0.1);glEnd();glFlush();}实验二:主要代码:voidclock(inth,intm,ints,doubled){//drawbaseGLfloatbasecolor[]={.5,.5,.5};GLUquadricObj*qobj=gluNewQuadric();doublethick=0.2;glMaterialfv(GL_FRONT,GL_DIFFUSE,basecolor);glPushMatrix();glScalef(1.1,1.1,d/50);//缩放变换glutSolidCube(4);glPopMatrix();glTranslatef(0.0,0.0,0.2);//平移变换gluDeleteQuadric(qobj);//drawnumberGLfloatnumcolor[]={.5,1.0,.5};glMaterialfv(GL_FRONT,GL_DIFFUSE,numcolor);for(inti=1;i=12;++i){glPushMatrix();glRotatef(-30*i,0,0,1);glTranslatef(0,2*0.8,0);func[i-1](0.02,0.6,0.02);glPopMatrix();}hand(h,m,s,d*0.8);glutPostRedisplay();}voidhand(inth,intm,ints,doubleradius){glDisable(GL_LIGHTING);//drawhglColor3f(1,0,0);glPushMatrix();glRotatef((-h-m/60.)*30,0,0,1);//旋转变换glScalef(0.7,0.04,0.04);//缩放变换glTranslatef(0.4,0.02,0.01);glutSolidCube(1);glPopMatrix();//drawmglColor3f(0,1,0);glPushMatrix();glRotatef((-m-s/60.)*6,0,0,1);glScalef(0.75,0.04,0.04);//缩放变换glTranslatef(0.4,0.02,0.01);glutSolidCube(1);glPopMatrix();//drawsglColor3f(1,1,0);glPushMatrix();glRotatef(-s*6.,0,0,1);glScalef(1,0.04,0.04);//缩放变换glTranslatef(0.4,0.02,0.01);glutSolidCube(1);glPopMatrix();}实验三技术之曲线和曲面一、曲线的绘制OpenGL通过一种求值器的机制来产生曲线和曲面,该机制非常灵活,可以生成任意角度的多项式曲线,并可以将其他类型的多边形曲线和曲面转换成贝塞尔曲线和曲面。这些求值器能在任何度的曲线及曲面上计算指定数目的点。随后,OpenGL利用曲线和曲面上的点生成标准OpenGL图元,例如与曲线或曲面近似的线段和多边形。由于可让OpenGL计算在曲线上所需的任意数量的点,因此可以达到应用所需的精度。对于曲线,OpenGL中使用glMap1*()函数来创建一维求值器,该函数原型为:VoidglMap1{fd}(GLenumtarget,TYPEu1,TYPEu2,GLintstride,GLintorder,constTYPE*points);二、曲面构造曲面的绘制方法基本上与曲线的绘制方法是相同的,所不同的是曲面使用二维求值器,并且控制点连接起来形成一个网格。对于曲面,求值器除了使用二个参数U、V之外,其余与一维求值器基本相同。顶点坐标、颜色、法线矢量和纹理坐标都对应于曲面而不是曲线。在OpenGL中定义二维求值器的函数是:voidglMap2{fd}(GLenumtarget,TYPEu1,TYPEu2,GLintustride,GLintuorder,TYPEv1,TYPEv2,GLintvstride,GLintvorder,TYPEpoints);实验截图及主要代码:关键代码://zhuoglPushMatrix();glTranslatef(transx,transy,transz);glRotatef(spinx,1.0,0.0,0.0);glRotatef(spiny,0.0,1.0,0.0);glRotatef(spinz,0.0,0.0,1.0);glColor3f(129/255.,188/255.,205/255.);glTranslatef(3.5,0,1.1);//glScalef(0.5,1.5,0.5);glutSolidCube(1.0);glPopMatrix();glPushMatrix();glTranslatef(transx,transy,transz);glRotatef(spinx,1.0,0.0,0.0);glRotatef(spiny,0.0,1.0,0.0);glRotatef(spinz,0.0,0.0,1.0);glColor3f(129/255.,188/255.,205/255.);glTranslatef(3.5,0.7,1.1);//glScalef(2,0.2,2);glutSolidCube(1.0);glPopMatrix();//zuoglPushMatrix();glTranslatef(transx,transy,transz);glRotatef(spinx,1.0,0.0,0.0);glRotatef(spiny,0.0,1.0,0.0);glRotatef(spinz,0.0,0.0,1.0);glColor3f(129/255.,188/255.,205/255.);glTranslatef(2.5,0,1.5);//glScalef(0.4,0.5,0.4);glutSolidCube(1.0);glPopMatrix();实验四技术之纹理纹理映射可通过将纹理图“贴到”物体表面来模拟物体表面细节。纹理是物体表面的细小结构,它可以是光滑表面的花纹、图案,是颜色纹理。纹理还可以是粗糙的表面(如桔子表面的皱纹),它们被称为几何纹理,是基于物体表面的微观几何形状的表面纹理,一种最常用的几何纹理就是对物体表面的法向进行微小的扰动来表现物体表面的细节。纹理映射原理步骤1.将屏幕像素的四个角点映射到景物坐标空间中可见的物体表面上.2.将景物坐标空间映射到纹理坐标空间.3.将像素所对应的纹理坐标空间中的四边形内的所有