最近10年,计算机图形学有着异常的发展,从二维(2D)图形进步到复杂的、高质量的三维(3D)的环境。在娱乐方面,电影和计算机游戏中广泛地使用计算机图形学。动画片发展到完全靠计算机制作。甚至非动画片也主要依靠计算机图形学去开发特定的效果。例如,20世纪70年代中期电影“星球大战”的成功就是个证明。个人计算机图形和家庭游戏控制器的能力现在已经改进扩展到了低价系统也有能力每秒显示数百万个多边形。
计算机图形学在非娱乐方面也有重要应用。例如,在学习训练中经常使用虚拟现实系统。对于科学计算可视化和计算机辅助设计(CAD),计算机图形学是一种不可缺少的工具。我们需要有很好的方法,以便直观地显示大量数据集和大规模的科学仿真结果。
自从计算机出现以来,20世纪60年代初就开始热起来的计算机图形学的艺术和科学已经很有进展。计算机图形学发展成一个丰富多彩,深奥且有吸引力的领域。本书的目的瞄准计算机图形学的数学基础,并用OpenGL编程做具体介绍。我深信对于计算机图形学的任何一种高级应用,懂得数学的基础知识都是很重要的。为此,本书试图做到完全覆盖计算机图形学的基础数学知识。此原则指导着本书的选材,选用对计算机图形学的从业者,尤其是对软件开发有实际重要意义的话题。我希望本书对用在该领域的标准工具,尤其是对这些工具背后的数学理论,做全面的介绍。
关于本书
本书计划的形成是依据我作为一个数学学术研究者的个人经验和在多个应用计算机项目,包括计算机游戏和虚拟现实等项目的实践。当我在San Digo加州大学(UCSD)给一个数学班讲授计算机图形学和几何时,就开始写本书。构成该课程的内容包括介绍用OpenGL编写三维图形学程序和计算机图形学的数学基础知识。在教授这门课程中,我确信需要这样一本书,来介绍计算机图形学的基础数学理论。
写此书的另一动力是我涉及一些虚拟现实和计算机游戏的项目。本书中所包含的许多话题作为主要内容提出,其原因是我发现它们常用在计算机游戏应用程序中。当前计算机游戏和虚拟现实应用程序是技术上要求很多的软件项目:这些应用程序要求软件能够显示令人信服的三维环境。通常,应用程序必须保持跟上多个目标的运动;维持住主要目标的有关光照,色彩和纹理等信息;并在屏幕上以每秒30或60帧显示。此外,需要相当高的艺术性和创造性的技巧来做成为一种适宜的三维环境。毫不奇怪,这要求由大量程序员、艺术家和设计师进行成熟的软件开发。
3D计算机图形学要求很宽广的数学,这或许有点令人感到惊讶。然而,这是客观存在的事实。而且,数学趋向于高雅和跨学科。计算机图形学需用数学知识使来自各个领域的构造和方法组成在一起。这些领域包括:几何学、计算方法、线性代数、数值分析、抽象代数、数据结构和算法。实际上,计算机图形学是数学的组合性和优雅性应用的最好佐证。
本书呈现了应用和理论主题的结合。在更多的地方,我建议采用OpenGL,它是一种对3D图形非常有用的、自由的、跨平台的编程环境。本书给出了可以免费因特网下载的OpenGL程序的C和C++代码,并介绍OpenGL如何实现本书所讨论的许多数学概念。本书还描述了一个光线追踪软件包;该软件包也可以从因特网络下载。在理论方面,本书强调计算机图形学的数学基础,远超过我所见到的任何其他教材。对于有可能使用的诸如OpenGL或Direct3D这类工具,或者稍微扩展,CAD程序,我深信计算机图形学的数学基础知识都是相当重要的。
在本书中,所选择数学主题依据是它们对于图形学的重要性和相关性。当然,如果对计算机图形学很关键的概念,例如,等轴测坐标的投影几何表示,我会毫不犹豫地介绍。如果你要正确地使用计算机图形软件技术,良好的数学知识使无价的,如果你要开发新的或有创造性的使用计算机图形学,很好数学知识就更重要。
如何使用本书
本书侧重于作为教科书,作为自学的材料或是参考资料使用。特别强调建议你试运随本书提供的程序,写一些你自己的OpenGL程序。请注意,本书最好与一本介绍用OpenGL编程的书联系一起读。OpenGL Programming Guide(Woo et al., 1999)是学习OpenGL的好资料,有时也称该书为红皮书(“red book”)。如果你是初次学习OpenGL, OpenGL Programming Guide也许是有点令人气馁。若是如此,OpenGL SuperBible(wright Jr., 1999)介绍OpenGL所需的数学知识更少些。另一本书OpenGL A Primer(Angel, 1999)也对OpenGL进行了很好的综述。本书的概要如下所述。按覆盖一个课程所需材料多少来安排章节。当然不需要依次读这些材料。实际上,除了第8章依赖于第7章之外,较后面的章节可以大量地单独地阅读。
第1章引言,介绍计算机图形学的基本概念;绘制点、线和多边形;以多边形来造型;动画;OpenGL编程入门。
第2章变换与视图,讨论绘制流水线,线性和仿射变换,二维和三维矩阵,平移和旋转,homogeneous坐标,在OpenGL中的变换,正交视图和透视变换,投影几何,像素化,Gouraud和扫描线插值,Bresenham 算法。
第3章光照、亮度和着色,发表Phong光照模型;周围环境光,漫反射和镜面反射;在OpenGL中的光照和物质属性;CookTorrance光照模型。
第4章均值与插值,提出线性插值;重心坐标,双线性插值,凸面,双曲线插值,球面的线性插值。这是较多数学的一章,带有在本书其他地方用到的许多工具。在初次读时,你也许希望跳过本章好多地方,当需要时再回来读。
第5章纹理映射,讨论纹理和纹理坐标,映射,超采样和颤动,撞击映射,环境映射,以及OpenGL中的纹理映射。
第6章色彩,色彩感知的发表,加和减色彩,RGB和HSL色彩的表达。
第7章贝塞尔曲线,三阶和通用阶次的贝塞尔曲线;De Casteljau 方法;细分;分段贝塞尔曲线;Hermite 多项式;贝塞尔曲面片;OpenGL中的贝塞尔曲线;有理贝塞尔曲线;圆锥曲线段,阶次的提高;CatmullRom, BesselOverhauser插值,紧张连续性斜偏的样条;贝塞尔曲面插入。
第8章B样条曲线,描述规则的和不规则的B样条及其特性,OpenGL中的B样条,de Boor 算法,Blossoms,平滑特性,有理的B样条(NURBS),圆锥形截面,结点插入,贝塞尔曲线的关系,以及用B样条曲线插入。本章混合有介绍性话题和较专业化话题。我们给全部证明,但建议在初次读时跳过这些证明。
第9章光线跟踪,提出递归光线跟踪、反射和透射,分布式光线跟踪,逆向光线跟踪,还有逃离以及避免光线跟踪的技巧。
第10章相交测试,描述与球面、平面、三角形,多边行及其他面的相交测试,和体边界寻址,还有修枝相交测试。
第11章辐射度,给出路径,组成因子,以及辐射度公式;半立方体方法;Jacobi, GaussSeidel和Southwell重复方法
第12章动画与运动学,讨论关键帧,灵活地移入和灵活地移出,定方位表达方式,公式,插入公式,有关节刚性多形体的向前和反向的运动学。
附录A数学背景,复习矢量,矩阵,线性代数和计算。
附录B射线追踪软件包,介绍光线跟踪软件包。该软件可免费下载。
练习题分散在书中,尤其在更多介绍性章节。常提供提示,不是非常困难。特别建议你做练习以便理解教材。书中少数章节,还有一些定理,证明和练习都给标有星号(*)。这表示这些内容是可选,不太重要或者可以安全地跳过去,不会影响你理解书中其他部分。定理、推论、插图和练习按每章分别编号。
获取有关的软件
书中讨论的所有软件实例都可以从网络下载,其网址为:
http://math.ucsd.edu/~sbuss/Mathcg/
该软件作为源文件和PC可执行的文件是可用的。此外,完全的Microsoft Visual C++项目文件也是可用的。
该软件包含有一些小的OpenGL的程序和一个相关的大的光线跟踪软件包。除了在商业产品或实体化项目类使用必须得到许可之外,使用该软件不受任何限制。
以OpenGL开始
OpenGL是绘制3D图形的API(应用程序设计接口)独立平台。使用OpenGL的一个大优点在于它是得到广泛支持的工业标准。其它3D环境,例如著名的Direct3D,有类似的能力;然而,Direet3D是专门针对Microsoft Windows 操作系统的。
正式的OpenGL网址是http://www.opengl.org。这网址有大量的资料,但若你正开始学习OpenGL,更多有用的资料也许是教材和代码实例,可用到:
http://www.opengl.org/developers/code/tutorials.html
按此文本用OpenGL Utility Toolkit 子程序支持OpenGL程序,简称为GLUT,它被广泛地使用,提供一个使用简便的接口,适于控制OpenGL窗口和处理简单的用户输入。你通常需要从其余的OpenGL文件安装GLUT文件
如果你正用Microsoft Visual C++,那么,OpenGL头文件和库文件由Visual C++包含。当然,你自己必需下载GLUT文件。OpenGL也可用其他的开发环境,例如,Borland C++的编译器。
下载来自Nate Robin的,适于Windows 操作系统的GLUT最近版本的正式的OpenGL可用网址是:
http://www.xmission.com/~nate/glut.html
为了在Windows机器上安装需要的GLUT,你应该像其他OpenGL头文件,如glu.h一样,将头文件glut.h放在该同一目录中。同样还应该将glut32.dll文件和glut32.lib放在与OpenGL相关文件glu32.dll文件和glu32.lib同一目录中。
OpenGL和GLUT也工作在其它各种不同类型操作系统下。我并未试过所有这些操作系统,但列出其中特别突出的一些,作为读者试图在其他环境中运行OpenGL的目标(当然,在软件开发领域,经常发生变化,因此,这些连接也许很快变得过时)。
对于Macintosh 计算机,你可以在如下Apple计算机网站找到有关OpenGL和GLUT库的信息:
http://developer.apple.com/opengl/
OpenGL和GLUT也工作在Cygwin系统下。它实现一个Windows下类似Unix开发环境。Cygwin方面可用信息在
http://cygwin.com/ 或http://sources.redhat.com/cygwin/
适于Sun Solaris系统的OpenGL可从如下网站得到:
http://www.sun.com/software/graphics/OpenGL/
有一个OpenGL兼容的系统Mesa3D可从 http://www.mesa3d.sourceforge.net/ 得到。在各种操作系统中,包括Linux,并且支持一图形包变种。
其他计算机图形资源
你也许希望以计算机图形学方面其他信息原始资料来补充本书。一本更好理解的教科书是Foley等写的书(1997)。另一本非常出色的书是Mller和Haines的书(1999)。Blinn(1996, 1998)和Glassner(1999)写的文章也很有趣。
最后,在internet网络上庞大的有关计算机图形学的理论和实践所有信息是很有用的。你可以在这儿找到OpenGL程序实例和有关图形硬件以及理论和数学的发展。通过你所喜爱的搜索引擎可找到许多这类东西,但你也许可以用ACM Transactions on Graphics 网站 http://www.acm.org/tog/ 作为起点。
关于指导书
此书的本意是用于先进的低年级或高年级大学生课程或引导性的研究生课程。它是基于我在提高班和研究生班所讲授的计算机图形学的大部分内容。在两季度大学生课程中,包括本书中的大部分材料,或多或少依次出现于此。某些更高级话题应跳过去,然而,更著名的CookTorrance光学模型和双曲线插补,某些Bézier和B样条曲线和面片最好从大学生课程中略去。我在大学生课程中也不包含更难的证明。
明确地推荐学生学习本书得到有关用OpenGL编程。虽然本书含有大量OpenGL大纲式资料,学生会还需有一个另加的原材料以便学习用OpenGL编程的细节。编程必需有些C,C++或Java方面经验(当我们写到此,对于Java没有标准化的OpenGL API,然而,Java非常接近C或C++,学生确实可以做到为精通包含这文本的简单程序所需转换)。我自己课程的第一季度包含有编程功课,首先在于二维图形;其次是基于solar系统三维图形变换练习;第三是多边形造型(要学生画出图1.11中那样的圆环);第四另加材料和对场景的光照;最后,自选的内容,学生们从中选择一个他们自己的设计作业。课程的第二季度包含有用Bézier面片造型物体功课(利用Blinn的文章(1987)如何构造Utah茶壶对此是有帮助的),写一个程序,用鼠标拾取插补点画CatmullRom和Overhauser样条曲线;用计算机辅助设计程序3D Studio Max(本书并不包含任何有关如何使用CAD程序的材料);用由本书所补充的光线跟踪软件;实现分布式光线跟踪的某些外观;然后,以他们所选择另一个期末考试作业作为结束。通过课程的资料可在网络上从我的主页http://math.ucsd.edu/~sbuss/中找到。
致谢
本书中非常少材料是原创的。原创的最主要考虑在于组织和陈述方面;有些地方,我试图提出新的,比那些以往已知的更为简单的证明。提出的材料往往缺乏缘由和可信度的,但在大多数情况下,这些材料来自其他人的。我已包含了我通过请教原创作者所学习过的项目的参考文献和原创性资源很容易探知的题目的参考文献。当然,在课程可信度方面,我并不试图过多理会。
我从一些原材料学习计算机图形学。首先,我在SAIC与一些人,包括Tom Yonkman及其夫人,Teresa Buss,Subsequently等一起做计算机图形学课题。我曾在Angel Studics从事多年的计算机游戏应用程序工作,在那儿从Steve Rotenberg,Brad Hunt,Dave Etherton,Santi Sacerra,Nathhan Brown,Ted Carson,Daniel Slumenthaly及其他人学习到大量东西,受益良多。我尤其从Steve Rotenberg受惠,他是我在计算机图形学方面高级课题及当前研究工作中的导师。
我在UCSD教了几个学期计算机图形学,在各个学期分别使用了由Watt和 Watt (1992),Watt(1993),以及Hill(2001)写的教科书。本书写作来自教这些班时所做的笔记。
本书早期草稿的通篇校对,我大大地受惠于Frank Chang和Malachi Pust。此外,我得感谢Michaei Bailey,Stephanic Buss(我的导师),Chris Calabro,Joseph Chow,Daniel Curtis,Tamsen Dunu,Rosalie Iemhoff,Cyrus Jam,JinSu Kim,Vivek Manpuria,JangWon Oh,Horng Bin Ou,Chris Pollett,John Rapp,Don Quach,Daryl Sterlion,Aubin Whitley,以及订正本书初步草稿的不知名审阅者。我还得感谢Cambridge University Prees 拷贝编辑和排版。我多么希望避免所有留下的错误都是我自己的责任。
本书中的插图是借助于一些软件系统精制的。这些主要插图使用Zandt的 patrick宏软件包LATEX来生成。一些插图使用Geuzaine的程序修改版GL2PS来生成,以便将OpenGL图像转换成PostScript文件。少量插图从屏幕截取的位图来生成,并用Adobe Photoshop转换成PostScript图像。
