版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、图元图元如何在空间放置模型如何在空间放置模型深度缓存概念深度缓存概念 OpenGL图元是抽象的几何概念,不是真实世界中的物体,因此须用相关的数学模型来描述。 在OpenGL中,二维坐标点全看作三维坐标点,所有的点都用齐次坐标来描述 1)如果实数a非零,则(x, y, z, w)和(ax, ay, az, aw)表示同一个点,类似于x/w = (ax)/( aw); 2)三维空间点(x, y, z)的齐次点坐标为(x, y, z, 1.0),二维平面点(x,y)的齐次坐标为(x, y, 0.0, 1.0); 3)当w不为零时,齐次点坐标(x, y, z, w)即三维空间点坐标(x/w, y/w,
2、 z/w);当w为零时,齐次点(x, y, z, 0.0)表示此点位于某方向的无穷远处。注意:OpenGL中指定w大于或等于0.0。 OpenGL基本库提供了大量绘制各种类型图元的方法,辅助库也提供了不少描述复杂三维图形的函数。其主要的图元:点、线、多边形的构造,是构建复杂模型的基础。 点(Point) 浮点值表示的点称为顶点(Vertex)。所有顶点在OpenGL内部计算时都作为三维点处理,二维点默认z值为0。所有顶点坐标用齐次坐标(x, y, z, w) 表示,如果w不为0.0,这些顶点即为三维空间点(x/w, y/w, z/w)。编程者可以自己指定w值,一般w缺省为1.0。 线(Line
3、) 在OpenGL中,线代表线段(Line Segment),不是数学意义上的那种沿轴两个方向无限延伸的线。这里的线由一系列顶点顺次连结而成,有闭合和不闭合两种。 多边形(Polygon) OpenGL中定义的多边形是由一系列线段依次连结而成的封闭区域。这些线段不能交叉,区域内不能有空洞,多边形必须是凸多边形,否则不能被OpenGL函数接受。合法和非法多边形图示。 构造几何图元 在实际应用中,通常用一组相关的顶点序列以一定的方式组织起来定义某个几何图元,而不采用单独定义多个顶点来构造几何图元。 所有几何物体最终都由有一定顺序的顶点集来描述。 在第一课代码的基础上,只需用下面的代码覆盖原来的Dr
4、awGLScene()就可以了。 int DrawGLScene(GLvoid) /此过程包括所有绘制代码 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /清除屏幕及深度缓存glLoadIdentity(); 当调用glLoadIdentity()后,实际上将当前点移到了屏幕中心,X坐标轴从左至右,Y轴从下至上,Z轴从里至外。OpenGL屏幕中心是X和Y轴上的0.0f点。中心左面的坐标值是负值,右面是正值。移向屏幕顶端是正值,移向屏幕底端是负值。移入屏幕深处是负值,移出屏幕则是正值。 glTranslatef(-1.5f,0.0f,-6
5、.0f); /左移1.5单位,并移入屏幕6.0 glTranslatef(x, y, z)沿着 X, Y 和 Z 轴移动。沿X轴左移1.5个单位,Y轴不动(0.0f),最后移入屏幕6.0f个单位。注意glTranslatef(x, y, z)移动时,并不是相对屏幕中心移动,而是相对当前屏幕位置 现在已经移到了屏幕的左半部分,并且将视图推入屏幕背后足够距离以便可以看见全部场景。 glBegin(GL_TRIANGLES); /绘制三角形 glVertex3f( 0.0f, 1.0f, 0.0f); /上顶点 glVertex3f(-1.0f,-1.0f, 0.0f); /左下顶点 glVerte
6、x3f( 1.0f,-1.0f, 0.0f); /右下顶点 glEnd(); /三角形绘制结束 函数glVertex234sifdv(TYPE coords)可以用二维、三维或齐次坐标定义顶点。 举例如下:glVertex2s(2,3); /空间顶点(2, 3, 0) /双精度浮点数定义 glVertex3d(0.0,1.0,3.1414926535); glVertex4f(2.4,1.0,-2.2,2.0); /齐次坐标定义GLfloat pp3=5.0,2.0,10.2;glVertex3fv(pp); /指针(或数组)定义 在OpenGL中,所有被定义的顶点必须放在glBegain()
7、和glEnd()两个函数之间才能正确表达一个几何图元或物体,否则,glVertex*()不完成任何操作。 glBegin(GL_TRIANGLES)开始绘制三角形,glEnd() 告诉OpenGL三角形已经创建好了。 通常需要画3个顶点,可使用GL_TRIANGLES。如果要画四个顶点,使用GL_QUADS。如果想要画更多的顶点时,可以使用GL_POLYGON。 本节实例只画一个三角形。如果要画第二个三角形的话,可再加三行代码(3点)。所有六点代码都应包含在glBegin(GL_TRIANGLES)和glEnd()间 glBegin(GL_TRIANGLES) 和 glEnd()间的点都是以三
8、点为一个集合,再不会有多余点出现,这同样适用于四边形。如要绘制四边形,须在第一个四点后再加上四点为一个集合的点组。另一方面,多边形可有任意个顶点,glBegin (GL_POLYGON)和 glEnd()之间不在乎 有多少行代码。 在glBegin()和glEnd()之间最重要的信息就是由函数glVertex*()定义的顶点,必要时也可为每个顶点指定颜色、法向、纹理坐标或其他,即调用相关的函数,如下图。 glBegin后设置顶点,glVertex参数是X、Y、Z坐标。点顺序是上、左下和右下顶点。glEnd()告诉OpenGL没其他点了。这将显示一个填充的三角形 glTranslatef(3.0
9、f,0.0f,0.0f); /右移3单位 屏幕左半部分画完三角形后,移到右半部分画正方形,再次使用glTranslate。右移X坐标值为正值。因前面左移了1.5个单位,先向右移回屏幕中心(1.5个单位),再右移1.5个单位。总共右移3.0个单位 glBegin(GL_QUADS);/绘制正方形 glVertex3f(-1.0f, 1.0f, 0.0f); /左上 glVertex3f( 1.0f, 1.0f, 0.0f); /右上 glVertex3f( 1.0f,-1.0f, 0.0f); /右下 glVertex3f(-1.0f,-1.0f, 0.0f); /左下 glEnd(); /正方
10、形绘制结束 return TRUE; /继续运行 最后换掉窗口模式下的标题内容。 if (keysVK_F1) /F1键按下了么? keysVK_F1=FALSE; /若是,使对应的Key数组中的值为 FALSE KillGLWindow(); /销毁当前的窗口 fullscreen=!fullscreen; /切换全屏/窗口模式 /重建OpenGL窗口(修改) if (!CreateGLWindow(“绘制基本图元”, 640,480,16,fullscreen) return 0;/若窗口未能创建程序退出 视点变换视点变换 模型变换模型变换 投影变换投影变换 视口变换视口变换三维空间到二维
11、平面将相机置于三角架将相机置于三角架上,让它对准三维上,让它对准三维景物景物视点变换视点变换-Viewing Transformation将三维物体放在适将三维物体放在适当位置当位置模型变换模型变换-Modeling Transformation选择相机镜头并调选择相机镜头并调焦,使三维物体投焦,使三维物体投影在二维胶片上影在二维胶片上投影变换投影变换-Projection Transformation决定二维像片的大小决定二维像片的大小视口变换视口变换-Viewport Transformation 视点变换确定了场景中物体的视点位置和方向,即在视点变换确定了场景中物体的视点位置和方向,即在
12、场景中放置一架场景中放置一架照相机照相机,让相机对准要拍摄的物体。,让相机对准要拍摄的物体。 相机(即视点)默认相机(即视点)默认在坐标系的原点在坐标系的原点(相机初始方向(相机初始方向都指向都指向Z负轴),它同物体模型的缺省位置一致。负轴),它同物体模型的缺省位置一致。 如果不进行视点变换,相机和物体是重叠在一起的。如果不进行视点变换,相机和物体是重叠在一起的。 在用相机拍摄物体时,可以保持物体的位置不动,而在用相机拍摄物体时,可以保持物体的位置不动,而将相机移离物体,这就相当于将相机移离物体,这就相当于视点变换视点变换;另外,也可;另外,也可以保持相机的固定位置,将物体移离相机,这就相当以
13、保持相机的固定位置,将物体移离相机,这就相当于于模型转换模型转换。 在在OpenGL中,以逆时针旋转物体就相当于以顺时针中,以逆时针旋转物体就相当于以顺时针旋转相机。因此,必须把视点转换和模型转换结合在旋转相机。因此,必须把视点转换和模型转换结合在一起考虑,对这两种转换单独进行考虑毫无意义。一起考虑,对这两种转换单独进行考虑毫无意义。 void gluLookAt(GLdouble eyex,GLdouble eyey,GLdouble eyez, GLdouble centerx, GLdouble centery, GLdouble centerz, GLdouble upx,GLdoub
14、le upy,GLdouble upz); eyex,eyey,eyez定义了视点的位置;定义了视点的位置;centerx、centery和和centerz变变量指定了参考点的位置,该点通常为相机所瞄准的场景中心轴量指定了参考点的位置,该点通常为相机所瞄准的场景中心轴线上的点;线上的点;upx、upy、upz变量指定了向上向量的方向。变量指定了向上向量的方向。 模型平移 glTranslatefd(TYPE x,TYPE y,TYPE z); 该函数用指定的该函数用指定的x,y,z值沿着值沿着x轴、轴、y轴、轴、z轴平移物体轴平移物体 模型旋转 glRotatefd(TYPE angle,TY
15、PE x,TYPE,y,TYPE z); 该函数中第一个变量该函数中第一个变量angle制定模型旋转的角度,单制定模型旋转的角度,单位为度,后三个变量表示以原点(位为度,后三个变量表示以原点(0,0,0)到点)到点(x,y,z)的连线为轴线逆时针旋转物体。的连线为轴线逆时针旋转物体。 模型变换是在世界坐标系模型变换是在世界坐标系中进行的。缺省时,物体模中进行的。缺省时,物体模型的中心定位在坐标系的中心处。型的中心定位在坐标系的中心处。平移、旋转、放缩平移、旋转、放缩 模型缩放 glScalefd(TYPE x,TYPE y,TYPE z); 该函数可以对物体沿着该函数可以对物体沿着x,y,z轴
16、分别进行放大缩小。轴分别进行放大缩小。缺省时都为缺省时都为1.0,即物体没变化。,即物体没变化。 投影变换定义一个视景体,使得视景体外多余的部分投影变换定义一个视景体,使得视景体外多余的部分裁剪掉,最终进入图像的只是视景体内的有关部分。裁剪掉,最终进入图像的只是视景体内的有关部分。 投影包括透视投影投影包括透视投影(Perspective Projection)和正视和正视投影投影(Orthographic Projection)两种。两种。 设置投影矩阵往往在设置投影矩阵往往在OpenGL绘图和模型视图变换之绘图和模型视图变换之前。一般情况下,前。一般情况下,调用:调用: glMatrixM
17、ode(GL_PROJECTION); 将当前矩阵设置为投影矩阵。将当前矩阵设置为投影矩阵。再调用:再调用: glOrtho 或或 gluPerspective 来创建平行或透视投影。来创建平行或透视投影。 创建完后,创建完后,再调用:再调用: glMatrixMode(GL_MODELVIEW); 将当前变换矩阵设置为模型视图变换矩阵将当前变换矩阵设置为模型视图变换矩阵 透视投影(透视投影(Perspective Projection) 透视投影符合人们心理习惯,即离视点近的物体大,透视投影符合人们心理习惯,即离视点近的物体大,离视点远的物体小。通常用于动画、视觉仿真等。离视点远的物体小。通
18、常用于动画、视觉仿真等。 void glFrustum(GLdouble left,GLdouble Right,GLdouble bottom,GLdouble top,GLdouble near,GLdouble far); void gluPerspective(GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar); 正射投影(正射投影(Orthographic Projection) 正射投影的特点是无论物体距离相机多远,投影后正射投影的特点是无论物体距离相机多远,投影后的物体大小尺寸不变。通常用在建筑蓝图绘制和计
19、算的物体大小尺寸不变。通常用在建筑蓝图绘制和计算机辅助设计等方面,要求投影后的物体尺寸及相互间机辅助设计等方面,要求投影后的物体尺寸及相互间的角度不变,以便施工或制造时物体比例大小正确。的角度不变,以便施工或制造时物体比例大小正确。 void glOrtho(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top, GLdouble near,GLdouble far) 视口变换就是将视景体内投影的物体显示在二维的视视口变换就是将视景体内投影的物体显示在二维的视口平面上。口平面上。 运用相机模拟方式,很容易理解视口变换就是类似于运用相
20、机模拟方式,很容易理解视口变换就是类似于照片的放大与缩小照片的放大与缩小。 在计算机图形学中,它的定义是将经过几何变换、投在计算机图形学中,它的定义是将经过几何变换、投影变换和裁剪变换后的物体显示于屏幕窗口内指定的影变换和裁剪变换后的物体显示于屏幕窗口内指定的区域内,这个区域通常为矩形,称为视口。区域内,这个区域通常为矩形,称为视口。 glViewport(GLint x,GLint y,GLsizei width, GLsizei height); 函数定义一个视口。函数参数函数定义一个视口。函数参数(x, y)是视口在屏幕窗口坐标是视口在屏幕窗口坐标系中的左下角点坐标,参数系中的左下角点坐
21、标,参数width和和height分别是视口的宽分别是视口的宽度和高度。缺省时,参数值度和高度。缺省时,参数值 (0, 0, winWidth, winHeight)即即指屏幕窗口实际尺寸大小。指屏幕窗口实际尺寸大小。 OpenGL中的各种转换是通过矩阵运算实现的,当中的各种转换是通过矩阵运算实现的,当发出一个转换命令时,该命令会生成一个发出一个转换命令时,该命令会生成一个4X4阶的阶的转换矩阵(转换矩阵(OpenGL中的物体坐标一律采用齐次坐中的物体坐标一律采用齐次坐标,即标,即(x, y, z, w),所有变换矩阵都采用,所有变换矩阵都采用4X4矩阵)。矩阵)。 当前矩阵与转换矩阵相乘当前
22、矩阵与转换矩阵相乘,生成新的当前矩阵。,生成新的当前矩阵。 例如,对于顶点坐标例如,对于顶点坐标v ,转换命令通常在顶点坐标,转换命令通常在顶点坐标命令前,若当前矩阵为命令前,若当前矩阵为C,转换命令构成的矩阵为,转换命令构成的矩阵为M,则发出转换命令后,生成新的当前矩阵为,则发出转换命令后,生成新的当前矩阵为CM,这个矩阵再乘以顶点坐标这个矩阵再乘以顶点坐标v,从而构成新的顶点坐,从而构成新的顶点坐标标CMv。程序中绘制顶点前的最后一个变换命令最。程序中绘制顶点前的最后一个变换命令最先作用于顶点之上。先作用于顶点之上。 三个基本三个基本OpenGL矩阵操作函数矩阵操作函数 1)void gl
23、LoadMatrixfd(const TYPE *m) 设置当前矩阵中的元素值。函数参数设置当前矩阵中的元素值。函数参数*m是一个指是一个指向向16个元素个元素(m0, m1, ., m15)的指针,这的指针,这16个元素个元素就是当前矩阵就是当前矩阵M中的元素,其排列方式如下:中的元素,其排列方式如下:M =| m0 m4 m8 m12| | m1 m5 m9 m13| | m2 m6 m10 m14| | m3 m7 m11 m15| 2) void glMultMatrixfd(const TYPE *m)用当前矩阵去乘用当前矩阵去乘*m所指定的矩阵,将结果存放于所指定的矩阵,将结果存放
24、于*m中。当前矩阵可以是用中。当前矩阵可以是用glLoadMatrix() 指定的指定的矩阵,也可以是其它矩阵变换函数的综合结果。矩阵,也可以是其它矩阵变换函数的综合结果。 当几何变换时,调用当几何变换时,调用OpenGL的三个变换函数的三个变换函数glTranslate*()、glRotate*()和和glScale*(),实质上,实质上相当于产生了一个近似的平移、旋转和比例矩阵,相当于产生了一个近似的平移、旋转和比例矩阵,然后调用然后调用glMultMatrix()与当前矩阵相乘。与当前矩阵相乘。 void glLoadIdentity(); 载入单位矩阵载入单位矩阵 glMatrixMo
25、de(GL_MODELVIEW); glLoadIdentity(); glMultMatrixf(M); /glScale*(); glMultMatrixf(N); /glRotate*() glMultMatrixf(L); /glTranslate*(); glBegin(GL_POINTS); glVertex3f(V); glEnd(); 按照上面的语句,经过变换的顶点是:按照上面的语句,经过变换的顶点是:MNLV, 始终是右乘。始终是右乘。 变换是叠加在上次变换的基础上的变换是叠加在上次变换的基础上的 。也就。也就是说,是说,变换的效果会累积变换的效果会累积。每次调用变换。每次调
26、用变换函数时,会生成一个新的函数来乘以当前函数时,会生成一个新的函数来乘以当前的模型视图矩阵,随后,新的矩阵将成为的模型视图矩阵,随后,新的矩阵将成为当前的模型变换矩阵,在下次执行变换时,当前的模型变换矩阵,在下次执行变换时,会被新的矩阵相乘,因此作用效果将不断会被新的矩阵相乘,因此作用效果将不断累积。累积。 glClearColor(0,0,0,0); /设置背景颜色为黑色设置背景颜色为黑色 /指定指定OpenGL在此区域内绘图。在此区域内绘图。 glViewPort(100,100,ClientWidth,ClientHeight); /设置视图投影变换矩阵设置视图投影变换矩阵 glMat
27、rixMode(GL_PROJECTION); glLoadIdentity( ); /加载单位矩阵。加载单位矩阵。 /创建平行投影。创建平行投影。 glOrtho(0,ClientWidth,ClientHeight,0,1,-1); /将矩阵变换对象切换为模型视图变换。将矩阵变换对象切换为模型视图变换。 glMatrixMode(GL_MODELVIEW); 例如:例如:在(在(0,10,0)上绘制一个球体,在()上绘制一个球体,在(10,0,0)上)上绘制另一个绘制另一个 ,如图,如图1: glTranslatef(0,10,0); /沿沿Y轴向上平移轴向上平移10个单位个单位DrawS
28、phere(5); /画第一个球体画第一个球体glTranslatef(10,0,0); /沿沿X轴向右平移轴向右平移10个单位个单位DrawSphere(5); /画第二个球体画第二个球体 则应如何编写正确的代码?则应如何编写正确的代码?图图1图图2 矩阵操作矩阵操作- -矩阵堆栈矩阵堆栈 void glPushMatrix(void);void glPopMatrix(void); 第一个函数表示将所有矩阵依次压入堆栈中;第一个函数表示将所有矩阵依次压入堆栈中; 第二个函数表示弹出堆栈顶部的矩阵。第二个函数表示弹出堆栈顶部的矩阵。 正确的代码正确的代码 glMatrixMode(GL_MO
29、DELVIEW);glTranslatef(0,10,0); /沿沿Y轴向上平移轴向上平移10个单位个单位 DrawSphere(5); /画第一个球体画第一个球体glLoadIdentity( ); /加载单位矩阵加载单位矩阵glTranslatef(10,0,0); /沿沿X轴向右平移轴向右平移10个单位个单位 /画第二个球体画第二个球体 DrawSphere(5); 在(在(0,10,0)绘制一个球体,在()绘制一个球体,在(10,0,0)绘制另一个)绘制另一个 也可以把当前矩阵压入堆栈中,然后执行一些变换,也可以把当前矩阵压入堆栈中,然后执行一些变换,再弹出刚才压入的矩阵,从而把当前矩
30、阵恢复到上再弹出刚才压入的矩阵,从而把当前矩阵恢复到上次变换之前的状态。次变换之前的状态。 glMatrixMode(GL_MODELVIEW); glPushMatrix( ); /推入矩阵堆栈推入矩阵堆栈/沿沿Y轴向上平移轴向上平移10个单位个单位glTranslatef(0,10,0);DrawSphere(5); /画第一个球体画第一个球体 /恢复到上次保存时的状态恢复到上次保存时的状态 glPopMatrix( );/沿沿X轴向右平移轴向右平移10个单位个单位glTranslatef(10,0,0); DrawSphere(5); /画第二个球体画第二个球体颜色模式颜色模式如何使用颜
31、色如何使用颜色理解两种着色模式理解两种着色模式 OpenGL颜色模式一共有两个:RGB(RGBA)模式和颜色表模式。 在RGB模式下,所有的颜色定义全用R、G、B三个值来表示,有时也加上Alpha值(与透明度有关),即RGBA模式。 在颜色表模式下,每一个象素的颜色是用颜色表中的某个颜色索引值表示,而这个索引值指向了相应的R、G、B值。这样的一个表成为颜色映射(Color Map)。 在RGBA模式下,可以用glColor*()来定义当前颜色。其函数形式为: void glColor3b s i f d ub us ui(TYPE r,TYPE g,TYPE b); void glColor4
32、b s i f d ub us ui(TYPE r,TYPE g,TYPE b,TYPE a); void glColor3b s i f d ub us uiv(TYPE *v); void glColor4b s i f d ub us uiv(TYPE *v); 颜色表模式(Color_Index Mode) 可以调用glIndex*()函数从颜色表中选取当前颜色。其函数形式为: void glIndexsifd(TYPE c); void glIndexsifdv(TYPE *c); 设置当前颜色索引值,即调色板号。若值大于颜色位面数时则取模。 三角形和四边形添加2种不同类型的着色方法
33、。使用Flat coloring(单调着色)给四边形涂上固定的一种颜色。使用Smooth coloring(平滑着色)将三角形的三个顶点的不同颜色混合在一起,创建漂亮的色彩混合。 int DrawGLScene(GLvoid) /此过程包括所有绘制代码 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /清除屏幕及深度缓存glLoadIdentity( ); glTranslatef(-1.5f,0.0f,-6.0f); glBegin(GL_TRIANGLES); /绘制三角形 使用命令glColor3f(r,g,b)。括号中的三个参数依
34、次是红、绿、蓝三色分量。取值范围可以从0,0f到1.0f。类似于以前所讲的清除屏幕背景命令。 glColor3f(1.0f,0.0f,0.0f); /设当前色为红色 glVertex3f( 0.0f, 1.0f, 0.0f); /上顶点 将颜色设为红色(纯红色,无绿色,无蓝色)。接下来设置三角形的第一个顶点(上顶点),并使用当前色(红色)绘制。从现在开始所有的绘制的对象的颜色都是红色,直到将红色改成别的颜色。 glColor3f(0.0f,1.0f,0.0f); /设当前色为绿色 glVertex3f(-1.0f,-1.0f, 0.0f); /左下顶点 第一个红色顶点已经设置完毕。接下来设置第
35、二个绿色顶点。三角形的左下顶点被设为绿色。 glColor3f(0.0f,0.0f,1.0f); /设当前色为蓝色 glVertex3f( 1.0f,-1.0f, 0.0f); /右下顶点 glEnd(); /三角形绘制结束 设置三角形的右下顶点,即第三个顶点。开始绘制之前将颜色设为蓝色。glEnd()出现后,三角形将被填充。但是因为每个顶点有不同的颜色,因此看起来颜色从每个角喷出,刚好在三角形的中心汇合,三种颜色相互混合。这就是平滑着色。 现在绘制一个单调着色蓝色的正方形。注意设置当前色之后绘制的所有物体都是当前色的。以后创建的每个工程都使用颜色,即便在完全采用纹理贴图的时候,glColor
36、3f仍可调节纹理色调。 glTranslatef(3.0f,0.0f,0.0f); /右移3单位 glColor3f(0.5f,0.5f,1.0f); /一次性将当前色设置为浅蓝色 glBegin(GL_QUADS); /绘制正方形 glVertex3f(-1.0f, 1.0f, 0.0f); /左上顶点 glVertex3f( 1.0f, 1.0f, 0.0f); /右上顶点 glVertex3f( 1.0f,-1.0f, 0.0f); /右下顶点 glVertex3f(-1.0f,-1.0f, 0.0f); /左下顶点 glEnd(); /正方形绘制结束 return TRUE; /继续运
37、行 将颜色一次性的设为浅蓝色,然后绘制场景。每个顶点都是蓝色的,因为没有告诉OpenGL要改变顶点颜色。最后结果是浅蓝色的正方形。顺时针绘制的正方形意味着看见的是四边形的背面。 如果顶点的排列顺序是逆时针的,则该多边形是前面的;如果顶点的排列顺序是顺时针的,则该多边形是后面的。 glFrontFace()可以改变前后面。它有一个参数,只能是GL_CW或GL_CCW,前者表示按顺时前者表示按顺时针顺序定义的多边形是前面的,后者表示按针顺序定义的多边形是前面的,后者表示按逆时针定义的是前面,默认为后者逆时针定义的是前面,默认为后者。 多边形可以填充,也可以不填充。可以用glPolygonMode(
38、)对绘制模式进行说明,它有两个参数,第一个可以取GL_FRONT、GL_BACK或GL_FRONT_AND_BACK,第二个参数指定绘制模式,可以是GL_POINT、GL_LINE或GL_FILL。如何旋转三角形和四边形如何旋转三角形和四边形三角形沿三角形沿Y Y轴旋转轴旋转四边形沿着四边形沿着X X轴旋转轴旋转 增加两个全局变量来控制这两个对象的旋转。 GLfloatrtri; /用于三角形的角度 GLfloatrquad; /用于四边形的角度 int DrawGLScene(GLvoid) /所有绘制代码 /清除屏幕及深度缓存 glClear(GL_COLOR_BUFFER_BIT | G
39、L_DEPTH_BUFFER_BIT); glLoadIdentity(); /重置模型观察矩阵 glTranslatef(-1.5f,0.0f,-6.0f); /左移1.5单位,并移入屏幕 6.0 glRotatef(rtri,0.0f,1.0f,0.0f); /绕Y轴旋转 glRotatef(Angle,Xvector,Yvector,Zvector) 让对象绕某个轴旋转; Angle 是旋转角度; Xvector 、Yvector 和 Zvector 三个参数共同决定旋转轴方向 glBegin(GL_TRIANGLES); /绘制三角形 glColor3f(1.0f,0.0f,0.0f)
40、; /设当前色为红色 glVertex3f(0.0f, 1.0f, 0.0f); /上顶点 glColor3f(0.0f,1.0f,0.0f); /设当前色为绿色 glVertex3f(-1.0f,-1.0f, 0.0f); /左下顶点 glColor3f(0.0f,0.0f,1.0f); /设当前色为蓝色 glVertex3f( 1.0f,-1.0f, 0.0f); /右下顶点 glEnd(); /三角形绘制结束 在屏幕的左面画了一个彩色渐变三角形,并绕着Y轴从左向右旋转。 glLoadIdentity(); /重置模型观察矩阵 如果没有重置,直接调用glTranslate,会出现意料之外的
41、结果,因为坐标轴已经旋转了。 glTranslatef(1.5f,0.0f,-6.0f); /右移1.5单位,并移入屏幕 6.0 glRotatef(rquad,1.0f,0.0f,0.0f); /绕X轴旋转 重置模型观察矩阵,X、Y、Z轴复位,glTranslate只向右移1.5而不是3.0单位。因为重置场景时,焦点又回到了场景的中心(0.0处)。当移到新位置后,绕X轴旋转四边形。正方形将上下转动。 glColor3f(0.0f,0.0f,1.0f); glBegin(GL_QUADS); /绘制正方形 glVertex3f(-1.0f, 1.0f, 0.0f); /左上顶点 glVerte
42、x3f( 1.0f, 1.0f, 0.0f); /右上顶点 glVertex3f( 1.0f,-1.0f, 0.0f); /右下顶点 glVertex3f(-1.0f,-1.0f, 0.0f); /左下顶点 glEnd(); /正方形绘制结束 rtri+=0.2f; /增加三角形的旋转变量 rquad-=0.15f; /减少四边形的旋转变量 return TRUE; /继续运行 倘若把变量 rtri 和rquad 想象为容器,当容器创建之后,里面是空的。第一行代码是向容器中添加0.2。因此每次运行完前面的代码,都会使 rtri 容器中的值增长0.2。同样每次会使 rquad 容器中的值下跌0.
43、15。下跌最终会导致对象旋转的方向和增长的方向相反。 尝试改变下面代码中的+和-,来体会对象旋转的方向是如何改变的。并试着将0.2改成1.0。这个数字越大,物体就转的越快,这个数字越小,物体转的就越慢。使用三角形和四边形创建使用三角形和四边形创建3D3D物体物体把三角形变为立体金字塔把三角形变为立体金字塔把四边形变为立方体把四边形变为立方体 给三角形增加一个左侧面,一个右侧面,一个后侧面来生成一个金字塔(四棱锥)。给正方形增加左、右、上、下及背面生成一个立方体。 混合金字塔上的颜色,创建一个平滑着色的对象。给立方体的每一面则来个不同的颜色。 int DrawGLScene(GLvoid) /所
44、有绘制代码 /清除屏幕及深度缓存 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); /重置模型观察矩阵 glTranslatef(-1.5f,0.0f,-6.0f); /左移1.5 单位,并移入屏幕 6.0 glRotatef(rtri,0.0f,1.0f,0.0f); /绕Y轴旋转 glBegin(GL_TRIANGLES); /绘制金字塔各个面 创建一个绕者其中心轴旋转的金字塔,让对象的中心坐标总是(0.0f,0,0f,0,0f)。金字塔的上顶点高出原点一个单位,底面中心低于原点一个单位。上顶点在底面
45、的投影位于底面的中心。 注意所有的面三角形都是逆时针次序绘制的。 /金字塔的前侧面 glColor3f(1.0f,0.0f,0.0f); /红色 glVertex3f( 0.0f, 1.0f, 0.0f); /上顶点 glColor3f(0.0f,1.0f,0.0f); /绿色 glVertex3f(-1.0f,-1.0f, 1.0f); /左下顶点 glColor3f(0.0f,0.0f,1.0f); /蓝色 glVertex3f( 1.0f,-1.0f, 1.0f); /右下顶点 画金字塔的前侧面。所有面都共享的上顶点设为红色;前侧面的左下顶点绿色,右下顶点蓝色。 /金字塔的右侧面 glC
46、olor3f(1.0f,0.0f,0.0f); /红色 glVertex3f( 0.0f, 1.0f, 0.0f); /上顶点 glColor3f(0.0f,0.0f,1.0f); /蓝色 glVertex3f(1.0f,-1.0f, 1.0f); /左下顶点 glColor3f(0.0f,1.0f,0.0f); /绿色 glVertex3f(1.0f,-1.0f, -1.0f); /右下顶点 现在绘制右侧面,其底边上两顶点的X坐标位于中心右侧一个单位处,Y坐标位于Y轴上侧一个单位处,且Z坐标正好处于底边的两顶点的Z坐标中心。右侧面从上顶点开始向外侧倾斜至底边上。 右侧面的左下顶点蓝色,右下顶
47、点绿色。 三个侧面处于同一个glBegin(GL_TRIANGLES) 和 glEnd()语句中间,每三个点构成一个三角形。 /金字塔的后侧面 glColor3f(1.0f,0.0f,0.0f); /红色 glVertex3f( 0.0f, 1.0f, 0.0f); /上顶点 glColor3f(0.0f,1.0f,0.0f); /绿色 glVertex3f(1.0f,-1.0f, -1.0f); /左下顶点 glColor3f(0.0f,0.0f,1.0f); /蓝色 glVertex3f(-1.0f,-1.0f, -1.0f); /右下顶点 现在是后侧面。再次切换颜色。左下顶点又回到绿色,
48、因为后侧面与右侧面共享这个角。 /金字塔的左侧面 glColor3f(1.0f,0.0f,0.0f); /红色 glVertex3f( 0.0f, 1.0f, 0.0f); /上顶点 glColor3f(0.0f,0.0f,1.0f); /蓝色 glVertex3f(-1.0f,-1.0f, -1.0f); /左下顶点 glColor3f(0.0f,1.0f,0.0f); /绿色 glVertex3f(-1.0f,-1.0f, 1.0f); /右下顶点 glEnd(); /金字塔绘制结束 最后画左侧面。又要切换颜色。左下顶点是蓝色,与后侧面的右下顶点相同。右下顶点是蓝色,与前侧面的左下顶点相同
49、。 金字塔画完了。因为金字塔只绕着Y轴旋转,永远都看不见底面,因而没有必要添加底面。 尝试增加底面(正方形),并将金字塔绕X轴旋转来看看是否作对了。确保底面四个顶点的颜色与侧面的颜色相匹配。 接下来开始画立方体。它由六个四边形组成。所有的四边形都以逆时针次序绘制。就是说先画右上角,然后左上角、左下角、最后右下角。 画立方体背面时次序好像是顺时针,但从立方体的背后看背面的时候,与现在所想的正好相反。 glLoadIdentity(); glTranslatef(1.5f,0.0f,-7.0f); /右移并移入屏幕 glRotatef(rquad,1.0f,1.0f,1.0f); /旋转立方体 glBegin(GL_QUADS); /开始绘制立方体 这次将立方体移地更远离屏幕了。因为立方体的大小要比金字塔大,同样移入6个单位时,立方体看起来要大的多。这是透视的缘故,越远的对象看起来越小 。 glColor3f(0.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 拼图效果课件教学课件
- 精细化管理企业培训
- 课件画房间教学课件
- 腹部瘢痕手术中的皮肤切口设计
- 爱情的课件教学课件
- 新上岗职工院感培训课件
- 认知障碍的评估与治疗
- 深度学习及自动驾驶应用 课件 第8、9章 基于Transformer的自动驾驶目标检测理论与实践、生成对抗网络及自动驾驶应用
- 手机行业企业发展规划
- 初中素质训练教案
- 中国历史朝代歌(课堂PPT)
- 现代大学英语精读 lessonProfessions for Women
- FPD基础知识简述剖析
- 意大利的风格与设计ppt课件
- 人教版初中数学课标版九年级上册第二十二章复习与二次函数有关的数形结合专题教案
- 《口语交际:意见不同怎么办》教学设计(部编版小学六年级语文上册第六单元)
- 袋式除尘器安装技术要求与验收规范
- 幕墙拆除施工方案
- 银行装修工程质量评估报告
- 2022年夜间取药程序
- 人音版三年级下册教材解读
评论
0/150
提交评论