1、参考书:分形算法与程序设计1参考书:分形算法与程序设计2OpenGL,即开放性图形库(,即开放性图形库(Open Graphics Library),),是一个三维的计算机图形和模型库。是一个三维的计算机图形和模型库。OpenGL包含包含120个图个图形函数,在微机环境下共有形函数,在微机环境下共有5种函数,即基本(或核心)种函数,即基本(或核心)函数、实用函数、辅助函数、函数、实用函数、辅助函数、Windows专用函数和专用函数和Win32 API函数。函数。参考书:分形算法与程序设计31 绘制物体绘制物体 OpenGL提供了丰富的基本图元绘制命令,从而可以方便地绘制物提供了丰富的基本图元绘
2、制命令,从而可以方便地绘制物体,包括规则的和不规则的体,包括规则的和不规则的。参考书:分形算法与程序设计42 变换变换 OpenGL提供了一系列提供了一系列基本的变换,如取景变换、基本的变换,如取景变换、模型变换、投影变换及视模型变换、投影变换及视口变换。口变换。参考书:分形算法与程序设计53 光照处理光照处理 包括发射光、环境光、散射光和镜面反射光。包括发射光、环境光、散射光和镜面反射光。参考书:分形算法与程序设计64 着色着色 OpenGL提供了两种物体着色模式,一种是提供了两种物体着色模式,一种是RGBA颜色模颜色模式,另一种是颜色索引(式,另一种是颜色索引(Color IndexCol
3、or Index)模式。)模式。参考书:分形算法与程序设计75 反走样反走样 在在OpenGL绘制图形过程中,由于使用的是位图,所以绘绘制图形过程中,由于使用的是位图,所以绘制出的图像的边缘会出现锯齿形状,称为走样。为了消除这制出的图像的边缘会出现锯齿形状,称为走样。为了消除这种缺陷,种缺陷,OpenGL提供了点、线、多边形的反走样技术。提供了点、线、多边形的反走样技术。参考书:分形算法与程序设计86 融合融合 为了使三维图形更加具有真实感,经常需要处理半透明或为了使三维图形更加具有真实感,经常需要处理半透明或透明的物体图像,这就需要用到融合技术。透明的物体图像,这就需要用到融合技术。参考书:
4、分形算法与程序设计97 雾化雾化 正如自然界中存在烟雾一样,正如自然界中存在烟雾一样,OpenGL提供了提供了“fog”的基的基本操作来达到对场景进行雾化的效果。本操作来达到对场景进行雾化的效果。参考书:分形算法与程序设计108 位图和图像位图和图像 在图形绘制过程中,位图和图像是非常重要的一个方面。在图形绘制过程中,位图和图像是非常重要的一个方面。OpenGL提供了系列函数来实现位图和图像的操作。提供了系列函数来实现位图和图像的操作。参考书:分形算法与程序设计119 纹理映射纹理映射 在计算机图形学中,把包含颜色、在计算机图形学中,把包含颜色、alpha值、亮度等数据的矩形数组值、亮度等数据
5、的矩形数组称为纹理。而纹理映射可以理解为将纹理粘贴在所绘制的三维模型表面,称为纹理。而纹理映射可以理解为将纹理粘贴在所绘制的三维模型表面,以使三维图形显得更生动。以使三维图形显得更生动。参考书:分形算法与程序设计1210动画动画 出色的动画效果是出色的动画效果是OpenGL的一大特色,的一大特色,OpenGL提供了提供了双缓存区技术来实现动画绘制。双缓存区技术来实现动画绘制。参考书:分形算法与程序设计131顶点坐标顶点坐标 OpenGLOpenGL采用有序排列的顶点集合来构造几何图元,而不是采用有序排列的顶点集合来构造几何图元,而不是将线段、多边形组合起来构造几何图元。将线段、多边形组合起来构
6、造几何图元。如:如:glVertex2s(2,5);glVertex2s(2,5);/整数定义的二维坐标 glVertex3f(2,5,7);glVertex3f(2,5,7);/浮点定义的三维坐标 参考书:分形算法与程序设计142顶点关系顶点关系 在在OpenGLOpenGL中,同一个几何图元的所有被定义的顶点一起放中,同一个几何图元的所有被定义的顶点一起放在在glBegin()和和glEnd()函数之间,同时定义这些顶点之函数之间,同时定义这些顶点之间的关系。如:间的关系。如:glBegin(GL_POLYGON);glVertex2s(0,0);glVertex2s(0,11);glVe
7、rtex2s(11,14);glVertex2s(14,7);glVertex2s(7,0);glEnd();参考书:分形算法与程序设计153显示列表显示列表 OpenGLOpenGL显示列表(显示列表(DispplayDispplay List List)是由一组预先存储起)是由一组预先存储起来的留待以后调用的来的留待以后调用的OpenGLOpenGL函数语句组成的,当调用这张显函数语句组成的,当调用这张显示列表时就一次执行表中所列出的函数语句。示列表时就一次执行表中所列出的函数语句。创建显示列表创建显示列表 OpenGLOpenGL用下面的函数组创建显示列表:用下面的函数组创建显示列表:v
8、oid glNewList(GLuint list,GLenum mode);void glEndList(void);执行显示列表执行显示列表 显示列表的执行函数形式如下:显示列表的执行函数形式如下:void glCallList(GLuint list);参数参数list指定被执行的显示列表。指定被执行的显示列表。参考书:分形算法与程序设计164颜色设置颜色设置 RGBA RGBA模式下的颜色定义模式下的颜色定义在在RGBARGBA模式下,利用模式下,利用glColorglColor*命令来定义当前颜色。命令来定义当前颜色。glColorglColor*命令命令有如下几种形式:有如下几种形
9、式:void glColor3b s i f d ub us ui(TYPE r,TYPE g,TYPE b);void glColor4b 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);在在颜色索引模式下颜色索引模式下的颜色定义的颜色定义 通过调用函数通过调用函数glIndexglIndex*()()从颜色索引表中选取当前颜色。从颜色索引表中选取当前颜色。void glIndex(s
10、f d i)(c:TYPE);void glIndex(s f d i)v(c:PTYPE);参考书:分形算法与程序设计175光照设置光照设置 创建光源创建光源(Light Source)(Light Source)光源有许多特性,如颜色、位置、方向等。可以使用下面的函数定光源有许多特性,如颜色、位置、方向等。可以使用下面的函数定义光源:义光源:void glLightifv(GLenum light,GLenum pname,TYPE void glLightifv(GLenum light,GLenum pname,TYPE paramparam)启动光照启动光照 在在OpenGLOpen
11、GL中,必须明确指出光照是否有效或无效。如果光照无效,则中,必须明确指出光照是否有效或无效。如果光照无效,则只是简单地将当前颜色映射到当前顶点上去,不进行法向、光源、材质只是简单地将当前颜色映射到当前顶点上去,不进行法向、光源、材质等复杂计算,那么显示的图形就没有真实感。启动和取消光源的函数如等复杂计算,那么显示的图形就没有真实感。启动和取消光源的函数如下下:glEnable(GL_LIGHTING);/启动光照启动光照 gDisable(GL_LIGHTING);/取消光照取消光照参考书:分形算法与程序设计186明暗处理明暗处理 在在OpenGL中,用单一颜色处理的称为平面明暗处理中,用单一
12、颜色处理的称为平面明暗处理(Flat Shading),用许多不同颜色处理的称为光滑明暗处理,用许多不同颜色处理的称为光滑明暗处理(Smooth Shading)。设置明暗处理模式的函数为:设置明暗处理模式的函数为:void glShadeModel(GLenum mode);参考书:分形算法与程序设计197材质设置材质设置 材质定义材质定义材质的定义与光源的定义类似。其函数为:材质的定义与光源的定义类似。其函数为:void glMaterialifv(GLenum face,GLenum pname,TYPE param);改变材质改变材质在在OpenGL中提供了两种方式来改变场景中的材质。
13、中提供了两种方式来改变场景中的材质。第一种方法是利用函数第一种方法是利用函数glMaterial*()来改变材质,但是调用函来改变材质,但是调用函数数glMaterial*()需要同时保存当前矩阵,也就是调用函数需要同时保存当前矩阵,也就是调用函数glPushMatrix()和和glPopMatrix()。第二种方法是使用函数第二种方法是使用函数glColorMaterial(),其形式为:,其形式为:void glColorMaterial(GLenum face,GLenum mode);参考书:分形算法与程序设计208纹理映射纹理映射 纹理定义纹理定义在程序中可以用以下函数定义二维纹理映
14、射:在程序中可以用以下函数定义二维纹理映射:void glTexImage2D(GLenum target,GLint level,GLint components,GLsizei width,Glsizei height,GLint border,GLenum format,GLenum type,const GLvoid*pixels);纹理控制纹理控制OpenGL中控制纹理的函数是:中控制纹理的函数是:void glTexParameterifv(GLenum target,GLenum pname,TYPE param);定义纹理坐标定义纹理坐标OpenGL坐标定义的函数是:坐标定义的
15、函数是:void gltexCoord1 2 3 4s i f dv(TYPE coords);参考书:分形算法与程序设计219选择与反馈选择与反馈 在在OpenGL中,提供了选择和反馈两种方式,以实现对屏中,提供了选择和反馈两种方式,以实现对屏幕上的某个物体的信息提供,达到交互的目的。幕上的某个物体的信息提供,达到交互的目的。进行模式选择的函数原型如下:进行模式选择的函数原型如下:Lint glRenderMode(GLenum Mode);在进入选择模式之前,必须调用函数在进入选择模式之前,必须调用函数glSelectBuffer()来制定来制定选择数组。选择数组。在进入反馈模式之前,必须
16、调用函数在进入反馈模式之前,必须调用函数glFeedbackBuffer()来来制定反馈数组。制定反馈数组。参考书:分形算法与程序设计2210帧缓存与动画帧缓存与动画 帧缓存的组成帧缓存的组成 OpenGL帧缓存由以下四种缓存组成:帧缓存由以下四种缓存组成:颜色缓存(颜色缓存(Color Buffer)、深度缓存深度缓存(Depth Buffer)、模板缓存模板缓存(Stencil Buffer)、累积缓存累积缓存(Accumulation Buffer)。缓存清除缓存清除 OpenGL清除缓存操作过程是:先给出要写入每个缓存的清除值,清除缓存操作过程是:先给出要写入每个缓存的清除值,然后用单
17、个函数命令执行操作,传入所有要清除的缓存表。然后用单个函数命令执行操作,传入所有要清除的缓存表。动画动画 OpenGL提供了双缓存,可以用来制作动画。也就是说,在显示提供了双缓存,可以用来制作动画。也就是说,在显示前台缓存内容中的一帧画面时,后台缓存正在绘制下一帧画面,前台缓存内容中的一帧画面时,后台缓存正在绘制下一帧画面,当绘制完毕,则后台缓存内容便在屏幕上显示出来,而前台正好当绘制完毕,则后台缓存内容便在屏幕上显示出来,而前台正好相反,又在绘制下一帧画面内容。这样循环反复,屏幕上显示的相反,又在绘制下一帧画面内容。这样循环反复,屏幕上显示的总是已经画好的图形,于是看起来所有的画面都是连续的
18、。总是已经画好的图形,于是看起来所有的画面都是连续的。参考书:分形算法与程序设计23算法:算法:3D_Sierpinski标题:标题:三维空间中的三维空间中的Sierpinski地毯地毯变量:端点坐标变量:端点坐标 a(x1,y1,z1),b(x2,y2,z2)c(x3,y3,z3),d(x4,y4,z4)a1(),a2(),b1(),b2()c1(),c2(),d1(),d2()a_(),b_()c_(),d_()函数:函数:glVertex2s(x,y)(顶点坐标函数)glVertex2s(x,y,z)(顶点坐标函数)参考书:分形算法与程序设计24point3d one_third(poi
19、nt3d&p2)return point3d(p2.x-x)/3+x,(p2.y-y)/3+y,(p2.z-z)/3+z);/算出所有点的坐标 point3d a1=a.one_third(b),a2=b.one_third(a);point3d b1=b.one_third(c),b2=c.one_third(b);point3d c1=c.one_third(d),c2=d.one_third(c);point3d d1=d.one_third(a),d2=a.one_third(d);Point3d _a=a1.one_third(c2),_b=a2.one_third(c1);poin
20、t3d _c=b2.one_third(d1),_d=d1.one_third(b2);参考书:分形算法与程序设计25/递归绘制8个小块 Menger(a,a1,_a,d2);Menger(a1,a2,_b,_a);Menger(a2,b,b1,_b);Menger(_b,b1,b2,_c);Menger(_c,b2,c,c1);Menger(_d,_c,c1,c2);Menger(d1,_d,c2,d);Menger(d2,_a,_d,d1);参考书:分形算法与程序设计26算法:算法:Sierpinski_pyramid标题:标题:Sierpinski金字塔金字塔 变量:端点坐标变量:端点坐
21、标 a(x1,y1,z1),b(x2,y2,z2)c(x3,y3,z3),d(x4,y4,z4)函数:函数:glVertex2s(x,y)(顶点坐标函数)glVertex2s(x,y,z)(顶点坐标函数)参考书:分形算法与程序设计27point3d middle(point3d&p2)return point3d(x+p2.x)/2,(y+p2.y)/2,(z+p2.z)/2);glBegin(GL_TRIANGLES);glVertex3f(a.x,a.y,a.z);glVertex3f(b.x,b.y,b.z);glVertex3f(c.x,c.y,c.z);glVertex3f(d.x,
22、d.y,d.z);glVertex3f(a.x,a.y,a.z);glVertex3f(b.x,b.y,b.z);glVertex3f(d.x,d.y,d.z);glVertex3f(b.x,b.y,b.z);glVertex3f(c.x,c.y,c.z);glEnd();参考书:分形算法与程序设计28/递归绘制四个锥体 seripinski(a.middle(b),b,b.middle(c),b.middle(d);seripinski(a,a.middle(b),a.middle(c),a.middle(d);seripinski(a.middle(c),b.middle(c),c,c.m
23、iddle(d);seripinski(a.middle(d),b.middle(d),c.middle(d),d);参考书:分形算法与程序设计29算法:算法:Sierpinski_sponge标题:标题:Sierpinski海绵海绵变量:端点坐标变量:端点坐标 x1,y1,z1,x2,y2,z2,x3,y3,z3,x4,y4,z4,x5,y5,z5,x6,y6,z6,x7,y7,z7,x8,y8,z8;函数:函数:glVertex2s(x,y)(顶点坐标函数)glVertex2s(x,y,z)(顶点坐标函数)参考书:分形算法与程序设计30void CRenderDlg:lft(double
24、x,double y,double z,double l)double x1,y1,z1,x2,y2,z2,x3,y3,z3,x4,y4,z4,x5,y5,z5,x6,y6,z6,x7,y7,z7,x8,y8,z8;x1=x-l/2;y1=y-l/2;z1=z-l/2;参考书:分形算法与程序设计31 x2=x+l/2;y2=y-l/2;z2=z-l/2;x3=x-l/2;y3=y-l/2;z3=z+l/2;x4=x+l/2;y4=y-l/2;z4=z+l/2;x5=x-l/2;y5=y+l/2;z5=z+l/2;参考书:分形算法与程序设计32 x6=x+l/2;y6=y+l/2;z6=z+l/
25、2;x7=x-l/2;y7=y+l/2;z7=z-l/2;x8=x+l/2;y8=y+l/2;z8=z-l/2;参考书:分形算法与程序设计33void CRenderDlg:Drawscene(double x,double y,double z,double l,double n)if(n 1)/画一级Sierpinski海绵 l:=l/3;lft(x-l,y+l,z-l,l);/后左上 lft(x,y+l,z-l,l);/后中上 lft(x+l,y+l,z-l,l);/后右上 lft(x-l,y,z-l,l);/后左中 lft(x+l,y,z-l,l);/后右中 lft(x-l,y-l,z
26、-l,l);/后左下 lft(x,y-l,z-l,l);/后中下 lft(x+l,y-l,z-l,l);/后右下 参考书:分形算法与程序设计34 lft(x-l,y+l,z,l);/中左上 lft(x+l,y+l,z,l);/中右上 lft(x-l,y-l,z,l);/中左下 lft(x+l,y-l,z,l);/中右下 lft(x-l,y+l,z+l,l);/前左上 lft(x,y+l,z+l,l);/前中上 lft(x+l,y+l,z+l,l);/前右上 lft(x-l,y,z+l,l);/前左中 lft(x+l,y,z+l,l);/前右中 lft(x-l,y-l,z+l,l);/前左下 l
27、ft(x,y-l,z+l,l);/前中下 lft(x+l,y-l,z+l,l);/前右下参考书:分形算法与程序设计35 else /递归调用画下一级Sierpinski海绵 glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);l:=l/3;Drawscene(x-l,y+l,z-l,l,n-1);/后左上 Drawscene(x,y+l,z-l,l,n-1);/后中上 Drawscene(x+l,y+l,z-l,l,n-1);/后右上 Drawscene(x-l,y,z-l,l,n-1);/后左中 Drawscene(x+l,y,z-l,l,
28、n-1);/后右中 Drawscene(x-l,y-l,z-l,l,n-1);/后左下 Drawscene(x,y-l,z-l,l,n-1);/后中下 Drawscene(x+l,y-l,z-l,l,n-1);/后右下参考书:分形算法与程序设计36 Drawscene(x-l,y+l,z,l,n-1);/中左上 Drawscene(x+l,y+l,z,l,n-1);/中右上 Drawscene(x-l,y-l,z,l,n-1);/中左下 Drawscene(x+l,y-l,z,l,n-1);/中右下 Drawscene(x-l,y+l,z+l,l,n-1);/前左上 Drawscene(x,y+l,z+l,l,n-1);/前中上 Drawscene(x+l,y+l,z+l,l,n-1);/前右上 Drawscene(x-l,y,z+l,l,n-1);/前左中 Drawscene(x+l,y,z+l,l,n-1);/前右中 Drawscene(x-l,y-l,z+l,l,n-1);/前左下 Drawscene(x,y-l,z+l,l,n-1);/前中下 Drawscene(x+l,y-l,z+l,l,n-1);/前右下