版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第9
章三维空间中的分形9.1OpenGL简介
9.2三维空间中的Sierpinski地毯
9.3Sierpinski金字塔
9.4三维空间中Sierpinski海绵
1参考书:《分形算法与程序设计》OpenGL简介9.1OpenGL,即开放性图形库(OpenGraphicsLibrary),是一个三维的计算机图形和模型库。OpenGL包含120个图形函数,在微机环境下共有5种函数,即基本(或核心)函数、实用函数、辅助函数、Windows专用函数和Win32API函数。
2参考书:《分形算法与程序设计》OpenGL的基本功能1.绘制物体
OpenGL提供了丰富的基本图元绘制命令,从而可以方便地绘制物体,包括规则的和不规则的。3参考书:《分形算法与程序设计》OpenGL的基本功能2.
变换
OpenGL提供了一系列基本的变换,如取景变换、模型变换、投影变换及视口变换。4参考书:《分形算法与程序设计》OpenGL的基本功能3.
光照处理包括发射光、环境光、散射光和镜面反射光。5参考书:《分形算法与程序设计》OpenGL的基本功能4.
着色
OpenGL提供了两种物体着色模式,一种是RGBA颜色模式,另一种是颜色索引(ColorIndex)模式。
6参考书:《分形算法与程序设计》OpenGL的基本功能5.
反走样在OpenGL绘制图形过程中,由于使用的是位图,所以绘制出的图像的边缘会出现锯齿形状,称为走样。为了消除这种缺陷,OpenGL提供了点、线、多边形的反走样技术。
7参考书:《分形算法与程序设计》OpenGL的基本功能6.
融合为了使三维图形更加具有真实感,经常需要处理半透明或透明的物体图像,这就需要用到融合技术。
8参考书:《分形算法与程序设计》OpenGL的基本功能7.
雾化正如自然界中存在烟雾一样,OpenGL提供了“fog”的基本操作来达到对场景进行雾化的效果。
9参考书:《分形算法与程序设计》OpenGL的基本功能8.
位图和图像在图形绘制过程中,位图和图像是非常重要的一个方面。OpenGL提供了系列函数来实现位图和图像的操作。
10参考书:《分形算法与程序设计》OpenGL的基本功能9.
纹理映射在计算机图形学中,把包含颜色、alpha值、亮度等数据的矩形数组称为纹理。而纹理映射可以理解为将纹理粘贴在所绘制的三维模型表面,以使三维图形显得更生动。
11参考书:《分形算法与程序设计》OpenGL的运行环境10.动画出色的动画效果是OpenGL的一大特色,OpenGL提供了双缓存区技术来实现动画绘制。
12参考书:《分形算法与程序设计》OpenGL的基本函数1.顶点坐标
OpenGL采用有序排列的顶点集合来构造几何图元,而不是将线段、多边形组合起来构造几何图元。如:
glVertex2s(2,5);//整数定义的二维坐标
glVertex3f(2,5,7);
//浮点定义的三维坐标
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的基本函数3.显示列表
OpenGL显示列表(DispplayList)是由一组预先存储起来的留待以后调用的OpenGL函数语句组成的,当调用这张显示列表时就一次执行表中所列出的函数语句。
创建显示列表
OpenGL用下面的函数组创建显示列表:
voidglNewList(GLuint
list,GLenummode);……voidglEndList(void);
执行显示列表
显示列表的执行函数形式如下:
voidglCallList(GLuintlist);
参数list指定被执行的显示列表。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的基本函数5.光照设置
⑴创建光源(LightSource)
光源有许多特性,如颜色、位置、方向等。可以使用下面的函数定义光源:
voidglLight{if}[v](GLenumlight,GLenum
pname,TYPEparam)⑵启动光照在OpenGL中,必须明确指出光照是否有效或无效。如果光照无效,则只是简单地将当前颜色映射到当前顶点上去,不进行法向、光源、材质等复杂计算,那么显示的图形就没有真实感。启动和取消光源的函数如下:
glEnable(GL_LIGHTING);//启动光照
gDisable(GL_LIGHTING);//取消光照17参考书:《分形算法与程序设计》OpenGL的基本函数6.明暗处理
在OpenGL中,用单一颜色处理的称为平面明暗处理(FlatShading),用许多不同颜色处理的称为光滑明暗处理(SmoothShading)。设置明暗处理模式的函数为:
voidglShadeModel(GLenummode);18参考书:《分形算法与程序设计》OpenGL的基本函数7.材质设置
⑴材质定义材质的定义与光源的定义类似。其函数为:voidglMaterial{if}[v](GLenum
face,GLenum
pname,TYPE
param);⑵
改变材质在OpenGL中提供了两种方式来改变场景中的材质。第一种方法是利用函数glMaterial*()来改变材质,但是调用函数glMaterial*()需要同时保存当前矩阵,也就是调用函数glPushMatrix()和glPopMatrix()。第二种方法是使用函数glColorMaterial(),其形式为:voidglColorMaterial(GLenum
face,GLenummode);
19参考书:《分形算法与程序设计》OpenGL的基本函数8.纹理映射
⑴纹理定义在程序中可以用以下函数定义二维纹理映射:voidglTexImage2D(GLenumtarget,GLint
level,GLintcomponents,GLsizei
width,Glsizei
height,GLint
border,GLenum
format,GLenumtype,constGLvoid*pixels);⑵纹理控制OpenGL中控制纹理的函数是:voidglTexParameter{if}[v](GLenum
target,GLenum
pname,TYPE
param);⑶
定义纹理坐标OpenGL坐标定义的函数是:voidgltexCoord{1234}{sifd}[v](TYPEcoords);20参考书:《分形算法与程序设计》OpenGL的基本函数9.选择与反馈
在OpenGL中,提供了选择和反馈两种方式,以实现对屏幕上的某个物体的信息提供,达到交互的目的。
进行模式选择的函数原型如下:
LintglRenderMode(GLenumMode);在进入选择模式之前,必须调用函数glSelectBuffer()来制定选择数组。在进入反馈模式之前,必须调用函数glFeedbackBuffer()来制定反馈数组。21参考书:《分形算法与程序设计》OpenGL的基本函数10.帧缓存与动画
⑴帧缓存的组成
OpenGL帧缓存由以下四种缓存组成:颜色缓存(ColorBuffer)、深度缓存(DepthBuffer)、模板缓存(StencilBuffer)、累积缓存(AccumulationBuffer)。⑵缓存清除
OpenGL清除缓存操作过程是:先给出要写入每个缓存的清除值,然后用单个函数命令执行操作,传入所有要清除的缓存表。
⑶
动画
OpenGL提供了双缓存,可以用来制作动画。也就是说,在显示前台缓存内容中的一帧画面时,后台缓存正在绘制下一帧画面,当绘制完毕,则后台缓存内容便在屏幕上显示出来,而前台正好相反,又在绘制下一帧画面内容。这样循环反复,屏幕上显示的总是已经画好的图形,于是看起来所有的画面都是连续的。
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地毯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地毯//递归绘制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.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金字塔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金字塔
//递归绘制四个锥体
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.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海绵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海绵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海绵
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海绵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海绵
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海绵
else//递归调用画下一级Sierpinski海绵
glClear(GL_COLOR_BUFFER_BITor
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 新技术与护理实践融合
- 网络创业副业项目筛选六步法从海量项目中找到最匹配你自己的领域不走冤枉路
- 继续性护理服务与护理法律法规
- 春季高考护理政策解读
- 气管吸痰的呼吸机相关性肺炎预防
- 泌尿外科常见疾病护理
- 2026 塑型进阶小笼包课件
- 精准护理:一例危重患者成功救治
- 提升生活品质的脊椎护理方案
- 护理三查与患者安全
- 武威市2026事业单位联考-综合应用能力A类综合管理模拟卷(含答案)
- 2026重庆市纪委监委驻重庆银行纪检监察组遴选3人备考题库【巩固】附答案详解
- 钢筋混凝土管管道吊装方案
- 旅馆业管理人员责任制度
- 内控6大业务制度
- 2026校招:湖北农业发展集团笔试题及答案
- 八大浪费的课件
- 【答案】《劳动教育理论》(河南理工大学)章节期末慕课答案
- 【《宁德市某7万吨日处理量的生活污水处理厂工艺设计(工艺说明书+工艺计算书)》21000字(论文)】
- 2026年妇联权益维护类面试题型及答案
- 重庆水务环境控股集团管网有限公司招聘笔试题库2026
评论
0/150
提交评论