三维空间中的分形课件_第1页
三维空间中的分形课件_第2页
三维空间中的分形课件_第3页
三维空间中的分形课件_第4页
三维空间中的分形课件_第5页
已阅读5页,还剩67页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第9章三维空间中的分形9.1OpenGL简介

9.2三维空间中的Sierpinski地毯

9.3Sierpinski金字塔

9.4三维空间中Sierpinski海绵

1参考书:《分形算法与程序设计》第9章三维空间中的分形9.1OpenGL简介9.OpenGL简介9.1OpenGL,即开放性图形库(OpenGraphicsLibrary),是一个三维的计算机图形和模型库。OpenGL包含120个图形函数,在微机环境下共有5种函数,即基本(或核心)函数、实用函数、辅助函数、Windows专用函数和Win32API函数。

2参考书:《分形算法与程序设计》OpenGL简介9.1OpenGL,即开放性图形库(OpenOpenGL的基本功能1.绘制物体

OpenGL提供了丰富的基本图元绘制命令,从而可以方便地绘制物体,包括规则的和不规则的。3参考书:《分形算法与程序设计》OpenGL的基本功能1.绘制物体3参考书:《分形算法与程OpenGL的基本功能2.

变换OpenGL提供了一系列基本的变换,如取景变换、模型变换、投影变换及视口变换。4参考书:《分形算法与程序设计》OpenGL的基本功能2.变换4参考书:《分形算法与程序设OpenGL的基本功能3.

光照处理包括发射光、环境光、散射光和镜面反射光。5参考书:《分形算法与程序设计》OpenGL的基本功能3.光照处理5参考书:《分形算法与程OpenGL的基本功能4.

着色OpenGL提供了两种物体着色模式,一种是RGBA颜色模式,另一种是颜色索引(ColorIndex)模式。

6参考书:《分形算法与程序设计》OpenGL的基本功能4.着色6参考书:《分形算法与程序设OpenGL的基本功能5.

反走样在OpenGL绘制图形过程中,由于使用的是位图,所以绘制出的图像的边缘会出现锯齿形状,称为走样。为了消除这种缺陷,OpenGL提供了点、线、多边形的反走样技术。

7参考书:《分形算法与程序设计》OpenGL的基本功能5.反走样7参考书:《分形算法与程序OpenGL的基本功能6.

融合为了使三维图形更加具有真实感,经常需要处理半透明或透明的物体图像,这就需要用到融合技术。

8参考书:《分形算法与程序设计》OpenGL的基本功能6.融合8参考书:《分形算法与程序设OpenGL的基本功能7.

雾化正如自然界中存在烟雾一样,OpenGL提供了“fog”的基本操作来达到对场景进行雾化的效果。

9参考书:《分形算法与程序设计》OpenGL的基本功能7.雾化9参考书:《分形算法与程序设OpenGL的基本功能8.

位图和图像在图形绘制过程中,位图和图像是非常重要的一个方面。OpenGL提供了系列函数来实现位图和图像的操作。

10参考书:《分形算法与程序设计》OpenGL的基本功能8.位图和图像10参考书:《分形算法OpenGL的基本功能9.

纹理映射在计算机图形学中,把包含颜色、alpha值、亮度等数据的矩形数组称为纹理。而纹理映射可以理解为将纹理粘贴在所绘制的三维模型表面,以使三维图形显得更生动。

11参考书:《分形算法与程序设计》OpenGL的基本功能9.纹理映射11参考书:《分形算法与OpenGL的运行环境10.动画出色的动画效果是OpenGL的一大特色,OpenGL提供了双缓存区技术来实现动画绘制。

12参考书:《分形算法与程序设计》OpenGL的运行环境10.动画12参考书:《分形算法与程序OpenGL的基本函数1.顶点坐标

OpenGL采用有序排列的顶点集合来构造几何图元,而不是将线段、多边形组合起来构造几何图元。如:glVertex2s(2,5);//整数定义的二维坐标

glVertex3f(2,5,7);

//浮点定义的三维坐标

13参考书:《分形算法与程序设计》OpenGL的基本函数1.顶点坐标13参考书:《分形算法与OpenGL的基本函数2.顶点关系

在OpenGL中,同一个几何图元的所有被定义的顶点一起放在glBegin()和glEnd()函数之间,同时定义这些顶点之间的关系。如:

glBegin(GL_POLYGON);glVertex2s(0,0);glVertex2s(0,11);glVertex2s(11,14);glVertex2s(14,7);glVertex2s(7,0);glEnd();

14参考书:《分形算法与程序设计》OpenGL的基本函数2.顶点关系14参考书:《分形算法与OpenGL的基本函数3.显示列表

OpenGL显示列表(DispplayList)是由一组预先存储起来的留待以后调用的OpenGL函数语句组成的,当调用这张显示列表时就一次执行表中所列出的函数语句。

创建显示列表OpenGL用下面的函数组创建显示列表:voidglNewList(GLuintlist,GLenummode);……voidglEndList(void);

执行显示列表

显示列表的执行函数形式如下:voidglCallList(GLuintlist);

参数list指定被执行的显示列表。15参考书:《分形算法与程序设计》OpenGL的基本函数3.显示列表15参考书:《分形算法与OpenGL的基本函数4.颜色设置

⑴RGBA模式下的颜色定义在RGBA模式下,利用glColor*命令来定义当前颜色。glColor*命令有如下几种形式:voidglColor3{bsifdubusui}(TYPEr,TYPEg,TYPEb);voidglColor4{bsifdubusui}(TYPEr,TYPEg,TYPEb,TYPEa);voidglColor3{bsifdubusui}v(TYPE*v);voidglColor4{bsifdubusui}v(TYPE*v);

⑵在颜色索引模式下的颜色定义

通过调用函数glIndex*()从颜色索引表中选取当前颜色。

voidglIndex(sfdi)(c:TYPE);voidglIndex(sfdi)v(c:PTYPE);

16参考书:《分形算法与程序设计》OpenGL的基本函数4.颜色设置16参考书:《分形算法与OpenGL的基本函数5.光照设置

⑴创建光源(LightSource)光源有许多特性,如颜色、位置、方向等。可以使用下面的函数定义光源:voidglLight{if}[v](GLenumlight,GLenumpname,TYPEparam)⑵启动光照在OpenGL中,必须明确指出光照是否有效或无效。如果光照无效,则只是简单地将当前颜色映射到当前顶点上去,不进行法向、光源、材质等复杂计算,那么显示的图形就没有真实感。启动和取消光源的函数如下:glEnable(GL_LIGHTING);//启动光照gDisable(GL_LIGHTING);//取消光照17参考书:《分形算法与程序设计》OpenGL的基本函数5.光照设置17参考书:《分形算法与OpenGL的基本函数6.明暗处理

在OpenGL中,用单一颜色处理的称为平面明暗处理(FlatShading),用许多不同颜色处理的称为光滑明暗处理(SmoothShading)。设置明暗处理模式的函数为:

voidglShadeModel(GLenummode);18参考书:《分形算法与程序设计》OpenGL的基本函数6.明暗处理18参考书:《分形算法与OpenGL的基本函数7.材质设置

⑴材质定义材质的定义与光源的定义类似。其函数为:voidglMaterial{if}[v](GLenumface,GLenumpname,TYPEparam);⑵改变材质在OpenGL中提供了两种方式来改变场景中的材质。第一种方法是利用函数glMaterial*()来改变材质,但是调用函数glMaterial*()需要同时保存当前矩阵,也就是调用函数glPushMatrix()和glPopMatrix()。第二种方法是使用函数glColorMaterial(),其形式为:voidglColorMaterial(GLenumface,GLenummode);

19参考书:《分形算法与程序设计》OpenGL的基本函数7.材质设置19参考书:《分形算法与OpenGL的基本函数8.纹理映射

⑴纹理定义在程序中可以用以下函数定义二维纹理映射:voidglTexImage2D(GLenumtarget,GLintlevel,GLintcomponents,GLsizeiwidth,Glsizeiheight,GLintborder,GLenumformat,GLenumtype,constGLvoid*pixels);⑵纹理控制OpenGL中控制纹理的函数是:voidglTexParameter{if}[v](GLenumtarget,GLenumpname,TYPEparam);⑶

定义纹理坐标OpenGL坐标定义的函数是:voidgltexCoord{1234}{sifd}[v](TYPEcoords);20参考书:《分形算法与程序设计》OpenGL的基本函数8.纹理映射20参考书:《分形算法与OpenGL的基本函数9.选择与反馈

在OpenGL中,提供了选择和反馈两种方式,以实现对屏幕上的某个物体的信息提供,达到交互的目的。

进行模式选择的函数原型如下:LintglRenderMode(GLenumMode);在进入选择模式之前,必须调用函数glSelectBuffer()来制定选择数组。在进入反馈模式之前,必须调用函数glFeedbackBuffer()来制定反馈数组。21参考书:《分形算法与程序设计》OpenGL的基本函数9.选择与反馈21参考书:《分形算法OpenGL的基本函数10.帧缓存与动画

⑴帧缓存的组成OpenGL帧缓存由以下四种缓存组成:颜色缓存(ColorBuffer)、深度缓存(DepthBuffer)、模板缓存(StencilBuffer)、累积缓存(AccumulationBuffer)。⑵缓存清除OpenGL清除缓存操作过程是:先给出要写入每个缓存的清除值,然后用单个函数命令执行操作,传入所有要清除的缓存表。⑶动画OpenGL提供了双缓存,可以用来制作动画。也就是说,在显示前台缓存内容中的一帧画面时,后台缓存正在绘制下一帧画面,当绘制完毕,则后台缓存内容便在屏幕上显示出来,而前台正好相反,又在绘制下一帧画面内容。这样循环反复,屏幕上显示的总是已经画好的图形,于是看起来所有的画面都是连续的。

22参考书:《分形算法与程序设计》OpenGL的基本函数10.帧缓存与动画22参考书:《分形9.2三维空间中的Sierpinski地毯算法: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)(顶点坐标函数)23参考书:《分形算法与程序设计》9.2三维空间中的Sierpinski地毯算法:3D_Si9.2三维空间中的Sierpinski地毯point3done_third(point3d&p2){returnpoint3d((p2.x-x)/3+x,(p2.y-y)/3+y,(p2.z-z)/3+z);}

//算出所有点的坐标

point3da1=a.one_third(b),a2=b.one_third(a);point3db1=b.one_third(c),b2=c.one_third(b);point3dc1=c.one_third(d),c2=d.one_third(c);point3dd1=d.one_third(a),d2=a.one_third(d);Point3d_a=a1.one_third(c2),_b=a2.one_third(c1);point3d_c=b2.one_third(d1),_d=d1.one_third(b2);24参考书:《分形算法与程序设计》9.2三维空间中的Sierpinski地毯point3d9.2三维空间中的Sierpinski地毯//递归绘制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);

25参考书:《分形算法与程序设计》9.2三维空间中的Sierpinski地毯25参考书:《分9.3Sierpinski金字塔算法:Sierpinski_pyramid标题:Sierpinski金字塔变量:端点坐标a(x1,y1,z1),b(x2,y2,z2)c(x3,y3,z3),d(x4,y4,z4)

函数:glVertex2s(x,y)(顶点坐标函数)

glVertex2s(x,y,z)(顶点坐标函数)26参考书:《分形算法与程序设计》9.3Sierpinski金字塔算法:Sierpinski9.3Sierpinski金字塔point3dmiddle(point3d&p2){returnpoint3d((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,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();27参考书:《分形算法与程序设计》9.3Sierpinski金字塔point3dmiddl9.3Sierpinski金字塔//递归绘制四个锥体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.middle(d));seripinski(a.middle(d),b.middle(d),c.middle(d),d);28参考书:《分形算法与程序设计》9.3Sierpinski金字塔28参考书:《分形算法与程9.4Sierpinski海绵算法: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)(顶点坐标函数)29参考书:《分形算法与程序设计》9.4Sierpinski海绵算法:Sierpinski_s9.4Sierpinski海绵voidCRenderDlg::lft(doublex,doubley,doublez,doublel){doublex1,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;

30参考书:《分形算法与程序设计》9.4Sierpinski海绵voidCRenderDlg9.4Sierpinski海绵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;31参考书:《分形算法与程序设计》9.4Sierpinski海绵31参考书:《分形算法与程序设9.4Sierpinski海绵

x6=x+l/2;y6=y+l/2;z6=z+l/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;32参考书:《分形算法与程序设计》9.4Sierpinski海绵

32参考书:《分形算法与程序9.4Sierpinski海绵voidCRenderDlg::Drawscene(doublex,doubley,doublez,doublel,doublen){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-l,l);//后左下lft(x,y-l,z-l,l);//后中下lft(x+l,y-l,z-l,l);//后右下

33参考书:《分形算法与程序设计》9.4Sierpinski海绵voidCRenderDlg9.4Sierpinski海绵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);//前左下lft(x,y-l,z+l,l);//前中下lft(x+l,y-l,z+l,l);//前右下34参考书:《分形算法与程序设计》9.4Sierpinski海绵lft(x-l,y+l9.4Sierpinski海绵else//递归调用画下一级Sierpinski海绵glClear(GL_COLOR_BUFFER_BITorGL_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,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);//后右下35参考书:《分形算法与程序设计》9.4Sierpinski海绵else35参考书:《分形9.4Sierpinski海绵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);//前右下}36参考书:《分形算法与程序设计》9.4Sierpinski海绵Drawscene(x第9章三维空间中的分形9.1OpenGL简介

9.2三维空间中的Sierpinski地毯

9.3Sierpinski金字塔

9.4三维空间中Sierpinski海绵

37参考书:《分形算法与程序设计》第9章三维空间中的分形9.1OpenGL简介9.OpenGL简介9.1OpenGL,即开放性图形库(OpenGraphicsLibrary),是一个三维的计算机图形和模型库。OpenGL包含120个图形函数,在微机环境下共有5种函数,即基本(或核心)函数、实用函数、辅助函数、Windows专用函数和Win32API函数。

38参考书:《分形算法与程序设计》OpenGL简介9.1OpenGL,即开放性图形库(OpenOpenGL的基本功能1.绘制物体

OpenGL提供了丰富的基本图元绘制命令,从而可以方便地绘制物体,包括规则的和不规则的。39参考书:《分形算法与程序设计》OpenGL的基本功能1.绘制物体3参考书:《分形算法与程OpenGL的基本功能2.

变换OpenGL提供了一系列基本的变换,如取景变换、模型变换、投影变换及视口变换。40参考书:《分形算法与程序设计》OpenGL的基本功能2.变换4参考书:《分形算法与程序设OpenGL的基本功能3.

光照处理包括发射光、环境光、散射光和镜面反射光。41参考书:《分形算法与程序设计》OpenGL的基本功能3.光照处理5参考书:《分形算法与程OpenGL的基本功能4.

着色OpenGL提供了两种物体着色模式,一种是RGBA颜色模式,另一种是颜色索引(ColorIndex)模式。

42参考书:《分形算法与程序设计》OpenGL的基本功能4.着色6参考书:《分形算法与程序设OpenGL的基本功能5.

反走样在OpenGL绘制图形过程中,由于使用的是位图,所以绘制出的图像的边缘会出现锯齿形状,称为走样。为了消除这种缺陷,OpenGL提供了点、线、多边形的反走样技术。

43参考书:《分形算法与程序设计》OpenGL的基本功能5.反走样7参考书:《分形算法与程序OpenGL的基本功能6.

融合为了使三维图形更加具有真实感,经常需要处理半透明或透明的物体图像,这就需要用到融合技术。

44参考书:《分形算法与程序设计》OpenGL的基本功能6.融合8参考书:《分形算法与程序设OpenGL的基本功能7.

雾化正如自然界中存在烟雾一样,OpenGL提供了“fog”的基本操作来达到对场景进行雾化的效果。

45参考书:《分形算法与程序设计》OpenGL的基本功能7.雾化9参考书:《分形算法与程序设OpenGL的基本功能8.

位图和图像在图形绘制过程中,位图和图像是非常重要的一个方面。OpenGL提供了系列函数来实现位图和图像的操作。

46参考书:《分形算法与程序设计》OpenGL的基本功能8.位图和图像10参考书:《分形算法OpenGL的基本功能9.

纹理映射在计算机图形学中,把包含颜色、alpha值、亮度等数据的矩形数组称为纹理。而纹理映射可以理解为将纹理粘贴在所绘制的三维模型表面,以使三维图形显得更生动。

47参考书:《分形算法与程序设计》OpenGL的基本功能9.纹理映射11参考书:《分形算法与OpenGL的运行环境10.动画出色的动画效果是OpenGL的一大特色,OpenGL提供了双缓存区技术来实现动画绘制。

48参考书:《分形算法与程序设计》OpenGL的运行环境10.动画12参考书:《分形算法与程序OpenGL的基本函数1.顶点坐标

OpenGL采用有序排列的顶点集合来构造几何图元,而不是将线段、多边形组合起来构造几何图元。如:glVertex2s(2,5);//整数定义的二维坐标

glVertex3f(2,5,7);

//浮点定义的三维坐标

49参考书:《分形算法与程序设计》OpenGL的基本函数1.顶点坐标13参考书:《分形算法与OpenGL的基本函数2.顶点关系

在OpenGL中,同一个几何图元的所有被定义的顶点一起放在glBegin()和glEnd()函数之间,同时定义这些顶点之间的关系。如:

glBegin(GL_POLYGON);glVertex2s(0,0);glVertex2s(0,11);glVertex2s(11,14);glVertex2s(14,7);glVertex2s(7,0);glEnd();

50参考书:《分形算法与程序设计》OpenGL的基本函数2.顶点关系14参考书:《分形算法与OpenGL的基本函数3.显示列表

OpenGL显示列表(DispplayList)是由一组预先存储起来的留待以后调用的OpenGL函数语句组成的,当调用这张显示列表时就一次执行表中所列出的函数语句。

创建显示列表OpenGL用下面的函数组创建显示列表:voidglNewList(GLuintlist,GLenummode);……voidglEndList(void);

执行显示列表

显示列表的执行函数形式如下:voidglCallList(GLuintlist);

参数list指定被执行的显示列表。51参考书:《分形算法与程序设计》OpenGL的基本函数3.显示列表15参考书:《分形算法与OpenGL的基本函数4.颜色设置

⑴RGBA模式下的颜色定义在RGBA模式下,利用glColor*命令来定义当前颜色。glColor*命令有如下几种形式:voidglColor3{bsifdubusui}(TYPEr,TYPEg,TYPEb);voidglColor4{bsifdubusui}(TYPEr,TYPEg,TYPEb,TYPEa);voidglColor3{bsifdubusui}v(TYPE*v);voidglColor4{bsifdubusui}v(TYPE*v);

⑵在颜色索引模式下的颜色定义

通过调用函数glIndex*()从颜色索引表中选取当前颜色。

voidglIndex(sfdi)(c:TYPE);voidglIndex(sfdi)v(c:PTYPE);

52参考书:《分形算法与程序设计》OpenGL的基本函数4.颜色设置16参考书:《分形算法与OpenGL的基本函数5.光照设置

⑴创建光源(LightSource)光源有许多特性,如颜色、位置、方向等。可以使用下面的函数定义光源:voidglLight{if}[v](GLenumlight,GLenumpname,TYPEparam)⑵启动光照在OpenGL中,必须明确指出光照是否有效或无效。如果光照无效,则只是简单地将当前颜色映射到当前顶点上去,不进行法向、光源、材质等复杂计算,那么显示的图形就没有真实感。启动和取消光源的函数如下:glEnable(GL_LIGHTING);//启动光照gDisable(GL_LIGHTING);//取消光照53参考书:《分形算法与程序设计》OpenGL的基本函数5.光照设置17参考书:《分形算法与OpenGL的基本函数6.明暗处理

在OpenGL中,用单一颜色处理的称为平面明暗处理(FlatShading),用许多不同颜色处理的称为光滑明暗处理(SmoothShading)。设置明暗处理模式的函数为:

voidglShadeModel(GLenummode);54参考书:《分形算法与程序设计》OpenGL的基本函数6.明暗处理18参考书:《分形算法与OpenGL的基本函数7.材质设置

⑴材质定义材质的定义与光源的定义类似。其函数为:voidglMaterial{if}[v](GLenumface,GLenumpname,TYPEparam);⑵改变材质在OpenGL中提供了两种方式来改变场景中的材质。第一种方法是利用函数glMaterial*()来改变材质,但是调用函数glMaterial*()需要同时保存当前矩阵,也就是调用函数glPushMatrix()和glPopMatrix()。第二种方法是使用函数glColorMaterial(),其形式为:voidglColorMaterial(GLenumface,GLenummode);

55参考书:《分形算法与程序设计》OpenGL的基本函数7.材质设置19参考书:《分形算法与OpenGL的基本函数8.纹理映射

⑴纹理定义在程序中可以用以下函数定义二维纹理映射:voidglTexImage2D(GLenumtarget,GLintlevel,GLintcomponents,GLsizeiwidth,Glsizeiheight,GLintborder,GLenumformat,GLenumtype,constGLvoid*pixels);⑵纹理控制OpenGL中控制纹理的函数是:voidglTexParameter{if}[v](GLenumtarget,GLenumpname,TYPEparam);⑶

定义纹理坐标OpenGL坐标定义的函数是:voidgltexCoord{1234}{sifd}[v](TYPEcoords);56参考书:《分形算法与程序设计》OpenGL的基本函数8.纹理映射20参考书:《分形算法与OpenGL的基本函数9.选择与反馈

在OpenGL中,提供了选择和反馈两种方式,以实现对屏幕上的某个物体的信息提供,达到交互的目的。

进行模式选择的函数原型如下:LintglRenderMode(GLenumMode);在进入选择模式之前,必须调用函数glSelectBuffer()来制定选择数组。在进入反馈模式之前,必须调用函数glFeedbackBuffer()来制定反馈数组。57参考书:《分形算法与程序设计》OpenGL的基本函数9.选择与反馈21参考书:《分形算法OpenGL的基本函数10.帧缓存与动画

⑴帧缓存的组成OpenGL帧缓存由以下四种缓存组成:颜色缓存(ColorBuffer)、深度缓存(DepthBuffer)、模板缓存(StencilBuffer)、累积缓存(AccumulationBuffer)。⑵缓存清除OpenGL清除缓存操作过程是:先给出要写入每个缓存的清除值,然后用单个函数命令执行操作,传入所有要清除的缓存表。⑶动画OpenGL提供了双缓存,可以用来制作动画。也就是说,在显示前台缓存内容中的一帧画面时,后台缓存正在绘制下一帧画面,当绘制完毕,则后台缓存内容便在屏幕上显示出来,而前台正好相反,又在绘制下一帧画面内容。这样循环反复,屏幕上显示的总是已经画好的图形,于是看起来所有的画面都是连续的。

58参考书:《分形算法与程序设计》OpenGL的基本函数10.帧缓存与动画22参考书:《分形9.2三维空间中的Sierpinski地毯算法: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)(顶点坐标函数)59参考书:《分形算法与程序设计》9.2三维空间中的Sierpinski地毯算法:3D_Si9.2三维空间中的Sierpinski地毯point3done_third(point3d&p2){returnpoint3d((p2.x-x)/3+x,(p2.y-y)/3+y,(p2.z-z)/3+z);}

//算出所有点的坐标

point3da1=a.one_third(b),a2=b.one_third(a);point3db1=b.one_third(c),b2=c.one_third(b);point3dc1=c.one_third(d),c2=d.one_third(c);point3dd1=d.one_third(a),d2=a.one_third(d);Point3d_a=a1.one_third(c2),_b=a2.one_third(c1);point3d_c=b2.one_third(d1),_d=d1.one_third(b2);60参考书:《分形算法与程序设计》9.2三维空间中的Sierpinski地毯point3d9.2三维空间中的Sierpinski地毯//递归绘制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);

61参考书:《分形算法与程序设计》9.2三维空间中的Sierpinski地毯25参考书:《分9.3Sierpinski金字塔算法:Sierpinski_pyramid标题:Sierpinski金字塔变量:端点坐标a(x1,y1,z1),b(x2,y2,z2)c(x3,y3,z3),d(x4,y4,z4)

函数:glVertex2s(x,y)(顶点坐标函数)

glVertex2s(x,y,z)(顶点坐标函数)62参考书:《分形算法与程序设计》9.3Sierpinski金字塔算法:Sierpinski9.3Sierpinski金字塔point3dmiddle(point3d&p2){returnpoint3d((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,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();63参考书:《分形算法与程序设计》9.3Sierpinski金字塔point3dmiddl9.3Sierpinski金字塔//递归绘制四个锥体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.middle(d));seripinski(a.middle(d),b.middle(d),c.middle(d),d);64参考书:《分形算法与程序设计》9.3Sierpinski金字塔28参考书:《分形算法与程9.4Sierpinski海绵算法: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)(顶点坐标函数)65参考书:《分形算法与程序设计》9.4Sierpinski海绵算法:Sierpinski_s9.4Sierpinski海绵voidCRenderDlg::lft(doublex,doubley,doublez,doublel){doublex1,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;

66参考书:《分形算法与程序设计》9.4Sierpinski海绵voidCRenderDlg9.4Sierpinski海绵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;67参考书:《分形算法与程序设计》9.4Sierpinski海绵31参考书:《分形算法与程序设9.4Sierpinski海绵

x6=x+l/2;y6=y+l/2;z6=z+l/2;

x7=x-l/2;y7=y+l/2;z7=z-l/2;

x8=x+l/2;y8=y+l/2;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论