如果要得到pose视图,除非有精密的测量方法,否则进行大量的样本采集时很耗时耗力的。可以采取一些取巧的方法,正如A Survey on Partial of 3d shapes,描述的,可以利用已得到的3D模型,利用投影的方法 (page10),自动得到精确的3D单向视图。
先普及一下基础知识:
(一):图像处理、计算机图形学、计算机视觉和模式识别领域的区别和联系
三者之间既有区别,又有联系。 原文链接:http://blog.csdn.net/qianmianyuan/article/details/9130805
计算机图形学是给定关于景象结构、表面反射特性、光源配置及相机模型的信息,生成图像。总之,计算机图形学是计算机视觉的逆问题,两者从最初相互独立的平行发展到最近的融合是一大趋势。图像模式的分类是计算机视觉中的一个重要问题,模式识别中的许多方法可以应用于计算机视觉中。
图形学讲的是图形,也就是图形的构造方式,是一种从无到有的概念,从数据得到图像。
数字图像处理是对已有的图像进行变换、分析、重构,得到的仍是图像。
PR本质就是分类,根据常识或样本或二者结合进行分类,可以对图像进行分类,从图像得到数据。
Computer Graphics和Computer Vision是同一过程的两个方向。Computer Graphics将抽象的语义信息转化成图像,Computer Vision从图像中提取抽象的语义信息。Image Processing探索的是从一个图像或者一组图像之间的互相转化和关系,与语义信息无关。
先说区别:
Computer Graphics,简称 CG 。输入的是对虚拟场景的描述,通常为多边形数组,而每个多边形由三个顶点组成,每个顶点包括三维坐标、贴图坐标、rgb颜色等。输出的是图像,即二维像素数组。
Computer Vision,简称 CV。输入的是图像或图像序列,通常来自相机或usb摄像头。输出的是对于图像序列对应的真实世界的理解,比如检测人脸、识别车牌。
Digital Image Processing,简称 DIP。输入的是图像,输出的也是图像。Photoshop中对一副图像应用滤镜就是典型的一种图像处理。常见操作有模糊、灰度化、增强对比度等。
再说联系:
CG 中也会用到 DIP,现今的三维游戏为了增加表现力都会叠加全屏的后期特效,原理就是 DIP,只是将计算量放在了显卡端。
CV 更是大量依赖 DIP 来打杂活,比如对需要识别的照片进行预处理。
最后还要提到近年来的热点——增强现实(AR),它既需要 CG,又需要 CV,当然也不会漏掉 DIP。它用 DIP 进行预处理,用 CV 进行跟踪物体的识别与姿态获取,用 CG 进行虚拟三维物体的叠加。
简单点说吧,1 计算机视觉,里面人工智能的东西更多一些,不仅仅是图像处理的知识,还涵盖了人工智能,机器学习等领域知识;2,计算机图形学,主要涉及图形成像及游戏类开发,如opengl等,还有就是视频渲染等;3,图像处理,这个主要针对图像图像的基本处理,如图像检索或则图像识别,压缩,复原等等操作。以上只是本人字面理解
计算机图形学和数字图像处理是比较老的技术。计算机视觉要迟几十年才提出。
计算机图形学和数字图像处理的区别在于图形和图像。
图形是矢量的、纯数字式的。图像常常由来自现实世界的信号产生,有时也包括图形。
而图像和图形都是数据的简单堆积,计算机视觉要从图像中整理出一些信息或统计数据,也就是说要对计算机图像作进一步的分析。
以上是它们的区别,下面来说联系:
计算机图形学的研究成果可以用于产生数字图像处理所需要的素材,计算机视觉需要以数字图像处理作为基础。计算机视觉与数字图像处理的这种关系类似于物理学和数学的关系。
你可以多看看浙大周昆的文章,周昆是计算机图形学这个领域的领军人物
另外,你如果不是浙江大学的或者中科院计算所的,不建议做这个方向,难度太大(图形比图像虽然表面上只高一维,但实际上工作量大了好多倍;其次,图像,国内外差距目前已经很小,好发重要期刊;图形,除上面两个单位和微软外,国内外差距很大,不好发重要期刊)
数字图像处理主要是对已有的图像,比如说可见光的图像、红外图像、雷达成像进行噪声滤除、边缘检测、图像恢复等处理,就像用ps 处理照片一样的。人脸识别啊、指纹识别啊、运动物体跟踪啊,都属于图像处理。去噪有各种滤波算法;其他的有各种时频变化算法,如傅里叶变化,小波变换等,有很多这方面的书籍。
图形学主要研究如何生成图形的,像用autoCAD作图,就是图形学中算法的应用。各种动漫软件中图形算法的生成等。
(二):数学的三大核心领域:数学的三大核心领域——代数学、几何学、分析学
原文链接:http://blog.sciencenet.cn/blog-81613-682181.html
数学发展到现在,已经成为科学世界中拥有100多个主要分支学科的庞大的“共和国”。大体说来,数学中研究数的部分属于代数学的范畴;研究形的部分,属于几何学的范筹;沟通形与数且涉及极限运算的部分,属于分析学的范围。这三大类数学构成了整个数学的本体与核心。在这一核心的周围,由于数学通过数与形这两个概念,与其它科学互相渗透,而出现了许多边缘学科和交叉学科。本章简要介绍数学三大核心领域中十几门主要分支学科的有关历史发展情况。
一、代数学范畴
1、算术
算术有两种含义,一种是从中国传下来的,相当于一般所说的“数学”,如《九章算术》等。另一种是从欧洲数学翻译过来的,源自希腊语,有“计算技术”之意。现在一般所说的“算术”,往往指自然数的四则运算;如果是在高等数学中,则有“数论”的含义。作为现代小学课程内容的算术,主要讲的是自然数、正分数以及它们的四则运算,并通过由计数和度量而引起的一些最简单的应用题加以巩固。
算术是数学中最古老的一个分支,它的一些结论是在长达数千年的时间里,缓慢而逐渐地建立起来的。它们反映了在许多世纪中积累起来,并不断凝固在人们意识中的经验。
自然数:是在对于对象的有限集合进行计算的过程中,产生的抽象概念。日常生活中要求人们不仅要计算单个的对象,还要计算各种量,例如长度、重量和时间。为了满足这些简单的量度需要,就要用到分数。
现代初等算术运算方法的发展,起源于印度,时间可能在10世纪或11世纪。它后来被阿拉伯人采用,之后传到西欧。15世纪,它被改造成现在的形式。在印度算术的后面,明显地存在着我国古代的影响。
19世纪中叶,格拉斯曼第一次成功地挑选出一个基本公理体系,来定义加法与乘法运算;而算术的其它命题,可以作为逻辑的结果,从这一体系中被推导出来。后来,皮亚诺进一步完善了格拉斯曼的体系。
算术的基本概念和逻辑推论法则,以人类的实践活动为基础,深刻地反映了世界的客观规律性。尽管它是高度抽象的,但由于它概括的原始材料是如此广泛,因此我们几乎离不开它。同时,它又构成了数学其它分支的最坚实的基础。
2、初等代数
作为中学数学课程主要内容的初等代数,其中心内容是方程理论。代数一词的拉丁文原意是“归位”。代数方程理论在初等代数中是由一元一次方程向两个方面扩展的:其一是增加未知数的个数,考察由有几个未知数的若干个方程所构成的二元或三元方程组(主要是一次方程组);其二是增高未知量的次数,考察一元二次方程或准二次方程。初等代数的主要内容在16世纪便已基本上发展完备了。
古巴比伦(公元前19世纪~前17世纪)解决了一次和二次方程问题,欧几里得的《原本》(公元前4世纪)中就有用几何形式解二次方程的方法。我国的《九章算术》(公元1世纪)中有三次方程和一次联立方程组的解法,并运用了负数。3世纪的丢番图用有理数求一次、二次不定方程的解。13世纪我国出现的天元术(李冶《测圆海镜》)是有关一元高次方程的数值解法。16世纪意大利数学家发现了三次和四次方程的解法。
代数学符号发展的历史,可分为三个阶段。第一个阶段为三世纪之前,对问题的解不用缩写和符号,而是写成一篇论文,称为文字叙述代数。第二个阶段为三世纪至16世纪,对某些较常出现的量和运算采用了缩写的方法,称为简化代数。三世纪的丢番图的杰出贡献之一,就是把希腊代数学简化,开创了简化代数。然而此后文字叙述代数,在除了印度以外的世界其它地方,还十分普通地存在了好几百年,尤其在西欧一直到15世纪。第三个阶段为16世纪以后,对问题的解多半表现为由符号组成的数学速记,这些符号与所表现的内容没有什么明显的联系,称为符号代数。16世纪韦达的名著《分析方法入门》,对符号代数的发展有不少贡献。16世纪末,维叶特开创符号代数,经笛卡尔改进后成为现代的形式。
“+”、“-”号第一次在数学书中出现,是1489年魏德曼的著作。不过正式为大家所公认,作为加、减法运算的符号,那是从1514年由荷伊克开始的。1540年,雷科德开始使用现在使用“=”。到1591年,韦达在著作中大量使用后,才逐渐为人们所接受。1600年哈里奥特创用大于号“>”和小于号“<”。1631年,奥屈特给出“×”、“÷”作为乘除运算符。1637年,笛卡尔第一次使用了根号,并引进用字母表中头前的字母表示已知数、后面的字母表示未知数的习惯做法。至于“≮”、“≯”、“≠”这三个符号的出现,那是近代的事了。
数的概念的拓广,在历史上并不全是由解代数方程所引起的,但习惯上仍把它放在初等代数里,以求与这门课程的安排相一致。公元前4世纪,古希腊人发现无理数。公元前2世纪(西汉时期),我国开始应用负数。1545年,意大利的卡尔达诺开始使用虚数。1614年,英国的耐普尔发明对数。17世纪末,一般的实数指数概念才逐步形成。
3、高等代数
在高等代数中,一次方程组(即线性方程组)发展成为线性代数理论;而—、二次方程发展成为多项式理论。前者是向量空间、线性变换、型论、不变量论和张量代数等内容的一门近世代数分支学科,而后者是研究只含有一个未知量的任意次方程的一门近世代数分支学科。作为大学课程的高等代数,只研究它们的基础。
1683年关孝和(日本人)最早引入行列式概念。关于行列式理论最系统的论述,则是雅可比1841年的《论行列式的形成与性质》一书。在逻辑上,矩阵的概念先于行列式的概念;而在历史上,次序正相反。凯雷在1855年引入了矩阵的概念,在1858年发表了关于这个课题的第一篇重要文章《矩阵论的研究报告》。
19世纪,行列式和矩阵受到人们极大的关注,出现了千余篇关于这两个课题的文章。但是,它们在数学上并不是大的改革,而是速记的一种表达式。不过已经证明它们是高度有用的工具。
多项式代数的研究始于对3、4次方程求根公式的探索。1515年,菲洛解决了被简化为缺2次项的3次方程的求解问题。1540年,费尔拉里成功地发现了一般4次方程的代数解法。人们继续寻求5次、6次或更高次方程的求根公式,但这些努力在200多年中付诸东流。
1746年,达朗贝尔首先给出了“代数学基本定理”的证明(有不完善之处)。这个定理断言:每一个实系数或复系数的n次代数方程,至少有一个实根或复根。因此,一般地说,n次代数方程应当有n个根。1799年,22岁的高斯在写博士论文中,给出了这个定理的第一个严格的证明。1824年,22岁的阿贝尔证明了:高于4次的一般方程的全部系数组成的根式,不可能是它的根。1828年,年仅17岁的伽罗华创立了“伽罗华理论”,包含了方程能用根号解出的充分必要条件。
4、数论
以正整数作为研究对象的数论,可以看作是算术的一部分,但它不是以运算的观点,而是以数的结构的观点,即一个数可用性质较简单的其它数来表达的观点来研究数的。因此可以说,数论是研究由整数按一定形式构成的数系的科学。
早在公元前3世纪,欧几里得的《原本》讨论了整数的一些性质。他证明素数的个数是无穷的,他还给出了求两个数的公约数的辗转相除法。这与我国《九章算术》中的“更相减损法”是相同的。埃拉托色尼则给出了寻找不大于给定的自然数N的全部素数的“筛法”:在写出从1到N的全部整数的纸草上,依次挖去2、3、5、7……的倍数(各自的2倍,3倍,……)以及1,在这筛子般的纸草上留下的便全是素数了。
当两个整数之差能被正整数m除尽时,便称这两个数对于“模”m同余。我国《孙子算经》(公元4世纪)中计算一次同余式组的“求一术”,有“中国剩余定理”之称。13世纪,秦九韶已建立了比较完整的同余式理论——“大衍求一术”,这是数论研究的内容之一。
丢番图的《算术》中给出了求x?+y?=z?所有整数解的方法。费尔马指出x^n+y^n=z^n在n>3时无整数解,对于该问题的研究产生了19世纪的数论。之后高斯的《数论研究》(1801年)形成了系统的数论。
数论的古典内容基本上不借助于其它数学分支的方法,称为初等数论。17世纪中叶以后,曾受数论影响而发展起来的代数、几何、分析、概率等数学分支,又反过来促进了数论的发展,出现了代数数论(研究整系数多项式的根—“代数数”)、几何数论(研究直线坐标系中坐标均为整数的全部“整点”—“空间格网”)。19世纪后半期出现了解析数论,用分析方法研究素数的分布。二十世纪出现了完备的数论理论。
5、抽象代数
1843年,哈密顿发明了一种乘法交换律不成立的代数——四元数代数。第二年,格拉斯曼推演出更有一般性的几类代数。1857年,凯雷设计出另一种不可交换的代数——矩阵代数。他们的研究打开了抽象代数(也叫近世代数)的大门。实际上,减弱或删去普通代数的某些假定,或将某些假定代之以别的假定(与其余假定是相容的),就能研究出许多种代数体系。
1870年,克隆尼克给出了有限阿贝尔群的抽象定义;狄德金开始使用“体”的说法,并研究了代数体;1893年,韦伯定义了抽象的体;1910年,施坦尼茨展开了体的一般抽象理论;狄德金和克隆尼克创立了环论;1910年,施坦尼茨总结了包括群、代数、域等在内的代数体系的研究,开创了抽象代数学。
1926年,诺特完成了理想(数)理论;1930年,毕尔霍夫建立格论,它源于1847年的布尔代数;第二次世界大战后,出现了各种代数系统的理论和布尔巴基学派;1955年,嘉当、格洛辛狄克和爱伦伯克建立了同调代数理论。
到现在为止,数学家们已经研究过200多种这样的代数结构,其中最主要德若当代数和李代数是不服从结合律的代数的例子。这些工作的绝大部分属于20世纪,它们使一般化和抽象化的思想在现代数学中得到了充分的反映。
抽象代数是研究各种抽象的公理化代数系统的数学学科。典型的代数系统有群、环、域等,它们主要起源于19世纪的群论,包含有群论、环论、伽罗华理论、格论、线性代数等许多分支,并与数学其它分支相结合产生了代数几何、代数数论、代数拓扑、拓扑群等新的数学学科。抽象代数已经成了当代大部分数学的通用语言。
现在,可以笼统地把代数学解释为关于字母计算的学说,但字母的含义是在不断地拓广的。在初等代数中,字母表示数;而在高等代数和抽象代数中,字母则表示向量(或n元有序数组)、矩阵、张量、旋量、超复数等各种形式的量。可以说,代数已经发展成为一门关于形式运算的一般学说了。
二、几何学范畴
1、初等几何
在希腊语中,“几何学”是由“地”与“测量”合并而来的,本来有测量土地的含义,意译就是“测地术”。“几何学”这个名词,系我国明代数学家根据读音译出的,沿用至今。
现在的初等几何主要是指欧几里得几何,它是讨论图形(点、线、面、角、圆等)在运动下的不变性质的科学。例如,欧氏几何中的两点之间的距离,两条直线相交的交角大小,半径是r的某一圆的面积等都是一些运动不变量。
初等几何作为一门课程来讲,安排在初等代数之后;然而在历史上,几何学的发展曾优先于代数学,它主要被认为是古希腊人的贡献。
几何学舍弃了物质所有的其它性质,只保留了空间形式和关系作为自己研究的对象,因此它是抽象的。这种抽象决定了几何的思维方法,就是必须用推理的方法,从一些结论导出另一些新结论。定理是用演绎的方式来证明的,这种论证几何学的代表作,便是公元前三世纪欧几里得的《原本》,它从定义与公理出发,演绎出各种几何定理。
现在中学《平面三角》中关于三角函数的理论是15世纪才发展完善起来的,但是它的一些最基本的概念,却早在古代研究直角三角形时便己形成。因此,可把三角学划在初等几何这一标题下。
古代埃及、巴比伦、中国、希腊都研究过有关球面三角的知识。公元前2世纪,希帕恰斯制作了弦表,可以说是三角的创始人。后来印度人制作了正弦表;阿拉伯的阿尔·巴塔尼用计算sinθ值的方法来解方程,他还与阿布尔·沃法共同导出了正切、余切、正割、余割的概念;赖蒂库斯作了较精确的正弦表,并把三角函数与圆弧联系起来。
由于直角三角形是最简单的直线形,又具有很重要的实用价值,所以各文明古国都极重视它的研究。我国《周髀算经》一开始就记载了周朝初年(约公元前1100年左右)的周公与学者商高的对话,其中就谈到“勾三股四弦五”,即勾股定理的特殊形式;还记载了在周公之后的陈子,曾用勾股定理和相似图形的比例关系,推算过地球与太阳的距离和太阳的直径,同时为勾股定理作的图注达几十种之多。在国外,传统称勾股定理为毕达哥拉斯定理,认为它的第一个一致性的证明源于毕氏学派(公元前6世纪),虽然巴比伦人在此以前1000多年就发现了这个定理。到现在人们对勾股定理已经至少提供了370种证明。
19世纪以来,人们对于关于三角形和圆的初等综合几何,又进行了深入的研究。至今这一研究领域仍然没有到头,不少资料已引申到四面体及伴随的点、线、面、球。
2、射影几何
射影几何学是一门讨论在把点射影到直线或平面上的时候,图形的不变性质的一门几何学。幻灯片上的点、线,经过幻灯机的照射投影,在银幕上的图画中都有相对应的点线,这样一组图形经过有限次透视以后,变成另一组图形,这在数学上就叫做射影对应。射影几何学在航空、摄影和测量等方面都有广泛的应用。
射影几何是迪沙格和帕斯卡在1639年开辟的。迪沙格发表了—本关于圆维曲线的很有独创性的小册子,从开普勒的连续性原理开始,导出了许多关于对合、调和变程、透射、极轴、极点以及透视的基本原理,这些课题是今天学习射影几何这门课程的人所熟悉的。年仅16岁的帕斯卡得出了一些新的、深奥的定理,并于9年后写了一份内容很丰富的手稿。18世纪后期,蒙日提出了二维平面上的适当投影表达三维对象的方法,因而从提供的数据能快速算出炮兵阵地的位置,避开了冗长的、麻烦的算术运算。
射影几何真正独立的研究是由彭赛勒开创的。1822年,他发表了《论图形的射影性质》一文,给该领域的研究以巨大的推动作用。他的许多概念被斯坦纳进一步发展。1847年,斯陶特发表了《位置几何学》一书,使射影几何最终从测量基础中解脱出来。
后来证明,采用度量适当的射影定义,能在射影几何的范围内研究度量几何学。将一个不变二次曲线添加到平面上的射影几何中,就能得到传统的非欧几何学。在19世纪晚期和20世纪初期,对射影几何学作了多种公设处理,并且有限射影几何也被发现。事实证明,逐渐地增添和改变公设,就能从射影几何过渡到欧几里得几何,其间经历了许多其它重要的几何学。
3、解析几何
解析几何即坐标几何,包括平面解析几何和立体解析几何两部分。解析几何通过平面直角坐标系和空间直角坐标系,建立点与实数对之间的一一对应关系,从而建立起曲线或曲面与方程之间的一一对应关系,因而就能用代数方法研究几何问题,或用几何方法研究代数问题。
在初等数学中,几何与代数是彼此独立的两个分支;在方法上,它们也基本是互不相关的。解析几何的建立,不仅由于在内容上引入了变量的研究而开创了变量数学,而且在方法上也使几何方法与代数方法结合起来。
在迪沙格和帕斯卡开辟了射影几何的同时,笛卡儿和费尔马开始构思现代解析几何的概念。这两项研究之间存在一个根本区别:前者是几何学的一个分支,后者是几何学的一种方法。
1637年,笛卡儿发表了《方法论》及其三个附录,他对解析几何的贡献,就在第三个附录《几何学》中,他提出了几种由机械运动生成的新曲线。在《平面和立体轨迹导论》中,费尔马解析地定义了许多新的曲线。在很大程度上,笛卡儿从轨迹开始,然后求它的方程;费尔马则从方程出发,然后来研究轨迹。这正是解析几何基本原则的两个相反的方面,“解析几何”的名称是以后才定下来的。
这门课程达到现在课本中熟悉的形式,是100多年以后的事。象今天这样使用坐标、横坐标、纵坐标这几个术语,是莱布尼兹于1692年提出的。1733年,年仅18岁的克雷洛出版了《关于双重曲率曲线的研究》一书,这是最早的一部空间解析几何著作。1748年,欧拉写的《无穷分析概要》,可以说是符合现代意义的第一部解析几何学教程。1788年,拉格朗日开始研究有向线段的理论。1844年,格拉斯曼提出了多维空间的概念,并引入向量的记号。于是多维解析几何出现了。
解析几何在近代的发展,产生了无穷维解析几何和代数几何等一些分支。普通解析几何只不过是代数几何的一部分,而代数几何的发展同抽象代数有着密切的联系。
4、非欧几何
非欧几何有三种不同的含义:狭义的,单指罗氏(罗巴切夫斯基)几何;广义的,泛指一切和欧氏(欧几里得)几何不同的几何;通常意义的,指罗氏几何和黎曼几何。
欧几里得的第5公设(平行公设)在数学史上占有特殊的地位,它与前4条公设相比,性质显得太复杂了。它在《原本》中第一次应用是在证明第29个定理时,而且此后似乎总是尽量避免使用它。因此人们怀疑第五公设的公理地位,并探索用其它公理来证明它,以使它变为一条定理。在三千多年的时间中,进行这种探索并有案可查的就达两千人以上,其中包括许多知名的数学家,但他们都失败了。
罗巴契夫斯基于1826年,鲍耶于1832年发表了划时代的研究结果,开创了非欧几何。在这种几何中,他们假设“过不在已知直线上的一点,可以引至少两条直线平行于已知直线”,用以代替第五公设,同时保留了欧氏几何的其它公设。
1854年,黎曼推出了另一种非欧几何。在这种几何中,他假设“过已知直线外一点,没有和已知直线平行的直线可引”,用以代替第5公设,同时保留了欧氏几何的其它公设。1871年,克莱因把这3种几何:罗巴契夫斯基—鲍耶的、欧几里得的和黎曼的分别定名为双曲几何、抛物几何和椭圆几何。
非欧几何的发现不仅最终解决了平行公设的问题——平行公设被证明是独立于欧氏几何的其它公设的,而且把几何学从其传统模型中解放出来,创造了许多不同体系的几何的道路被打开了。
1854年,黎曼发表了“关于作为几何学基础的假设的讲演”。他指出:每种不同的(两个无限靠近的点的)距离公式决定了最终产生的空间和几何的性质。1872年,克莱因建立了各种几何系统按照不同变换群不变量的分类方法。
19世纪以后,几何空间概念发展的另一方向,是按照所研究流形的微分几何原则的分类,每一种几何都对应着一种定理系统。1899年,希尔伯特发表了《几何基础》一书,提出了完备的几何公理体系,建立了欧氏几何的严密的基础,并给出了证明一个公理体系的相容性(无矛盾性)、独立性和完备性的普遍原则。按照他的观点,不同的几何空间乃是从属于不同几何公理要求的元素集合。欧氏几何和非欧几何,在大量的几何系统中,只不过是极其特殊的情形罢了。
5、拓扑学
1736年,欧拉发表论文,讨论哥尼斯堡七桥问题。他还提出球面三角形剖分图形顶点、边、面之间关系的欧拉公式,这可以说是拓扑学的开端。
庞加莱于1895~1904年建立了拓扑学,采用代数组合的方法研究拓扑性质。他把欧拉公式推广为欧拉—庞加莱公式,与此有关的理论现在称为同调理论和同伦理论。以后的拓扑学主要按照庞加莱的设想发展。
拓扑学开始是几何学的一个分支,在二十世纪它得到了极大的推广。1906年,弗雷歇发表博士论文,把函数作为一个“点”来看,把函数收敛描绘成点的收敛,这就把康托的点集论和分析学的抽象化联系起来了。他在函数所构成的集合中引入距离的概念,构成距离空间,展开了线性距离空间的理论。在这个基础上,产生了点集拓扑学。在豪斯道夫的《点集论纲要》一书中,出现了更一般的点集拓扑学的完整想法。第二次世界大战后,把分析引进拓扑,发展了微分拓扑。
现在的拓扑学可以粗略地定义为对于连续性的数学研究。任何事物的集合都能在某种意义上构成拓扑空间,拓扑学的概念和理论已基本完组成为数学的基础理论之一,渗入到各个分支,并且成功地应用于电磁学和物理学的研究。
三、分析学范畴
1、微积分
微积分学是微分学和积分学的统称,它是研究函数的导数、积分的性质和应用的一门数学分支学科。
微积分的出现具有划时代意义,时至今日,它不仅成了学习高等数学各个分支必不可少的基础,而且是学习近代任何一门自然科学和工程技术的必备工具。现在的微积分学的教程,通常的讲授次序是先极限、再微分、后积分,这与历史顺序正好相反。
在微积分历史中,最初的问题是涉及计算面积、体积和弧长的。阿基米得(公元前3世纪)的方法最接近于现行的积分法。在17世纪探索微积分的至少有十几位大数学家和几十位小数学家。牛顿和莱布尼茨分别进行了创造性的工作,各自独立地跑完了“微积分这场接力赛的最后一棒”。
1609年,开普勒为了计算行星运动第二定律中包含的面积,和在他的论文中讨论的酒桶的体积,而借助了某种积分方法。1635年,卡瓦列利发表了一篇阐述不可分元法的论文,提出卡瓦列利原理,它是计算面积和体积的有价值的工具。1650年,沃利斯把卡瓦列利的方法系统化,并作了推广。
微分起源于作曲线的切线和求函数的极大值或极小值问题。虽然可以追溯到古希腊,但是第一个真正值得注意的先驱工作,是费尔马1629年陈述的概念。1669年,巴罗对微分理论作出了重要的贡献,他用了微分三角形,很接近现代微分法。一般认为,他是充分地认识到微分法为积分法的逆运算的第一个人。
至此,还有什么要做的呢?首要的是,创造一般的符号和一整套形式的解析规则,形成可以应用的微积分学,这项工作是由牛顿和莱布尼兹彼此独立地做出的。接着的工作是在可接受的严格的基础上,重新推导基本理论,这必须等到此课题想到多方面应用之后。柯西和他的后继者们完成了这一工作。
牛顿早在1665年才23岁时,就创造了流数法(微分学),并发展到能求曲线上任意一点的切线和曲率半径。他的《流数法》写于1671年,但直到死后9年的1736年才发表。牛顿考虑了两种类型的问题,等价于现在的微分和解微分方程。他定义了流数(导数)、极大值、极小值、曲线的切线、曲率、拐点、凸性和凹性,并把它的理论应用于许多求积问题和曲线的求长问题。
牛顿创立的微积分原理是同他的力学研究分不开的,他借此发现、并研究了力学三大定律和万有引力定律,1687年出版了名著《自然哲学的数学原理》。这本书是研究天体力学的,包括了微积分的一些基本概念和原理。
莱布尼茨是在1673年到1676年之间,从几何学观点上独立发现微积分的。1676年,他第一次用长写字母∫表示积分符号,象今天这样写微分和微商。1684年~1686年,他发表了一系列微积分著作,力图找到普遍的方法来解决问题。今天课本中的许多微分的基本原则就是他推导出来的,如求两个函数乘积的n阶导数的法则,现在仍称作菜布尼兹法则。莱布尼兹的另一最大功绩是创造了反映事物本质的数字符号,数学分析中的基本概念的记号,例如微分dx,二级微分dx?,积分∫ydx,导数dy/dx等都是他提出来的,并且沿用至今,非常方便。
牛顿与莱布尼茨的创造性工作有很大的不同。主要差别是牛顿把x和y的无穷小增量作为求导数的手段,当增量越来越小的时候,导数实际上就是增量比的极限,而莱布尼兹却直接用x和y的无穷小增量(就是微分)求出它们之间的关系。
这个差别反映了他们研究方向的不同,在牛顿的物理学方向中,速度之类是中心概念;而在莱布尼兹的几何学方向中,却着眼于面积体积的计算。其它差别是,牛顿自由地用级数表示函数,采用经验的、具体和谨慎的工作方式,认为用什么记号无关紧要;而莱布尼兹则宁愿用有限的形式来表示函数,采用富于想象的、喜欢推广的、大胆的工作方式,花费很多时间来选择富有提示性的符号。
到1700年,现在大学且学习的大部分微积分内容已经建立起来。第一部微积分课本出版于1696年,是洛比达写的。1769年,欧拉论述了二重积分。1773年,拉格朗日考察了三重积分。1837年,波尔查诺给出了级数的现代定义。19世纪分析学的严谨化,是由柯西奠基的。现在课本中的极限、连续性定义、把导数看作差商的极限、把定积分看做和的权限等等,实质上都是柯西给出的。进一步完成这一工作的是威尔斯特拉斯,他给出了现在使用的精确的极限定义,并同狄德金、康托于19世纪70年代建立了严格的实数理论,使微积分有了坚固可靠的逻辑基础。
2、微分方程
凡是表示未知函数和未知函数的导数以及自变量之间的关系的方程,就叫做微分方程。如果未知函数是一元函数,则称为常微分方程,如果未知函数是多元函数,则称为偏微分方积。微分方程的基本问题是在一定条件下,从所给出的微分方程解出未知函数。
微分方程几乎是与微积分同时发展起来的,由于它与力学、物理学的渊源很深,所以在13世纪便已自成一门独立的学科了。两个多世纪来,这一学科已发展得相当完善。
1676年,莱布尼兹在致牛顿的信中,首先提出了“微分方程”这个名称。在他们两人的著作中,都包含了许多微分方程的实例。早期的研究侧重于探讨各类一阶方程的解法,并由此导致了方程的分类。18世纪,欧拉解决了全微分方程和“欧拉方程”(一类高阶变系数线性微分方程),提出了通解和特解的概念,指出了n阶线性方程通解的结构。其后,泰勒得到了方程的奇解;拉格朗日推导了非齐次线性方程的常数交易法。
对于微分方程组的研究,始于达朗贝尔。19世纪前半叶,柯西开始研究解的存在性和唯一性。19世纪后半叶,数学家们开始利用群论来研究微分方程,由此建立连续群和李群的新理论。庞加莱引入了极限环的概念,李雅普诺夫引入了微分方程组解的稳定性概念。他们的方法都不必直接求解,称为定性理论。1927年,毕尔霍夫建立了“动力系统”的一段定性理论。
一阶偏微分方程的研究首先是从几何学问题开始的。拉格朗日指出,解一阶线性偏微分方程的技巧,在于把它们化为常微分方程。一阶非线性偏微分方程的研究,始于欧拉和拉格朗日,蒙日为偏微分方程的几何理论奠定了基础。到18世纪末叶,在引入奇解、通解、全积分、通积分、特积分等概念之后,偏微分方程已形成一门独立的学科。
二阶偏微分方程的研究,始于18世纪的弦振动理论。通常见的二阶偏微分方程均来自物理或力学的实际问题,它们构成了这门学科中一个独立的系统—数学物理方程。
积分方程源于阿贝尔1826年的工作,但是直到1888年杜·波阿·雷蒙的著作中,才正式提出了积分方程这个名词。1896年开始,伏特拉给出了两类积分方程的一般理论;不久,弗雷德荷姆大体上完成了一类重要的线性积分方程理论。由于这类积分方程常出现在一些物理问题中,因此积分方程论常被包含在数学物理方程内。
现代科学技术,如空间技术、现代物理学、力学等,都有许多问题需要用微分方程来求解,甚至在化学、生物学、医药学、经济学等方面,微分方程的应用也越来越多。
3、微分几何
微分几何这门分支学科主要研究三维欧氏空间中曲线和曲面的内在性质,所谓内在性质就是同几何对象在空间中的位置无关的性质。它以微积分、微分方程这些分支学科的理论为研究工具。或简单地说,微分几何就是用分析方法研究几何性质。
微分几何的发端可见于1731年克莱洛的著作中。蒙日1809年的著作包含了这一学科的雏型;欧拉研究了曲面的一般理论;高斯1827年的《关于曲面的一般研究》一书,论述了曲面理论,创立了内蕴几何学,奠定了曲面微分几何的基础。1887~1896年,达布的《曲面一般理论的讲义》集曲线和曲面微分几何之大成。
变换理论对于微分几何的影响,产生了射影微分几何、仿射微分几何等分支。二十世纪初,出现了对非充分光滑曲线和曲面以及曲线曲面的整体问题的研究,形成现代微分几何。1923年,嘉当提出了一般联络的理论。1945年,陈省身建立了代数拓扑和微分几何的联系,他又是纤维丛概念的创建人之一。
4、函数论
函数论包括复变函数论和实变函数论,但有时也单指复变函数论(或复分析)而言。
复数概念出现于16世纪,但对它的全面掌握和广泛运用,却迟至18世纪。自变量是复数的函数,叫做复变函数。如果复变函数在某一区域内除了可能有有限个例外点之外,处处有导数,那么这个伏辩函数叫做在这个区域内的解析函数;例外点叫做奇点。复变函数论主要研究解析函数的性质。
复变函数的研究是从18世纪开始的。30~40年代,欧拉利用幂级数详细讨论了初等复变函数的性质。达朗贝尔于1752年得出复变函数可微的必要条件(即“柯西—黎曼条件”)。拉普拉斯也考虑过复变函数的积分。
复变函数的全面发展是在19世纪。1825年,柯西讨论了虚限定积分,1831年他实质上推出了柯西积分公式,并在此基础上建立了一整套复变函数微分和积分的理论。黎曼1851年的博士论文《复变函数论的基础》,奠定了复变函数论的基础。他推广了单位解析函数到多位解析函数;引入了“黎曼曲面”的重要概念,确立了复变因数的几何理论基础;证明了保角映射基本定理。威尔斯特拉斯完全摆脱了几何直观,以幂级数为工具,用严密的纯解析推理展开了函数论。定义解析函数是可以展开为幂级数的函数,围绕着奇点研究函数的性质。近几十年来,复变函数论又有很大的推进。
复变函数论是解决工程技术问题的有力工具,飞机飞行理论、热运动理论、流体力学理论、电场和弹性理论等中的很多问题。
实变函数的发展较晚,其中积分论是它的重要组成部分。容度和测度是线段长度概念的推广,是为了推广积分的概念而建立起来的。1893年,约当给出了“约当容度”的概念,并用于讨论积分。1894年,斯提捷首先推广了积分概念,得到了“斯提捷积分”。1898年,波莱尔改进了容度的概念,他称之为‘测度”。下一步决定性的进展是1902年勒贝格改进了测度理论,建立了“勒贝格测度”、“勒贝格积分”等概念。1904年,他完全解决了黎曼可积性的问题。后来,数学家们对积分的概念又作了种种推广和探索。
实变函数的另一个领域是函数构造论。1885年,威尔斯特拉斯证明:连续函数必可表示为一致收敛的多项式级数。这一结果和切比雪夫斯基最佳逼近论,是函数构造论的开端。近年来,这个方向的研究十分活跃。
5、泛函分析
本世纪初,出现了一个广阔的新领域——泛函分析,它是古典分析观点的推广。近几十年来,由于分析学中许多新分支的形成,从而发现在代数、几何、分析中不同领域之间的某些方面的类似。其次,几何与集合论的结合产生了抽象空间的理论,将函数看成函数空间中的点。再加上实变函数论以及近世代数的感念和方法的影响,就产生了泛画分析。它综合函数论,几何和代数的观点,研究无穷维向量空间上的函数、算子和极限理论。
19世纪末,弗尔太拉和二十世纪初阿达玛的著作中已出现泛函分析的萌芽。随后希尔伯特、海令哲开创了“希尔伯将空间”的研究,黎斯、冯·诺伊曼等人在这方面都有重要的建树。
未完待续..............................
(三):OpenGL图像学基础
一、OpenGL与3D图形世界
OpenGL是基于图元建模的典范,粒子建模计算太复杂以至于现在还仅仅是停留在学术领域,作为未来的方向继续发展.
1.1、OpenGL使人们进入三维图形世界
我们生活在一个充满三维物体的三维世界中,为了使计算机能精确地再现这些物体,我们必须能在三维空间描绘这些物体。我们又生活在一个充满信息的世界中,能否尽快地理解并运用这些信息将直接影响事业的成败,所以我们需要用一种最直接的形式来表示这些信息。
最近几年计算机图形学的发展使得三维表现技术得以形成,这些三维表现技术使我们能够再现三维世界中的物体,能够用三维形体来表示复杂的信息,这种技术就是可视化(Visualization)技术。可视化技术使人能够在三维图形世界中直接对具有形体的信息进行操作,和计算机直接交流。这种技术已经把人和机器的力量以一种直觉而自然的方式加以统一,这种革命性的变化无疑将极大地提高人们的工作效率。可视化技术赋予人们一种仿真的、三维的并且具有实时交互的能力,这样人们可以在三维图形世界中用以前不可想象的手段来获取信息或发挥自己创造性的思维。机械工程师可以从二维平面图中得以解放直接进入三维世界,从而很快得到自己设计的三维机械零件模型。医生可以从病人的三维扫描图象分析病人的病灶。军事指挥员可以面对用三维图形技术生成的战场地形,指挥具有真实感的三维飞机、军舰、坦克向目标开进并分析战斗方案的效果。
更令人惊奇的是目前正在发展的虚拟现实技术,它能使人们进入一个三维的、多媒体的虚拟世界,人们可以游历远古时代的城堡,也可以遨游浩翰的太空。所有这些都依赖于计算机图形学、计算机可视化技术的发展。人们对计算机可视化技术的研究已经历了一个很长的历程,而且形成了许多可视化工具,其中SGI公司推出的GL三维图形库表现突出,易于使用而且功能强大。利用GL开发出来的三维应用软件颇受许多专业技术人员的喜爱,这些三维应用软件已涉及建筑、产品设计、医学、地球科学、流体力学等领域。随着计算机技术的继续发展,GL已经进一步发展成为OpenGL,OpenGL已被认为是高性能图形和交互式视景处理的标准,目前包括ATT公司UNIX软件实验室、IBM公司、DEC公司、SUN公司、HP公司、Microsoft公司和 SGI公司在内的几家在计算机市场占领导地位的大公司都采用了OpenGL图形标准。
值得一提的是,由于Microsoft公司在 Windows NT中提供OpenGL图形标准,OpenGL将在微机中广泛应用,尤其是OpenGL三维图形加速卡和微机图形工作站的推出,人们可以在微机上实现三维图形应用,如CAD设计、仿真模拟、三维游戏等,从而更有机会、更方便地使用OpenGL及其应用软件来建立自己的三维图形世界。
1.2、OpenGL提供直观的三维图形开发环境
OpenGL实际上是一种图形与硬件的接口。它包括了120个图形函数,开发者可以用这些函数来建立三维模型和进行三维实时交互。与其他图形程序设计接口不同,OpenGL提供了十分清晰明了的图形函数,因此初学的程序设计员也能利用OpenGL的图形处理能力和1670万种色彩的调色板很快地设计出三维图形以及三维交互软件。
OpenGL强有力的图形函数不要求开发者把三维物体模型的数据写成固定的数据格式,这样开发者不但可以直接使用自己的数据,而且可以利用其他不同格式的数据源。这种灵活性极大地节省了开发者的时间,提高了软件开发效益。
长期以来,从事三维图形开发的技术人员都不得不在自己的程序中编写矩阵变换、外部设备访问等函数,这样为调制这些与自己的软件开发目标关系并不十分密切的函数费脑筋,而OpenGL正是提供一种直观的编程环境,它提供的一系列函数大大地简化了三维图形程序。例如:
相应函数 | 具体说明 |
OpenGL实用库 | 43个函数,每个函数以glu开头。 |
OpenGL辅助库 | 31个函数,每个函数以aux开头。 |
Windows专用库函数(WGL) | 6个函数,每个函数以wgl开头。 |
Win32 API函数 | 5个函数,函数前面没有专用前缀。 |
功能 | 函数 |
绘制球 | void auxWireSphere(GLdouble radius) void auxSolidSphere(GLdouble radius) |
绘制立方体 | void auxWireCube(GLdouble size) void auxSolidCube(GLdouble size) |
绘制长方体 | void auxWireBox(GLdouble width,GLdouble height,GLdouble depth) void auxSolidBox(GLdouble width,GLdouble height,GLdouble depth) |
绘制环形圆纹面 | void auxWireTorus(GLdouble innerRadius,GLdouble outerRadius) void auxSolidTorus(GLdouble innerRadius,GLdouble outerRadius) |
绘制圆柱 | void auxWireCylinder(GLdouble radius,GLdouble height) void auxSolidCylinder(GLdouble radius,GLdouble height) |
绘制二十面体 | void auxWireIcosahedron(GLdouble radius) void auxSolidIcosahedron(GLdouble radius) |
绘制八面体 | void auxWireOctahedron(GLdouble radius) void auxSolidOctahedron(GLdouble radius) |
绘制四面体 | void auxWireTetrahedron(GLdouble radius) void auxSolidTetrahedron(GLdouble radius) |
绘制十二面体 | void auxWireDodecahedron(GLdouble radius) void auxSolidDodecahedron(GLdouble radius) |
绘制圆锥 | void auxWireCone(GLdouble radius,GLdouble height) void auxSolidCone(GLdouble radius,GLdouble height) |
绘制茶壶 | void auxWireTeapot(GLdouble size) void aucSolidTeapot(GLdouble size) |
表6-1 |
#include "glos.h" #include <GL/gl.h> #include <GL/glaux.h> void myinit(void); void CALLBACK myReshape(GLsizei w,GLsizei h); void CALLBACK display(void); void myinit(void) { glClearColor(0.0,0.0,0.0,0.0); glClear(GL_COLOR_BUFFER_BIT); } void CALLBACK myReshape(GLsizei w,GLsizei h) { glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if(w<=h) glOrtho(-1.5,1.5,-1.5*(GLfloat)h/(GLfloat)w, 1.5*(GLfloat)h/(GLfloat)w,-10.0,10.0); else glOrtho(-1.5*(GLfloat)h/(GLfloat)w, 1.5*(GLfloat)h/(GLfloat)w,-1.5,1.5,-10.0,10.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void CALLBACK display(void) { glColor3f(1.0,1.0,0.0); auxWireSphere(1.0); glFlush(); } void main(void) { auxInitDisplayMode(AUX_SINGLE|AUX_RGBA); auxInitPosition(0,0,500,500); auxInitWindow("AUX_SAMPLE"); myinit(); auxReshapeFunc(myReshape); auxMainLoop(display); }
图6-1 网状球体 |
glMatrixMode(GL_PROJECTION); glLoadIdentity(); if(w<=h) glOrtho(-1.5,1.5,-1.5*(GLfloat)h/(GLfloat)w, 1.5*(GLfloat)h/(GLfloat)w,-10.0,10.0); else glOrtho(-1.5*(GLfloat)h/(GLfloat)w, 1.5*(GLfloat)h/(GLfloat)w,-1.5,1.5,-10.0,10.0);
图7-1 线段的两种连结方式 |
图7-2 合法和非法多边形 |
glVertex2s(2,3); glVertex3d(0.0,1.0,3.1414926535); glVertex4f(2.4,1.0,-2.2,2.0); GLfloat pp[3]={5.0,2.0,10.2}; glVertex3fv(pp);
glBegin(GL_POLYGON); glVertex2f(0.0,0.0); glVertex2f(0.0,3.0); glVertex2f(3.0,3.0); glVertex2f(4.0,1.5); glVertex2f(3.0,0.0); glEnd();
图7-3 绘制多边形或一组顶点 |
类型 | 说明 |
GL_POINTS | 单个顶点集 |
GL_LINES | 多组双顶点线段 |
GL_POLYGON | 单个简单填充凸多边形 |
GL_TRAINGLES | 多组独立填充三角形 |
GL_QUADS | 多组独立填充四边形 |
GL_LINE_STRIP | 不闭合折线 |
GL_LINE_LOOP | 闭合折线 |
GL_TRAINGLE_STRIP | 线型连续填充三角形串 |
GL_TRAINGLE_FAN | 扇形连续填充三角形串 |
GL_QUAD_STRIP | 连续填充四边形串 |
表7-1 几何图元类型和说明 |
图7-4 几何图元类型 |
函数 | 函数意义 |
glVertex*() | 设置顶点坐标 |
glColor*() | 设置当前颜色 |
glIndex*() | 设置当前颜色表 |
glNormal*() | 设置法向坐标 |
glEvalCoord*() | 产生坐标 |
glCallList(),glCallLists() | 执行显示列表 |
glTexCoord*() | 设置纹理坐标 |
glEdgeFlag*() | 控制边界绘制 |
glMaterial*() | 设置材质 |
表7-2 在glBegin()和glEnd()之间可调用的函数 |
glBegin(GL_POINTS); glColor3f(1.0,0.0,0.0); /* red color */ glVertex(...); glColor3f(0.0,1.0,0.0); /* green color */ glColor3f(0.0,0.0,1.0); /* blue color */ glVertex(...); glVertex(...); glEnd();
#include "glos.h" #include<GL/gl.h> #include<GL/glaux.h> void myinit(void); void DrawMyObjects(void); void CALLBACK myReshape(GLsizei w,GLsizei h); void CALLBACK display(void); void myinit(void) { glClearColor(0.0,0.0,0.0,0.0); glClear(GL_COLOR_BUFFER_BIT); glShadeModel(GL_FLAT); } void CALLBACK myReshape(GLsizei w,GLsizei h) { glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if(w<=h) glOrtho(-20.0,20.0,-20.0*(GLfloat)h/(GLfloat)w, 20.0*(GLfloat)h/(GLfloat)w,-50.0,50.0); else glOrtho(-20.0*(GLfloat)h/(GLfloat)w, 20.0*(GLfloat)h/(GLfloat)w,-20.0,20.0,-50.0,50.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void CALLBACK display(void) { glColor3f(1.0,1.0,0.0); DrawMyObjects(); glFlush(); } void DrawMyObjects(void) { /* draw some points */ glBegin(GL_POINTS); glColor3f(1.0,0.0,0.0); glVertex2f(-10.0,11.0); glColor3f(1.0,1.0,0.0); glVertex2f(-9.0,10.0); glColor3f(0.0,1.0,1.0); glVertex2f(-8.0,12.0); glEnd(); /* draw some line_segments */ glBegin(GL_LINES); glColor3f(1.0,1.0,0.0); glVertex2f(-11.0,8.0); glVertex2f(-7.0,7.0); glColor3f(1.0,0.0,1.0); glVertex2f(-11.0,9.0); glVertex2f(-8.0,6.0); glEnd(); /* draw one opened_line */ glBegin(GL_LINE_STRIP); glColor3f(0.0,1.0,0.0); glVertex2f(-3.0,9.0); glVertex2f(2.0,6.0); glVertex2f(3.0,8.0); glVertex2f(-2.5,6.5); glEnd(); /* draw one closed_line */ glBegin(GL_LINE_LOOP); glColor3f(0.0,1.0,1.0); glVertex2f(7.0,7.0); glVertex2f(8.0,8.0); glVertex2f(9.0,6.5); glVertex2f(10.3,7.5); glVertex2f(11.5,6.0); glVertex2f(7.5,6.0); glEnd(); /* draw one filled_polygon */ glBegin(GL_POLYGON); glColor3f(0.5,0.3,0.7); glVertex2f(-7.0,2.0); glVertex2f(-8.0,3.0); glVertex2f(-10.3,0.5); glVertex2f(-7.5,-2.0); glVertex2f(-6.0,-1.0); glEnd(); /* draw some filled_quandrangles */ glBegin(GL_QUADS); glColor3f(0.7,0.5,0.2); glVertex2f(0.0,2.0); glVertex2f(-1.0,3.0); glVertex2f(-3.3,0.5); glVertex2f(-0.5,-1.0); glColor3f(0.5,0.7,0.2); glVertex2f(3.0,2.0); glVertex2f(2.0,3.0); glVertex2f(0.0,0.5); glVertex2f(2.5,-1.0); glEnd(); /* draw some filled_strip_quandrangles */ glBegin(GL_QUAD_STRIP); glVertex2f(6.0,-2.0); glVertex2f(5.5,1.0); glVertex2f(8.0,-1.0); glColor3f(0.8,0.0,0.0); glVertex2f(9.0,2.0); glVertex2f(11.0,-2.0); glColor3f(0.0,0.0,0.8); glVertex2f(11.0,2.0); glVertex2f(13.0,-1.0); glColor3f(0.0,0.8,0.0); glVertex2f(14.0,1.0); glEnd(); /* draw some filled_triangles */ glBegin(GL_TRIANGLES); glColor3f(0.2,0.5,0.7); glVertex2f(-10.0,-5.0); glVertex2f(-12.3,-7.5); glVertex2f(-8.5,-6.0); glColor3f(0.2,0.7,0.5); glVertex2f(-8.0,-7.0); glVertex2f(-7.0,-4.5); glVertex2f(-5.5,-9.0); glEnd(); /* draw some filled_strip_triangles */ glBegin(GL_TRIANGLE_STRIP); glVertex2f(-1.0,-8.0); glVertex2f(-2.5,-5.0); glColor3f(0.8,0.8,0.0); glVertex2f(1.0,-7.0); glColor3f(0.0,0.8,0.8); glVertex2f(2.0,-4.0); glColor3f(0.8,0.0,0.8); glVertex2f(4.0,-6.0); glEnd(); /* draw some filled_fan_triangles */ glBegin(GL_TRIANGLE_FAN); glVertex2f(8.0,-6.0); glVertex2f(10.0,-3.0); glColor3f(0.8,0.2,0.5); glVertex2f(12.5,-4.5); glColor3f(0.2,0.5,0.8); glVertex2f(13.0,-7.5); glColor3f(0.8,0.5,0.2); glVertex2f(10.5,-9.0); glEnd(); } void main(void) { auxInitDisplayMode(AUX_SINGLE|AUX_RGBA); auxInitPosition(0,0,500,500); auxInitWindow("Geometric Primitive Types"); myinit(); auxReshapeFunc(myReshape); auxMainLoop(display); }
图8-1 相机模拟 |
图8-2 三维图形的显示流程 |
#include "glos.h" #include <GL/gl.h> #include <GL/glu.h> #include <GL/glaux.h> void myinit(void); void CALLBACK myReshape(GLsizei w, GLsizei h); void CALLBACK display(void); void CALLBACK display (void) { glClear(GL_COLOR_BUFFER_BIT); glColor3f (1.0, 1.0, 1.0); glLoadIdentity (); /* clear the matrix */ glTranslatef (0.0, 0.0, -5.0); /* viewing transformation */ glScalef (1.0, 2.0, 1.0); /* modeling transformation */ auxWireCube(1.0); /* draw the cube */ glFlush(); } void myinit (void) { glShadeModel (GL_FLAT); } void CALLBACK myReshape(GLsizei w, GLsizei h) { glMatrixMode (GL_PROJECTION); /* prepare for and then */ glLoadIdentity (); /* define the projection */ glFrustum (-1.0, 1.0, -1.0, 1.0, 1.5, 20.0); /* transformation */ glMatrixMode (GL_MODELVIEW); /* back to modelview matrix */ glViewport (0, 0, w, h); /* define the viewport */ } void main(void) { auxInitDisplayMode (AUX_SINGLE | AUX_RGBA); auxInitPosition (0, 0, 500, 500); auxInitWindow ("Perspective 3-D Cube"); myinit (); auxReshapeFunc (myReshape); auxMainLoop(display); }
|
||
图8-3 三维的正面透视立方体 |
图8-4 视点坐标系与世界坐标系 |
M = | | m0 m4 m8 m12 | | m1 m5 m9 m13 | | m2 m6 m10 m14 | | m3 m7 m11 M15 | |
图8-5 平移示意图 |
图8-6 旋转示意图 |
图8-7 缩放和反射示意图 |
#include "glos.h" #include <GL/gl.h> #include <GL/glu.h> #include <GL/glaux.h> void myinit(void); void draw_triangle(void); void CALLBACK display(void); void CALLBACK myReshape(GLsizei w, GLsizei h); void draw_triangle(void) { glBegin(GL_LINE_LOOP); glVertex2f(0.0, 25.0); glVertex2f(25.0, -25.0); glVertex2f(-25.0, -25.0); glEnd(); } void CALLBACK display(void) { glClearColor (0.0, 0.0, 0.0, 1.0); glClear (GL_COLOR_BUFFER_BIT); /* draw an original triangle */ glLoadIdentity (); glColor3f (1.0, 1.0, 1.0); /* white */ draw_triangle (); /* translating a triangle along X_axis */ glLoadIdentity (); glTranslatef (-20.0, 0.0, 0.0); glColor3f(1.0,0.0,0.0); /* red */ draw_triangle (); /* scaling a triangle along X_axis by 1.5 and along Y_axis by 0.5 */ glLoadIdentity(); glScalef (1.5, 0.5, 1.0); glColor3f(0.0,1.0,0.0); /* green */ draw_triangle (); /* rotating a triangle in a counterclockwise direction about Z_axis */ glLoadIdentity (); glRotatef (90.0, 0.0, 0.0, 1.0); glColor3f(0.0,0.0,1.0); /* blue */ draw_triangle (); /* scaling a triangle along Y_axis and reflecting it about Y_axis */ glLoadIdentity(); glScalef (1.0, -0.5, 1.0); glColor3f(1.0,1.0,0.0); /* yellow */ draw_triangle (); glFlush(); } void myinit (void) { glShadeModel (GL_FLAT); } void CALLBACK myReshape(GLsizei w, GLsizei h) { glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if (w <= h) glOrtho(-50.0, 50.0, -50.0*(GLfloat)h/(GLfloat)w, 50.0*(GLfloat)h/(GLfloat)w,-1.0,1.0); else glOrtho(-50.0*(GLfloat)w/(GLfloat)h, 50.0*(GLfloat)w/(GLfloat)h, -50.0, 50.0,-1.0,1.0); glMatrixMode(GL_MODELVIEW); } void main(void) { auxInitDisplayMode (AUX_SINGLE | AUX_RGBA); auxInitPosition (0, 0, 500, 500); auxInitWindow ("Geometric Transformations"); myinit (); auxReshapeFunc (myReshape); auxMainLoop(display); }
图8-8 三角形的几何变换 |
图8-9 正射投影视景体 |
图8-10 函数glFrustum()透视投影视景体 |
图8-11 函数gluPerspective()透视投影视景体 |
图8-12 附加裁剪平面和视景体 |
#include "glos.h" #include <GL/gl.h> #include <GL/glu.h> #include <GL/glaux.h> void myinit(void); void CALLBACK myReshape(GLsizei w, GLsizei h); void CALLBACK display(void); void CALLBACK display(void) { GLdouble eqn[4] = {1.0, 0.0, 0.0, 0.0}; glClear(GL_COLOR_BUFFER_BIT); glColor3f (1.0, 0.0, 1.0); glPushMatrix(); glTranslatef (0.0, 0.0, -5.0); /* clip the left part of wire_sphere : x<0 */ glClipPlane (GL_CLIP_PLANE0, eqn); glEnable (GL_CLIP_PLANE0); glRotatef (-90.0, 1.0, 0.0, 0.0); auxWireSphere(1.0); glPopMatrix(); glFlush(); } void myinit (void) { glShadeModel (GL_FLAT); } void CALLBACK myReshape(GLsizei w, GLsizei h) { glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0); glMatrixMode(GL_MODELVIEW); } void main(void) { auxInitDisplayMode (AUX_SINGLE | AUX_RGB); auxInitPosition (0, 0, 500, 500); auxInitWindow ("Arbitrary Clipping Planes"); myinit (); auxReshapeFunc (myReshape); auxMainLoop(display); }
图8-13 剪取后的网状半球体 |
图8-14 视景体到视口的映射 |
#include "glos.h" #include <GL/gl.h> #include <GL/glu.h> #include <GL/glaux.h> void myinit(void); void drawPlane(void); void CALLBACK elbowAdd (void); void CALLBACK elbowSubtract (void); void CALLBACK shoulderAdd (void); void CALLBACK shoulderSubtract (void); void CALLBACK display(void); void CALLBACK myReshape(GLsizei w, GLsizei h); static int shoulder = 0, elbow = 0; void CALLBACK elbowAdd (void) { elbow = (elbow + 5) % 360; } void CALLBACK elbowSubtract (void) { elbow = (elbow - 5) % 360; } void CALLBACK shoulderAdd (void) { shoulder = (shoulder + 5) % 360; } void CALLBACK shoulderSubtract (void) { shoulder = (shoulder - 5) % 360; } void CALLBACK display(void) { glClear(GL_COLOR_BUFFER_BIT); glColor3f(0.0, 1.0, 1.0); glPushMatrix(); glTranslatef (-0.5, 0.0, 0.0); glRotatef ((GLfloat) shoulder, 0.0, 0.0, 1.0); glTranslatef (1.0, 0.0, 0.0); auxWireBox(2.0, 0.2, 0.5); glTranslatef (1.0, 0.0, 0.0); glRotatef ((GLfloat) elbow, 0.0, 0.0, 1.0); glTranslatef (0.8, 0.0, 0.0); auxWireBox(1.6, 0.2, 0.5); glPopMatrix(); glFlush(); } void myinit (void) { glShadeModel (GL_FLAT); } void CALLBACK myReshape(GLsizei w, GLsizei h) { glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(65.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef (0.0, 0.0, -5.0); /* viewing transform */ } void main(void) { auxInitDisplayMode (AUX_SINGLE | AUX_RGBA); auxInitPosition (0, 0, 400, 400); auxInitWindow ("Composite Modeling Transformations"); myinit (); auxKeyFunc (AUX_LEFT, shoulderSubtract); auxKeyFunc (AUX_RIGHT, shoulderAdd); auxKeyFunc (AUX_UP, elbowAdd); auxKeyFunc (AUX_DOWN, elbowSubtract); auxReshapeFunc (myReshape); auxMainLoop(display); }
图8-15 简单机械手臂的符合运动 |
图9-1 计算机颜色生成原理 |
图9-2 RGB色立体 |
后缀 | 数据类型 | 最小值 | 最小值映射 | 最大值 | 最大值映射 |
b | 1字节整型数 | -128 | -1.0 | 127 | 1.0 |
s | 2字节整型数 | -32,768 | -1.0 | 32,767 | 1.0 |
i | 4字节整型数 | -2,147,483,648 | -1.0 | 2,147,483,647 | 1.0 |
ub | 1字节无符号整型数 | 0 | 0.0 | 255 | 1.0 |
us | 2字节无符号整型数 | 0 | 0.0 | 65,535 | 1.0 |
ui | 4字节无符号整型数 | 0 | 0.0 | 4,294,967,295 | 1.0 |
表9-1 整型颜色值到浮点数的转换 |
#include "glos.h" #include <GL/gl.h> #include <GL/glaux.h> void myinit(void); void InitPalette(void); void DrawColorFans(void); void CALLBACK myReshape(GLsizei w,GLsizei h); void CALLBACK display(void); void myinit(void) { glClearColor(0.0,0.0,0.0,0.0); glClear(GL_COLOR_BUFFER_BIT); glShadeModel(GL_FLAT); } void InitPalette(void) { GLint j; static GLfloat rgb[][3]={ {1.0,0.0,0.0},{1.0,0.0,0.5},{1.0,0.0,1.0},{0.0,0.0,1.0}, {0.0,1.0,1.0},{0.0,1.0,0.0},{1.0,1.0,0.0},{1.0,0.5,0.0}}; for(j=0;j<8;j++) auxSetOneColor(j+1,rgb[j][0],rgb[j][1],rgb[j][2]); } void CALLBACK myReshape(GLsizei w,GLsizei h) { glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if(w<=h) glOrtho(-12.0,12.0,-12.0*(GLfloat)h/(GLfloat)w, 12.0*(GLfloat)h/(GLfloat)w,-30.0,30.0); else glOrtho(-12.0*(GLfloat)h/(GLfloat)w, 12.0*(GLfloat)h/(GLfloat)w,-12.0,12.0,-30.0,30.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void CALLBACK display(void) { InitPalette(); DrawColorFans(); glFlush(); } void DrawColorFans(void) { GLint n; GLfloat pp[8][2]={ {7.0,-7.0},{0.0,-10.0},{-7.0,-7.0},{-10.0,0.0}, {-7.0,7.0}, {0.0,10.0},{7.0,7.0},{10.0,0.0}}; /* draw some filled_fan_triangles */ glBegin(GL_TRIANGLE_FAN); glVertex2f(0.0,0.0); glVertex2f(10.0,0.0); for(n=0;n<8;n++) { glIndexi(n+1); glVertex2fv(pp[n]); } glEnd(); } void main(void) { auxInitDisplayMode(AUX_SINGLE|AUX_INDEX); auxInitPosition(0,0,500,500); auxInitWindow("Color Index"); myinit(); auxReshapeFunc(myReshape); auxMainLoop(display); }
图9-3 自定义调色板 |
#include "glos.h" #include <GL/gl.h> #include <GL/glu.h> #include <GL/glaux.h> void myinit(void); void CALLBACK myReshape(GLsizei w, GLsizei h); void CALLBACK display(void); void myinit(void) { GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 }; glLightfv(GL_LIGHT0, GL_POSITION, light_position); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glDepthFunc(GL_LESS); glEnable(GL_DEPTH_TEST); } void CALLBACK display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); auxSolidSphere(1.0); glFlush(); } void CALLBACK myReshape(GLsizei w, GLsizei h) { glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if (w <= h) glOrtho (-1.5, 1.5, -1.5*(GLfloat)h/(GLfloat)w, 1.5*(GLfloat)h/(GLfloat)w, -10.0, 10.0); else glOrtho (-1.5*(GLfloat)w/(GLfloat)h, 1.5*(GLfloat)w/(GLfloat)h, -1.5, 1.5, -10.0, 10.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void main(void) { auxInitDisplayMode (AUX_SINGLE | AUX_RGBA); auxInitPosition (0, 0, 500, 500); auxInitWindow ("Simple Lighting"); myinit(); auxReshapeFunc (myReshape); auxMainLoop(display); }
图10-1 带光影的灰色球体 |
pname 参数名 | 缺省值 | 说明 |
GL_AMBIENT | (0.0, 0.0, 0.0, 1.0) | RGBA模式下环境光 |
GL_DIFFUSE | (1.0, 1.0, 1.0, 1.0) | RGBA模式下漫反射光 |
GL_SPECULAR | (1.0,1.0,1.0,1.0) | RGBA模式下镜面光 |
GL_POSITION | (0.0,0.0,1.0,0.0) | 光源位置齐次坐标(x,y,z,w) |
GL_SPOT_DIRECTION | (0.0,0.0,-1.0) | 点光源聚光方向矢量(x,y,z) |
GL_SPOT_EXPONENT | 0.0 | 点光源聚光指数 |
GL_SPOT_CUTOFF | 180.0 | 点光源聚光截止角 |
GL_CONSTANT_ATTENUATION | 1.0 | 常数衰减因子 |
GL_LINER_ATTENUATION | 0.0 | 线性衰减因子 |
GL_QUADRATIC_ATTENUATION | 0.0 | 平方衰减因子 |
表10-1 函数glLight*()参数pname说明 |
图10-2 Gouraud明暗处理 |
#include "glos.h" #include <GL/gl.h> #include <GL/glu.h> #include <GL/glaux.h> void myinit(void); void object(void); void CALLBACK display(void); void CALLBACK myReshape(GLsizei w, GLsizei h); /* GL_SMOOTH is actually the default shading model. */ void myinit (void) { glShadeModel (GL_SMOOTH); } void object(void) { glBegin (GL_POLYGON); glColor3f (1.0, 0.0, 0.0); glVertex2f (4.0, 4.0); glColor3f(1.0,1.0,1.0); glVertex2f (12.0, 4.0); glColor3f(0.0,0.0,1.0); glVertex2f (12.0, 12.0); glColor3f(0.0,1.0,0.0); glVertex2f (4.0, 12.0); glEnd (); } void CALLBACK display(void) { glClear (GL_COLOR_BUFFER_BIT); object (); glFlush (); } void CALLBACK myReshape(GLsizei w, GLsizei h) { glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if (w <= h) gluOrtho2D (0.0, 16.0, 0.0, 16.0 * (GLfloat) h/(GLfloat) w); else gluOrtho2D (0.0, 16.0 * (GLfloat) w/(GLfloat) h, 0.0, 16.0); glMatrixMode(GL_MODELVIEW); } void main(void) { auxInitDisplayMode (AUX_SINGLE | AUX_RGBA); auxInitPosition (0, 0, 500, 500); auxInitWindow ("Smooth Shading"); myinit(); auxReshapeFunc (myReshape); auxMainLoop(display); }
图10-3 高氏明暗处理的正方形 |
参数名 | 缺省值 | 说明 |
GL_AMBIENT | (0.2, 0.2, 0.2, 1.0) | 材料的环境光颜色 |
GL_DIFFUSE | (0.8, 0.8, 0.8, 1.0) | 材料的漫反射光颜色 |
GL_AMBIENT_AND_DIFFUSE | 材料的环境光和漫反射光颜色 | |
GL_SPECULAR | (0.0, 0.0, 0.0, 1.0) | 材料的镜面反射光颜色 |
GL_SHINESS | 0.0 | 镜面指数(光亮度) |
GL_EMISSION | (0.0, 0.0, 0.0, 1.0) | 材料的辐射光颜色 |
GL_COLOR_INDEXES | (0, 1, 1) | 材料的环境光、漫反射光和镜面光颜色 |
表10-2 函数glMaterial*()参数pname的缺省值 |
#include "glos.h" #include <GL/gl.h> #include <GL/glaux.h> void myinit(void); void CALLBACK myReshape(GLsizei w, GLsizei h); void CALLBACK display(void); void myinit(void) { /* 设置材质的各种光的颜色成分反射比率 */ GLfloat mat_ambient[]={0.8,0.8,0.8,1.0}; GLfloat mat_diffuse[]={0.8,0.0,0.8,1.0}; /* 紫色 */ GLfloat mat_specular[] = { 1.0, 0.0, 1.0, 1.0 }; /* 亮紫色 */ GLfloat mat_shininess[] = { 50.0 }; GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 }; glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient); glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess); glLightfv(GL_LIGHT0, GL_POSITION, light_position); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glDepthFunc(GL_LESS); glEnable(GL_DEPTH_TEST); } void CALLBACK display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); auxSolidSphere(1.0); glFlush(); } void CALLBACK myReshape(GLsizei w, GLsizei h) { glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if (w <= h) glOrtho (-1.5, 1.5, -1.5*(GLfloat)h/(GLfloat)w, 1.5*(GLfloat)h/(GLfloat)w, -10.0, 10.0); else glOrtho (-1.5*(GLfloat)w/(GLfloat)h, 1.5*(GLfloat)w/(GLfloat)h, -1.5, 1.5, -10.0, 10.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void main(void) { auxInitDisplayMode (AUX_SINGLE | AUX_RGBA | AUX_DEPTH16); auxInitPosition (0, 0, 500, 500); auxInitWindow ("Lighting_1 "); myinit(); auxReshapeFunc (myReshape); auxMainLoop(display); }
#include "glos.h" #include <GL/gl.h> #include <GL/glaux.h> void myinit(void); void CALLBACK myReshape(GLsizei w, GLsizei h); void CALLBACK display(void); void myinit(void) { GLfloat mat_ambient[]= { 0.8, 0.8, 0.8, 1.0 }; GLfloat mat_diffuse[]= { 0.8, 0.0, 0.8, 1.0 }; /* 紫色 */ GLfloat mat_specular[] = { 1.0, 0.0, 1.0, 1.0 }; GLfloat mat_shininess[] = { 50.0 }; GLfloat light_diffuse[]= { 0.0, 0.0, 1.0, 1.0}; /* 蓝色 */ GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 }; glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient); glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess); glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); glLightfv(GL_LIGHT0, GL_POSITION, light_position); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glDepthFunc(GL_LESS); glEnable(GL_DEPTH_TEST); } void CALLBACK display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); auxSolidSphere(1.0); glFlush(); } void CALLBACK myReshape(GLsizei w, GLsizei h) { glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if (w <= h) glOrtho (-1.5, 1.5, -1.5*(GLfloat)h/(GLfloat)w, 1.5*(GLfloat)h/(GLfloat)w, -10.0, 10.0); else glOrtho (-1.5*(GLfloat)w/(GLfloat)h, 1.5*(GLfloat)w/(GLfloat)h, -1.5, 1.5, -10.0, 10.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void main(void) { auxInitDisplayMode (AUX_SINGLE | AUX_RGBA | AUX_DEPTH16); auxInitPosition (0, 0, 500, 500); auxInitWindow ("Lighting_2 "); myinit(); auxReshapeFunc (myReshape); auxMainLoop(display); }
图10-4 光照蓝色球(高光为红色) |
#include "glos.h" #include <GL/gl.h> #include <GL/glu.h> #include <GL/glaux.h> void myinit(void); void CALLBACK display(void); void CALLBACK myReshape(GLsizei w, GLsizei h); /* 初始化z-buffer、光源和光照模型,在此不具体定义材质。*/ void myinit(void) { GLfloat ambient[] = { 0.0, 0.0, 0.0, 1.0 }; GLfloat diffuse[] = { 1.0, 1.0, 1.0, 1.0 }; GLfloat specular[] = { 1.0, 1.0, 1.0, 1.0 }; GLfloat position[] = { 0.0, 3.0, 2.0, 0.0 }; GLfloat lmodel_ambient[] = { 0.4, 0.4, 0.4, 1.0 }; glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LESS); glLightfv(GL_LIGHT0, GL_AMBIENT, ambient); glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse); glLightfv(GL_LIGHT0, GL_POSITION, position); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glClearColor(0.0, 0.1, 0.1, 0.0); } void CALLBACK display(void) { GLfloat no_mat[] = { 0.0, 0.0, 0.0, 1.0 }; GLfloat mat_ambient[] = { 0.7, 0.7, 0.7, 1.0 }; GLfloat mat_ambient_color[] = { 0.8, 0.8, 0.2, 1.0 }; GLfloat mat_diffuse[] = { 0.1, 0.5, 0.8, 1.0 }; GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 }; GLfloat no_shininess[] = { 0.0 }; GLfloat low_shininess[] = { 5.0 }; GLfloat high_shininess[] = { 100.0 }; GLfloat mat_emission[] = {0.3, 0.2, 0.2, 0.0}; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /* 第一行第一列绘制的球仅有漫反射光而无环境光和镜面光。*/ glPushMatrix(); glTranslatef (-3.75, 3.0, 0.0); glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat); glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat); glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess); glMaterialfv(GL_FRONT, GL_EMISSION, no_mat); auxSolidSphere(1.0); glPopMatrix(); /* 第一行第二列绘制的球有漫反射光和镜面光,并有低高光,而无环境光 。*/ glPushMatrix(); glTranslatef (-1.25, 3.0, 0.0); glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat); glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); glMaterialfv(GL_FRONT, GL_SHININESS, low_shininess); glMaterialfv(GL_FRONT, GL_EMISSION, no_mat); auxSolidSphere(1.0); glPopMatrix(); /* 第一行第三列绘制的球有漫反射光和镜面光,并有很亮的高光,而无环境光 。*/ glPushMatrix(); glTranslatef (1.25, 3.0, 0.0); glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat); glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess); glMaterialfv(GL_FRONT, GL_EMISSION, no_mat); auxSolidSphere(1.0); glPopMatrix(); /* 第一行第四列绘制的球有漫反射光和辐射光,而无环境和镜面反射光。*/ glPushMatrix(); glTranslatef (3.75, 3.0, 0.0); glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat); glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat); glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess); glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission); auxSolidSphere(1.0); glPopMatrix(); /* 第二行第一列绘制的球有漫反射光和环境光,而镜面反射光。*/ glPushMatrix(); glTranslatef (-3.75, 0.0, 0.0); glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient); glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat); glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess); glMaterialfv(GL_FRONT, GL_EMISSION, no_mat); auxSolidSphere(1.0); glPopMatrix(); /* 第二行第二列绘制的球有漫反射光、环境光和镜面光,且有低高光。*/ glPushMatrix(); glTranslatef (-1.25, 0.0, 0.0); glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient); glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); glMaterialfv(GL_FRONT, GL_SHININESS, low_shininess); glMaterialfv(GL_FRONT, GL_EMISSION, no_mat); auxSolidSphere(1.0); glPopMatrix(); /* 第二行第三列绘制的球有漫反射光、环境光和镜面光,且有很亮的高光。*/ glPushMatrix(); glTranslatef (1.25, 0.0, 0.0); glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient); glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess); glMaterialfv(GL_FRONT, GL_EMISSION, no_mat); auxSolidSphere(1.0); glPopMatrix(); /* 第二行第四列绘制的球有漫反射光、环境光和辐射光,而无镜面光。*/ glPushMatrix(); glTranslatef (3.75, 0.0, 0.0); glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient); glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat); glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess); glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission); auxSolidSphere(1.0); glPopMatrix(); /* 第三行第一列绘制的球有漫反射光和有颜色的环境光,而无镜面光。*/ glPushMatrix(); glTranslatef (-3.75, -3.0, 0.0); glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient_color); glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat); glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess); glMaterialfv(GL_FRONT, GL_EMISSION, no_mat); auxSolidSphere(1.0); glPopMatrix(); /* 第三行第二列绘制的球有漫反射光和有颜色的环境光以及镜面光,且有低高光。*/ glPushMatrix(); glTranslatef (-1.25, -3.0, 0.0); glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient_color); glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); glMaterialfv(GL_FRONT, GL_SHININESS, low_shininess); glMaterialfv(GL_FRONT, GL_EMISSION, no_mat); auxSolidSphere(1.0); glPopMatrix(); /* 第三行第三列绘制的球有漫反射光和有颜色的环境光以及镜面光,且有很亮的高光。*/ glPushMatrix(); glTranslatef (1.25, -3.0, 0.0); glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient_color); glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess); glMaterialfv(GL_FRONT, GL_EMISSION, no_mat); auxSolidSphere(1.0); glPopMatrix(); /* 第三行第四列绘制的球有漫反射光和有颜色的环境光以及辐射光,而无镜面光。*/ glPushMatrix(); glTranslatef (3.75, -3.0, 0.0); glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient_color); glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat); glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess); glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission); auxSolidSphere(1.0); glPopMatrix(); glFlush(); } void CALLBACK myReshape(GLsizei w, GLsizei 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); } void main(void) { auxInitDisplayMode (AUX_SINGLE | AUX_RGBA); auxInitPosition (0, 0, 600, 450); auxInitWindow ("Material"); myinit(); auxReshapeFunc (myReshape); auxMainLoop(display); }
图10-5 多种光和材质的变化效果 |
#include "glos.h" #include <GL/gl.h> #include <GL/glu.h> #include <GL/glaux.h> void myinit(void); void CALLBACK myReshape(GLsizei w, GLsizei h); void CALLBACK display(void); void myinit(void) { GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 }; glLightfv(GL_LIGHT0, GL_POSITION, light_position); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glDepthFunc(GL_LESS); glEnable(GL_DEPTH_TEST); glColorMaterial(GL_FRONT, GL_DIFFUSE); glEnable(GL_COLOR_MATERIAL); } void CALLBACK display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /* draw one yellow ball */ glLoadIdentity(); glTranslatef(-0.7,0.0,0.0); glColor3f(1.0,1.0,0.0); auxSolidSphere(0.5); /* draw one red cone */ glLoadIdentity(); glRotatef(-65.0,1.0,0.0,0.0); glTranslatef(0.7,0.0,0.0); glColor3f(1.0,0.0,0.0); auxSolidCone(0.4,0.6); glFlush(); } void CALLBACK myReshape(GLsizei w, GLsizei h) { glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if (w <= h) glOrtho (-1.5, 1.5, -1.5*(GLfloat)h/(GLfloat)w, 1.5*(GLfloat)h/(GLfloat)w, -10.0, 10.0); else glOrtho (-1.5*(GLfloat)w/(GLfloat)h, 1.5*(GLfloat)w/(GLfloat)h, -1.5, 1.5, -10.0, 10.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void main(void) { auxInitDisplayMode (AUX_SINGLE | AUX_RGB | AUX_DEPTH16); auxInitPosition (0, 0, 500, 500); auxInitWindow ("ColorMaterial Mode"); myinit(); auxReshapeFunc (myReshape); auxMainLoop(display); }
图10-6 漫反射材质改变 |
(4):我的解法
过程 :进行视角变换;进行整数化;进行邻域填补(也叫膨胀算法);进行整射投影;检索二维矩阵;逆向分析,还原单侧视图;
算法代码:
未完待续............................