计算机图形学大作业最终版

发布时间:2010-06-14 09:15:34   来源:文档文库   
字号:

关于计算机艺术的发展与应用的文献综述

梁文卓(08007236)

【摘要】:计算机艺术是两个学科的交融。计算机属于工科,属于自然科学。而艺术则是思想领域范畴的,两者交汇会衍生出新的学科。我随着科技的日益发展,计算机运算的速度和精度日益提高,随之而来的就是信息时代,而图形处理则作为信息时代的产物。本文从计算机艺术这个主题出发,以图形处理作为切入点,论述了艺术在计算机图形处理当中的应用。本文分两部分:第一部分为艺术的数位化现象的讨论;第二部分为计算机艺术在各个领域中的应用。

【关键字】 计算机艺术、 图形处理、 艺术的数位化现象

随着科技的进步,计算机走近了人们的日常生活。计算机图形处理则是其改善人们生活方式的其中一个体现。计算机通过数码相机或者扫描仪把图形读入,然后进行平面立体化或空间立体化的处理,在计算机显示器上建立了“虚拟空间”,表现了科学技术与思想情感的有机结合。然而,这些处理后的图形还不能称得上图形艺术,因为这些视觉图形虽然通过软件让人们产生共性和美感,但是却不具备艺术创作的本质内涵。只有将人们的思想与计算机技巧结合起来,这样的作品才称得上是一件计算机艺术品。

第一部分:艺术的数位化现象的讨论。

在计算机艺术的这个论题上,很多学者提出了很多思辨性的结论。

翟建勇教授从哲学的角度讨论了计算机图形的美学价值。他认为电子图像是设计的产物,表达了设计者的美学观,设计者在满足作品的用途的条件下,加入了个人的思想。计算机图形的“个人因素”是其美学价值重要的组成部分,一副图形的美丑都不是图形的美学价值重点,关键在于它是否正确表达作者想要表达的思想。

雍晴在她的学位论文中提出了对电脑动画创作现状的思考。她认为数码艺术中技术、艺术以及情感应该达到一种平衡的状态。她重新定义了数码艺术的含义。由于我国数码艺术的起步较晚,很多人对数码艺术的认识仅仅停留在计算机技术应用这样一个层面上。她认为数码艺术虽然依赖于技术,但技术无论多么重要,它都是手段而不是目的。依靠技术的手段,在数字媒体上把无形的人类情感用视听艺术的实在形式和艺术语言理性地表现出来,这才是数码艺术的真正追求。动画无论是电脑动画还是传统的动画其实与“剧情片”“纪录片”、“实验电影”等电影类别一样,是一种电影的“类型”(genre)。

动画艺术形式都具有:

机械的性质——制作系统和播放系统;

美术的性质——造型手段和审美符号;

聆听的性质——音乐、对白以及音响效果;

时间的性质——叙述时间分配与欣赏时间;

动作的性质——活动视点表现与活动形象表现等。

其作品形式应该是一种能准确表达内容的形式,即是一种具有特殊审美意义的叙事方式。近年来计算机动画一直不断在挑战传统美术或影像的表现手法。与传统动画相比,电脑动画的创作活动呈现出非物质性的特点(其形象的产生是荧幕显示的)即:是假定性的活动影像与声音系统构成的综合性视听艺术形式,并且必须通过机器播放才能够欣赏的艺术形式。这一特征使得动画视听元素中的各个要素都具有其他艺术门类所不具备的表现力,比如在运动、背景、灯光等的运用表现上都使得动画艺术的语言具有其它艺术不具备的特点。这一特点,使其大大摆脱了客观环境、客观条件对作品创作、生产的限制。这样不仅大大提高了动画制作效率、缩短了制作周期,降低了制作成本,还丰富了动画的表现形式、视觉效果,丰富了动画的艺术表现手段。然而电脑却不可能代替传统的动画制作工艺,传统动画也具有自身不可替代的优势,比如就其风格而言,往往比电脑动画更加多样,更能直接地表达创作者的个性、意图。

电脑动画应该是一门技术、艺术与情感高度融合的艺术形式。动画片作为艺术的一个载体同其它艺术形式一样担负着传达人类情感与思想的媒体作用。不仅如此,由于动画片自身所特有的表现方法,使得他的表现力往往会超越其它的艺术载体!表达情感是动画艺术的生命。用技术手段把人的情感方式、生活方式、人们的思想客观化、理性化、图象化,即用视听艺术的实在形式和语言理性的把无形的人类情感生动的表现出来,她认为这是我们创作作品的初衷和追求,也是难度所在。艺术需要情感的投入,这样才能准确把握艺术形象的特点、性情,只有先感动自己才能作出感动他人的艺术作品。

从以上的分析可以看出,各位学者认为计算机艺术包含两方面的元素:制作的技术元素和把工艺变成艺术的美学元素。艺术与技术的融合是当今科学高度发展的必然,正如法国作家福楼拜所说的 “越往前走,艺术越要科学化,同时科学也要艺术化,两者在基底分手,回头又在塔尖结合”。对计算机艺术的发展来讲尤其如此。计算机艺术作品的成功,不是在于技术的新颖和稀有,而是在于运用技术表现艺术原则的成熟度。技术的选择是由计算机的艺术特点决定的。我们承认和鼓励技术的创新,但作为创作者更应当把握好作品的美学元素。鼓励艺术的形式和手法多样,但不要忘了人文之美、人伦之美才是艺术的真正追求。

第二部分:计算机艺术在各个领域中的应用

下面将从计算机艺术图形的产生、三位造型系统和非真实感绘制技术三个方面分别论述计算机艺术在各个领域中的应用。

周志敏和汪国昭两位学者为了在同一种迭代下得到不同的计算机图形,给出了一种能够产生计算机对称图形的绘制标准,构造了效果良好的迭代函数。他们用相同的迭代函数,相同的参数生成了不同特色的图形,利用计盒维数讨论了图形的分形特征。他们通过新的绘制标准不仅可以产生经典的Julia集图案, 而且还可在实数域上设计出了精美的计算机艺术图形。

李传习和谭海洋两位学者通过以 MDT6.0 作为图形支撑系统开发桥梁三维造型系统的基本知识和技术 ,提出了公路桥梁三维造型的一些技术处理措施和方法 ,对桥梁 CAD的应用研究进行了一定的探索。与传统桥梁 CAD相比 ,桥梁三维造型直接从实体设计开始 ,运行速度快、储存量少、可视化程度高 ,为桥梁设计、评价和修改提供了形象化的视觉手段 ,桥梁实体设计完成后 ,即可根据桥梁实体自动生成各种视图和剖面、断面图。三维造型是基于特征的、参数化的 ,全参数化的造型系统可以自动记录设计的整个过程 ,特征的每一个属性可以被一个参数定义 ,参数可以随时修改。设计既可以桥梁标准图为基准进行 ,也可不受标准图或成规的限制而根据实际需要和设计者的意图直接进行 ,只需将工程师脑中的三维构思表达成计算机中的三维模型 ,就可以得到真实的三维实体。设计过程以实体为研究对象通过添加或切削等方法实现三维造型 ,与工程师的设计构思过程相吻合 ,这一方法对桥梁 CAD的研究具有一定的意义。

计算机艺术是一门科学与艺术相结合的新兴交叉学科,它向人类提供了一种全新的艺术创作手段,展示了全新的艺术思想和艺术作品。近年来,非真实感绘制技术(NonPhotorealistic RenderingNPR)成为了计算机艺术中最活跃的一个分支。非真实感绘制强调主观意识、情绪的传递以及画家在绘画过程中所对应的绘制方法,它通过其丰富的艺术表现能力,给人以美的享受。基于多分辨率技术绘制的系统和过程符合人类视觉和思维方式。用户可以根据分辨率的不同设置画笔的大小和形状等,精确的模拟线条的走向趋势、颜色明亮度等,从而模拟画家真实的绘画过程和效果。将多分辨率技术和一些经典的非真实感绘制方法结合起来,能提高原绘制算法的执行效果,提高交互算法的执行速度和会聚特性。

赵芳芳学者深入研究了非真实感绘制的基本方法:基于笔刷模型的NPR方法、基于流体模拟的NPR方法和基于纹理合成的NPR方法。其次,深入研究了多分辨率技术与小波变换、细分方法以及逆向细分方法之间的关系。在此基础上,提出了三种新颖的非真实感绘制方法:

l、提出了一种基于多分辨率和统计的油画模拟方法。利用高斯图像金字塔生成三幅分辨率不同的参考图像,按照由低到高的分辨率对输入的原始图像进行逐层绘制。每层绘制时,使用统计的方法设置笔刷的颜色,即统计每一区域内具有哪一种颜色的像素点数最多,以这种颜色来代替整个区域内像素的颜色。构造骨架列表,设置笔刷的各个属性,形成可以进行绘制的笔刷。实验结果表明该方法形成了丰富的笔画色彩,生成了更加柔和、细腻的油画效果。

2、提出了一种基于随机笔刷的油画模拟方法。考虑到画家作画时具有一定的随机性,为体现画家的这一作画过程,该方法在VC++环境下产生大量的随机数并结合输入的原始图像生成随机图像。随机选择一点作为画笔的起始点,运用像素8邻域的概念构造骨架点列表,设置几个不同的参数对原图像进行多层绘制。实现结果表明,该方法提高了执行速度,成功的模拟了画家作画过程中的随机现象。

3、提出了一种基于多分辨率和纹理合成的漫画模拟方法。该方法首先采集原图像中具有强烈漩涡感的线条,运用基于缝合线的多分辨拼接算法成比较真实的线条作为纹理参考图像。沿参考图像的梯度方向使用改进的随机笔刷对原图像进行绘制。通过多个不同参数的设置,得到了比较自然、比原图更有视觉影响力的漩涡感漫画效果。

参考文献:

【1】 Hertzmann APainterly rendering with curved brush strokes of multiple sizes[C]In Proceedings of SIGGRAPH 1998OrlandoFlorida1 998453460

【2】 Hertzmann APaint by relaxation[C]In Proceedings of the Computer Graphics Interna-tional 2001IEEE Computer Society,200 147-54

【3】 Michio ShiraishiYasushi YamaguchiAdaptive parameter control for image moment-based painterly rendering[C]Proceedings the 9th International Conference on Geometry and Graphics2000

【4】 艺术的数位化现象——对计算机艺术的探索 邓韶 株洲工学院学报;

【5】 试谈计算机图形的审美基础 翟建勇 广东农工商职业技术学院学报;

【6】 迭代产生的计算机艺术图形 周志敏 汪国昭 江南大学学报;

【7】 基于多分辨率技术的非真实感绘制方法研究 赵芳芳 山东师范大学 硕士学位论文;

【8】 桥梁三位造型系统的研究与开发 李传习,谭海洋 长沙交通学院院报

《计算机图形学》程序设计报告

08007236 梁文卓

一、 设计目标和要求

1用简单光照模型显示一系列小球在不同参数情况下的漫反射效果

2用简单光照模型显示一系列小球在不同参数情况下的镜面反射效果

二、 算法原理介绍

1、 光照模型

在现实生活中,某些物体本身就会发光,例如太阳、电灯等,而其它物体虽然不会发光,但可以反射来自其它物体的光。这些光通过各种方式传播,最后进入我们的眼睛——于是一幅画面就在我们的眼中形成了。

OpenGL在处理光照时采用这样一种近似:把光照系统分为三部分,分别是光源、材质和光照环境。光源就是光的来源,材质是指接受光照的各种物体的表面,由于物体如何反射光线只由物体表面决定(OpenGL中没有考虑光的折射),材质特点就决定了物体反射光线的特点。光照环境是指一些额外的参数,它们将影响最终的光照画面,比如一些光线经过多次反射后,已经无法分清它究竟是由哪个光源发出,这时,指定一个环境亮度参数,可以使最后形成的画面更接近于真实情况。

在物理学中,光线如果射入理想的光滑平面,则反射后的光线是很规则的(这样的反射称为镜面反射)。光线如果射入粗糙的、不光滑的平面,则反射后的光线是杂乱的(这样的反射称为漫反射)。现实生活中的物体在反射光线时,并不是绝对的镜面反射或漫反射,但可以看成是这两种反射的叠加。对于光源发出的光线,可以分别设置其经过镜面反射和漫反射后的光线强度。对于被光线照射的材质,也可以分别设置光线经过镜面反射和漫反射后的光线强度。这些因素综合起来,就形成了最终的光照效果。

2、 法线向量

根据光的反射定律,由光的入射方向和入射点的法线就可以得到光的出射方向。因此,对于指定的物体,在指定了光源后,即可计算出光的反射方向,进而计算出光照效果的画面。在OpenGL中,法线的方向是用一个向量来表示。

不幸的是,OpenGL并不会根据你所指定的多边形各个顶点来计算出这些多边形所构成的物体的表面的每个点的法线,通常,为了实现光照效果,需要在代码中为每一个顶点指定其法线向量。

指定法线向量的方式与指定颜色的方式有相似的地方。在指定法线向量时,只需要指定每一个顶点的法线向量,OpenGL会自行计算顶点之间的其它点的法线向量。并且,法线向量一旦被指定,除非再指定新的法线向量,否则以后指定的所有顶点都将以这一向量作为自己的法线向量。使用glColor*函数可以指定颜色,而使用glNormal*函数则可以指定法线向量。

3、 控制光源

OpenGL中,仅仅支持有限数量的光源。使用GL_LIGHT0表示第0号光源,GL_LIGHT1表示第1号光源,依次类推,OpenGL至少会支持8个光源,即GL_LIGHT0GL_LIGHT7。使用glEnable函数可以开启它们。例如,glEnable(GL_LIGHT0);可以开启第0号光源。使用glDisable函数则可以关闭光源。一些OpenGL实现可能支持更多数量的光源,但总的来说,开启过多的光源将会导致程序运行速度的严重下降,玩过3D Mark的朋友可能多少也有些体会。一些场景中可能有成百上千的电灯,这时可能需要采取一些近似的手段来进行编程,否则以目前的计算机而言,是无法运行这样的程序的。

每一个光源都可以设置其属性,这一动作是通过glLight*函数完成的。glLight*函数具有三个参数,第一个参数指明是设置哪一个光源的属性,第二个参数指明是设置该光源的哪一个属性,第三个参数则是指明把该属性值设置成多少。光源的属性众多,下面将分别介绍。

1GL_AMBIENTGL_DIFFUSEGL_SPECULAR属性。这三个属性表示了光源所发出的光的反射特性(以及颜色)。每个属性由四个值表示,分别代表了颜色的R, G, B, A值。GL_AMBIENT表示该光源所发出的光,经过非常多次的反射后,最终遗留在整个光照环境中的强度(颜色)。GL_DIFFUSE表示该光源所发出的光,照射到粗糙表面时经过漫反射,所得到的光的强度(颜色)。GL_SPECULAR表示该光源所发出的光,照射到光滑表面时经过镜面反射,所得到的光的强度(颜色)。

2GL_POSITION属性。表示光源所在的位置。由四个值(X, Y, Z, W)表示。如果第四个值W为零,则表示该光源位于无限远处,前三个值表示了它所在的方向。这种光源称为方向性光源,通常,太阳可以近似的被认为是方向性光源。如果第四个值W不为零,则X/W, Y/W, Z/W表示了光源的位置。这种光源称为位置性光源。对于位置性光源,设置其位置与设置多边形顶点的方式相似,各种矩阵变换函数例如:glTranslate*glRotate*等在这里也同样有效。方向性光源在计算时比位置性光源快了不少,因此,在视觉效果允许的情况下,应该尽可能的使用方向性光源。

3GL_SPOT_DIRECTIONGL_SPOT_EXPONENTGL_SPOT_CUTOFF属性。表示将光源作为聚光灯使用(这些属性只对位置性光源有效)。很多光源都是向四面八方发射光线,但有时候一些光源则是只向某个方向发射,比如手电筒,只向一个较小的角度发射光线。GL_SPOT_DIRECTION属性有三个值,表示一个向量,即光源发射的方向。GL_SPOT_EXPONENT属性只有一个值,表示聚光的程度,为零时表示光照范围内向各方向发射的光线强度相同,为正数时表示光照向中央集中,正对发射方向的位置受到更多光照,其它位置受到较少光照。数值越大,聚光效果就越明显。GL_SPOT_CUTOFF属性也只有一个值,表示一个角度,它是光源发射光线所覆盖角度的一半(见图2),其取值范围在090之间,也可以取180这个特殊值。取值为180时表示光源发射光线覆盖360度,即不使用聚光灯,向全周围发射。

4GL_CONSTANT_ATTENUATIONGL_LINEAR_ATTENUATIONGL_QUADRATIC_ATTENUATION属性。这三个属性表示了光源所发出的光线的直线传播特性(这些属性只对位置性光源有效)。现实生活中,光线的强度随着距离的增加而减弱,OpenGL把这个减弱的趋势抽象成函数:

衰减因子 = 1 / (k1 + k2 * d + k3 * k3 * d)

其中d表示距离,光线的初始强度乘以衰减因子,就得到对应距离的光线强度。k1, k2, k3分别就GL_CONSTANT_ATTENUATION, GL_LINEAR_ATTENUATION, GL_QUADRATIC_ATTENUATION。通过设置这三个常数,就可以控制光线在传播过程中的减弱趋势。

4、 控制材质

材质与光源相似,也需要设置众多的属性。不同的是,光源是通过glLight*函数来设置的,而材质则是通过glMaterial*函数来设置的。

glMaterial*函数有三个参数。第一个参数表示指定哪一面的属性。可以是GL_FRONTGL_BACK或者GL_FRONT_AND_BACK。分别表示设置正面”“背面的材质,或者两面同时设置。(关于正面”“背面的内容需要参看前些课程的内容)第二、第三个参数与glLight*函数的第二、三个参数作用类似。下面分别说明glMaterial*函数可以指定的材质属性。

1GL_AMBIENTGL_DIFFUSEGL_SPECULAR属性。这三个属性与光源的三个对应属性类似,每一属性都由四个值组成。GL_AMBIENT表示各种光线照射到该材质上,经过很多次反射后最终遗留在环境中的光线强度(颜色)。GL_DIFFUSE表示光线照射到该材质上,经过漫反射后形成的光线强度(颜色)。GL_SPECULAR表示光线照射到该材质上,经过镜面反射后形成的光线强度(颜色)。通常,GL_AMBIENTGL_DIFFUSE都取相同的值,可以达到比较真实的效果。使用GL_AMBIENT_AND_DIFFUSE可以同时设置GL_AMBIENTGL_DIFFUSE属性。

2GL_SHININESS属性。该属性只有一个值,称为镜面指数,取值范围是0128。该值越小,表示材质越粗糙,点光源发射的光线照射到上面,也可以产生较大的亮点。该值越大,表示材质越类似于镜面,光源照射到上面后,产生较小的亮点。

3GL_EMISSION属性。该属性由四个值组成,表示一种颜色。OpenGL认为该材质本身就微微的向外发射光线,以至于眼睛感觉到它有这样的颜色,但这光线又比较微弱,以至于不会影响到其它物体的颜色。

4GL_COLOR_INDEXES属性。该属性仅在颜色索引模式下使用,由于颜色索引模式下的光照比RGBA模式要复杂,并且使用范围较小,这里不做讨论。

5、 选择光照模型

这里所说的光照模型OpenGL的术语,它相当于我们在前面提到的光照环境。在OpenGL中,光照模型包括四个部分的内容:全局环境光线(即那些充分散射,无法分清究竟来自哪个光源的光线)的强度、观察点位置是在较近位置还是在无限远处、物体正面与背面是否分别计算光照、镜面颜色(即GL_SPECULAR属性所指定的颜色)的计算是否从其它光照计算中分离出来,并在纹理操作以后在进行应用。
以上四方面的内容都通过同一个函数glLightModel*来进行设置。该函数有两个参数,第一个表示要设置的项目,第二个参数表示要设置成的值。

GL_LIGHT_MODEL_AMBIENT表示全局环境光线强度,由四个值组成。GL_LIGHT_MODEL_LOCAL_VIEWER表示是否在近处观看,若是则设置为GL_TRUE,否则(即在无限远处观看)设置为GL_FALSE

GL_LIGHT_MODEL_TWO_SIDE表示是否执行双面光照计算。如果设置为GL_TRUE,则OpenGL不仅将根据法线向量计算正面的光照,也会将法线向量反转并计算背面的光照。

GL_LIGHT_MODEL_COLOR_CONTROL表示颜色计算方式。如果设置为GL_SINGLE_COLOR,表示按通常顺序操作,先计算光照,再计算纹理。如果设置为GL_SEPARATE_SPECULAR_COLOR,表示

GL_SPECULAR属性分离出来,先计算光照的其它部分,待纹理操作完成后再计算GL_SPECULAR。后者通常可以使画面效果更为逼真(当然,如果本身就没有执行任何纹理操作,这样的分离就没有任何意义)

三、 程序源代码

/*************** 08007236 梁文卓 《计算机图形学》大作业程序 **********************/

//程序中实现了以下功能:

//1、用简单光照模型显示一系列小球在不同参数情况下的漫反射效果;

//2、用简单光照模型显示一系列小球在不同参数情况下的镜面反射效果;

#include

#include

void init(void)

{

glClearColor(0.0,0.1,0.1,0.0);

glEnable(GL_DEPTH_TEST);

glShadeModel(GL_SMOOTH);

GLfloat sun_light_position[] = {0.0f, 3.0f, 2.0f, 0.0f};

GLfloat sun_light_ambient[] = {0.0f, 0.0f, 0.0f, 1.0f};

GLfloat sun_light_diffuse[] = {1.0f, 1.0f, 1.0f, 1.0f};

GLfloat sun_light_specular[] = {1.0f, 1.0f, 1.0f, 1.0f};

glLightfv(GL_LIGHT0, GL_POSITION, sun_light_position);

glLightfv(GL_LIGHT0, GL_AMBIENT, sun_light_ambient);

glLightfv(GL_LIGHT0, GL_DIFFUSE, sun_light_diffuse);

glLightfv(GL_LIGHT0, GL_SPECULAR, sun_light_specular);

glEnable(GL_LIGHT0);

glEnable(GL_LIGHTING);

}

void myDisplay(void)

{

GLfloat no_mat[] = {0.0f, 0.0f, 0.0f, 1.0f};

GLfloat earth_mat_ambient[] = {0.7f, 0.7f, 0.7f, 1.0f};

GLfloat earth_mat_ambient_color[] = {0.8f, 0.8f, 0.2f, 1.0f};

GLfloat earth_mat_diffuse[] = {0.1f, 0.5f, 0.8f, 1.0f};

GLfloat earth_mat_diffuse1[] = {0.5f, 0.5f, 0.8f, 1.0f};

GLfloat earth_mat_specular[] = {1.0f, 1.0f, 1.0f, 1.0f};

GLfloat no_shiniess[] = {0.0};

GLfloat low_shiniess[] = {55.0};

GLfloat high_shiniess[] = {100.0};

GLfloat earth_mat_emission[] = {0.3f, 0.2f, 0.2f, 0.0f};

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

/***** 漫反射,光线照射到该材质上,经过漫反射后形成的光线强度(颜色)为{0.1f, 0.5f, 0.8f, 1.0f}*****/

glPushMatrix();

glTranslatef(-3.75,3.0,0.0);

glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);

glMaterialfv(GL_FRONT, GL_DIFFUSE, earth_mat_diffuse);

glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);

glMaterialfv(GL_FRONT, GL_SHININESS, no_shiniess);

glMaterialfv (GL_FRONT, GL_EMISSION, no_mat);

glutSolidSphere(1.0, 64, 64);

glPopMatrix();

/***** 漫反射,光线照射到该材质上,经过漫反射后形成的光线强度(颜色)为{0.5f, 0.5f, 0.8f, 1.0f}*****/

glPushMatrix();

glTranslatef(-1.25,3.0,0.0);

glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);

glMaterialfv(GL_FRONT, GL_DIFFUSE, earth_mat_diffuse1);

glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);

glMaterialfv(GL_FRONT, GL_SHININESS, no_shiniess);

glMaterialfv (GL_FRONT, GL_EMISSION, no_mat);

glutSolidSphere(1.0, 64, 64);

glPopMatrix();

/***** 漫反射,种光线照射到该材质上,经过很多次反射后最终遗留在环境中的光线强度(颜色)为{0.8f, 0.8f, 0.2f, 1.0f}*****/

glPushMatrix();

glTranslatef(1.25,3.0,0.0);

glMaterialfv(GL_FRONT, GL_AMBIENT, earth_mat_ambient_color);

glMaterialfv(GL_FRONT, GL_DIFFUSE, earth_mat_diffuse);

glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);

glMaterialfv(GL_FRONT, GL_SHININESS, no_shiniess);

glMaterialfv (GL_FRONT, GL_EMISSION, no_mat);

glutSolidSphere(1.0, 64, 64);

glPopMatrix();

/***** 漫反射,向外发射光线强度为{0.3f, 0.2f, 0.2f, 0.0f}*****/

glPushMatrix();

glTranslatef(3.75,3.0,0.0);

glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);

glMaterialfv(GL_FRONT, GL_DIFFUSE, earth_mat_diffuse);

glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);

glMaterialfv(GL_FRONT, GL_SHININESS, no_shiniess);

glMaterialfv (GL_FRONT, GL_EMISSION, earth_mat_emission);

glutSolidSphere(1.0, 64, 64);

glPopMatrix();

/***** 下面是添加了镜面反射后的效果*****/

glPushMatrix();

glTranslatef(-3.75,0.0,0.0);

glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);

glMaterialfv(GL_FRONT, GL_DIFFUSE, earth_mat_diffuse);

glMaterialfv(GL_FRONT, GL_SPECULAR, earth_mat_specular);

glMaterialfv(GL_FRONT, GL_SHININESS, low_shiniess);

glMaterialfv (GL_FRONT, GL_EMISSION, no_mat);

glutSolidSphere(1.0, 64, 64);

glPopMatrix();

glPushMatrix();

glTranslatef(-1.25,0.0,0.0);

glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);

glMaterialfv(GL_FRONT, GL_DIFFUSE, earth_mat_diffuse1);

glMaterialfv(GL_FRONT, GL_SPECULAR, earth_mat_specular);

glMaterialfv(GL_FRONT, GL_SHININESS, low_shiniess);

glMaterialfv (GL_FRONT, GL_EMISSION, no_mat);

glutSolidSphere(1.0, 64, 64);

glPopMatrix();

glPushMatrix();

glTranslatef(1.25,0.0,0.0);

glMaterialfv(GL_FRONT, GL_AMBIENT, earth_mat_ambient_color);

glMaterialfv(GL_FRONT, GL_DIFFUSE, earth_mat_diffuse);

glMaterialfv(GL_FRONT, GL_SPECULAR, earth_mat_specular);

glMaterialfv(GL_FRONT, GL_SHININESS, low_shiniess);

glMaterialfv (GL_FRONT, GL_EMISSION, no_mat);

glutSolidSphere(1.0, 64, 64);

glPopMatrix();

glPushMatrix();

glTranslatef(3.75,0.0,0.0);

glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);

glMaterialfv(GL_FRONT, GL_DIFFUSE, earth_mat_diffuse);

glMaterialfv(GL_FRONT, GL_SPECULAR, earth_mat_specular);

glMaterialfv(GL_FRONT, GL_SHININESS, low_shiniess);

glMaterialfv (GL_FRONT, GL_EMISSION, earth_mat_emission);

glutSolidSphere(1.0, 64, 64);

glPopMatrix();

glFlush();

}

void myReshape(int w, int h)

{

glViewport(0,0,w,h);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

if(w <= (h*2))

glOrtho(-6.0 , 6.0, -3.0*((GLfloat)h*2)/(GLfloat)w, 3.0*((GLfloat)h*2)/(GLfloat)w, -10.0 , 10.0);

else

glOrtho(-6.0*(GLfloat)w/((GLfloat)h*2), 6.0*(GLfloat)w/((GLfloat)h*2), -3.0,-3.0,-10.0 , 10.0);

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

}

int main(int argc, char* argv[])

{

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE | GLUT_DEPTH);

glutInitWindowPosition(200, 200);

glutInitWindowSize(600, 450);

glutCreateWindow("lwz光照演示");

init();

glutReshapeFunc(myReshape);

glutDisplayFunc(&myDisplay);

glutMainLoop();

return 0;

}

四、 程序运行结果抓图

五、 参考文献:

1、 《计算机图形学理论》与OpenGL编程实践, 周建龙 肖春 编著 华南理工出版社

2、 网上资料:《OpenGL入门教程》

六、 学习心得

通过完成这个大作业,我基本学会了OpenGL光照的基本知识。OpenGL把光照分解为光源、材质、光照模式三个部分,根据这三个部分的各种信息,以及物体表面的法线向量,可以计算得到最终的光照效果。

光源、材质和光照模式都有各自的属性,尽管属性种类繁多,但这些属性都只用很少的几个函数来设置。使用glLight*函数可设置光源的属性,使用glMaterial*函数可设置材质的属性,使用glLightModel*函数可设置光照模式。GL_AMBIENTGL_DIFFUSEGL_SPECULAR这三种属性是光源和材质所共有的,如果某光源发出的光线照射到某材质的表面,则最终的漫反射强度由两个GL_DIFFUSE属性共同决定,最终的镜面反射强度由两个GL_SPECULAR属性共同决定。

本文来源:https://www.2haoxitong.net/k/doc/d306edbbfd0a79563c1e72c0.html

《计算机图形学大作业最终版.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式