推 荐 序计算机图形学已经成功应用于计算机辅助设计与制造、科学计算可视化、动画与电影制作、图形用户界面、虚拟现实等领域。特别地,ACM将2019年“图灵奖”授予Edwin E. Catmull与Patrick M. Hanrahan,以表彰其为3D计算机图形学做出的基础贡献。近年来,3D计算机图形学正在逐步被引用到以深度学习为代表的人工智能领域。因此,《3D计算机图形学基础》的出版不仅是图形学学科建设和人才培养的需求,也是相关科学技术发展的需要。 这本教材翻译自哈佛大学教授Steven J. Gortler的著作Foundations of 3D Computer Graphics。该著作于2012年由美国麻省理工学院出版社出版。该书结构颇有特色,一开始就介绍OpenGL相关知识,让学生很快可以进入高级图形编程阶段。其次,教材内容颇为丰富,不仅涉及变换、三维相机模型等基础知识,还有曲线曲面表示、高度真实感绘制部分,以及三维建模、动画等与研究生研究课题相关的高阶内容。此外,该书重视图形学重要概念的数学基础,且数形结合、图文并茂。为了帮助学生加深对计算机图形学概念的理解,书中不仅给出数学原理及公式推导,而且提供OpenGL示例代码和运行结果。因此,该书是一本颇有水准的教材,适合于研究生和高年级本科生学习3D计算机图形学的基本理论和重要算法。 译者在计算机图形学与虚拟现实领域有多年的研究经验和良好的研究基础,取得了诸多高水平研究成果,积累了丰富的计算机图形学前沿知识,也指导了多届该领域的研究生,积累了丰富的培养指导学生方面的经验。在翻译过程中,译者忠实于英文原著,保证了该教材高质量的出版。 该教材的出版必将在我国计算机图形学及相关领域优秀人才培养中发挥积极作用。 2020年7月◆3D计算机图形学基础···························································· 原书前言这本书来源于我在哈佛大学开授的计算机图形学课程。1996年至今,我教授过很多优秀的学生,也收获很多教学的乐趣。学生们在课堂上提出过很多好问题,从这些问题中,我经常意识到自己在课堂上的一些解释有点草率,而且有时并没有完全理解自己想解释的话题。这导致了我对教材的反思和未来教学的创新,并将这些新的想法融入本书中。这本书的整个课程不仅涵盖了基本知识点,还同时强调了对一些更加细节概念的理解。 在这本书中,我们将介绍生成3D计算机图形所需的基本算法与技术。我们将介绍用算法表示和处理3D形状的基本思想,以及如何使用算法模拟相机,将这些3D数据转换为由屏幕上的离散点或像素集组成的2D图像。之后,我们还将在本书中讨论一些更高级的主题,包括颜色和灯光表示的基础知识、生成照片级真实感图像的光模拟、几何建模以及生成动画图形的各种方法。 在本书中,我们将介绍API上层和下层的知识,多数内容(尤其是前序章节)是学习3D计算机图形学时需了解的基础知识。我们也介绍OpenGL的内部流程,这对于一个优秀的图形学从业者尤为必要。并且,了解计算机图形学计算设施的工作原理和工作方式本身就令人着迷。 本书不涉及计算机图形学中硬件和编译器的相关知识,也不会过度关注2D计算机图形学或人机交互接口,这些主题本身都相当有趣,但与3D计算机图形学的算法层面截然不同。 因为很多计算机图形学技术基于OpenGL,搭建一个“基于光栅化”的实时渲染环境,而不是采用诸如“基于光线跟踪”的环境,所以本书也围绕其进行讲解。广泛地讲,从事3D电子游戏领域的所有工作者均需掌握这本教材(以及更多知识)。我们特意选择了OpenGL API(基于GLSL着色语言),因为它可以跨多个计算平台运行。 ◆3D计算机图形学基础原书前言本书适用于至少有一年编程经验的计算机科学、数学、物理学专业的高年级本科生,且需要对线性代数有基本的了解。 对于授课 下面将介绍一些需要特别注意的细节问题,这些问题需要深究才能理解透彻,但是经常在教学过程中未被解释清楚,我希望学生们能在本书中掌握这些内容。 附录A: 由一个尽可能简单的OpenGL程序开始,OpenGL的用途是管理着色程序、顶点缓冲区对象和纹理。因为我们将使用现代版本的OpenGL,庆幸的是剩余需要讲授的API知识不是太多。本书不涉及任何旧版的OpenGL知识,它们并未出现在现代计算机图形学编程中。 第2~4章: 在计算机图形学中,需要从无坐标和全坐标的角度考虑点和向量。我们往往使用坐标得到一种具体的表示形式,最终生成渲染图像。但在不同坐标系下,点的表示和变换通常十分重要,需注意以下几点。 区分一个几何点和在某坐标系下表示该点的坐标。 使用符号来清晰地标记一组基,该基用于表示一组坐标系。 区分标记矩阵方程和矩阵表达式的符号,其中,矩阵方程表示基变换,矩阵表达式表示点的几何变换。 最终引出所谓的左定则(leftof rule),它可以更好地解释矩阵表达式并明确变换的基。 希望通过掌握这套清晰的符号机制,学生易于理解如何进行复杂的变换。这不同于“在程序执行正确的操作之前尝试大量排序和矩阵序列的逆运算”的方法,该想法最初源于Tony DeRose 的手稿 [16]。 第5、6章: 描述一个处理计算机图形学坐标系的组织框架,以及如何将其转换为简单的3D OpenGL代码。我们从中得出了使用“混合辅助坐标系”移动物体的有效方法。例如,这使得我们可以正确地围绕其中心旋转物体,但其方向自然对应于屏幕上的方向。 第7章: 简要介绍一个四元数表示形式以描述旋转。本书还推导了如何组合四元数和平移向量,以定义一个刚体变换数据类型,使其可以像矩阵一样进行乘法和求逆运算。 第8章: 简要介绍轨迹球和弧球旋转的接口,并说明轨迹球接口的鼠标路径无关性。 第9章: 简要介绍Bezier和CatmullRom样条。 第10~13章: 介绍使用4×4矩阵模拟相机投影的方法,以及OpenGL中特定函数的运算。特别注意为可变变量推导正确的插值公式,有关仿射函数和插值的背景拓展知识参见附录B,Jim Blinn[5]完美地解释了多数细节内容。这些章节将不再详细介绍裁剪和光栅化算法。 第14、15章: 为漫反射、反光和各向异性材料给出简单的样例着色器,以及一些高级的实时渲染技术,如多通道渲染和阴影映射。诚然,此部分过于简短,想必追求更高阶渲染技能的学生将需学习更多现代实时渲染中不断发展的技术(和技巧)。 第16~18章: 介绍使用滤波计算离散图像的原因,以及通过基函数重建连续图像的方法,特别是如何将这两个思想结合起来,以在纹理映射期间正确地获得滤波(Paul Heckbert的硕士论文[28])。该部分不深入研究傅里叶分析的细节内容,因为它偏离了本书主线(总之,最终使用盒式滤波器)。 第19章: 介绍人类色彩感知的基本理论。从数学的角度来看,我们试图明确颜色的定义,及其形成线性空间的原理,相关论述参见Feynman’s Lectures[20]。针对多数颜色计算的技术问题,本书参考了Charles Poynton对颜色常见问题的解答[58]。 第20章: 完整起见,简要介绍光线跟踪计算。由于它不是课程的重点,因此本书仅提及该主题。 第21章: 引入真实感渲染中的高阶主题,详细介绍描述光的物理单元以及反射、渲染和度量方程。例如,我们密切关注使用特定单位度量反射的原因。有关基础知识及更多内容参见Eric Veach的博士论文[71]。 第22章: 概述罗列计算机图形学中曲面的建模和表示方法。简要介绍该部分,而非技术性地讨论。我们的确探究了足够的细节,以实现CatmullRom 细分曲面(假设拥有方便的网格数据结构),因为该方法可以快速简单地表示曲面簇。 第23章: 概述计算机图形学中实现动画的方法。与上一章类似,本章仅作简单介绍,而非技术性地讨论。CMU网站上Adrien Treuille博士的动画课程可作为该领域优秀的入门资料。 本书内容丰富多彩,无法在一学期内全部教授完毕。它也并不是一本百科全书,只是试图涵盖计算机图形学理论和实践中的所有主题。此外,本书与目前广泛使用的教材较类似,不涉及一些最新的科研成果和思想,未来它们可能成为标准实践的一部分。 致谢 在编写此书的一年中,我收到了Hamilton Chong、Guillermo DiezCanas和Dylan Thurston为本书提供的大量帮助。 感谢Julie Dorsey、Hugues Hoppe、Zoe Wood、Yuanchen Zhu和Todd Zickler为本书提供的诸多宝贵建议。 感谢Gilbert Bernstein、Fredo Durand、Ladislav Kavan、Michael Kazhdan和PeterPike Sloan为本书作评。 感谢Xiangfeng Gu、Danil Kirsanov、Chris Mihelich、Pedro Sander和Abraham Stone在这门课程的设计期间给予的极大帮助。 最后,感谢在本课程中担任过助教的所有优秀学生,他们为这本教材的创新作出了许多贡献,他们是Brad Andalman、Keith Baldwin、Forrester Cole、Ashley Eden、David Holland、Brad Kittenbrink、Sanjay Mavinkurve、Jay Moorthi、Doug Nachand、Brian Osserman、Ed Park、David Ryu、Razvan Surdulescu和Geetika Tewari。···························································· 译 者 序计算机图形学是用计算机研究图形的表示、生成、处理和显示的一门计算机分支学科,已经成功应用于计算机辅助设计与制造、科学计算可视化、动画与电影制作、图形用户界面、虚拟现实等领域。作为一种计算技术,计算机图形学已经且必将继续发挥其基础性作用。 自2015年以来,译者受聘于中国科学院大学讲授研究生的专业普及课“计算机图形学”。在教学过程中,译者发现选修这门课程的研究生背景不一,并非都是计算机科学专业;即便是研究生阶段进入到计算机科学专业领域,其在本科阶段也不一定学习过图形学课程。因此,译者萌生了为这类背景不一的学生编写一本覆盖面广且基础性强的图形学教材的想法。 译者注意到了哈佛大学教授Steven J. Gortler的著作Foundations of 3D Computer Graphics。该著作于2012年由美国麻省理工学院出版社出版。该书通过一个OpenGL例子首先为读者呈现出将几何模型渲染为图像的全貌,由此介绍将几何点映射到图像像素的过程,及其相关基本概念和重要算法,包括变换和坐标系、旋转和插值、相机模型和光栅化、图像像素处理等基础知识。然后,该书介绍一些高级主题,包括高真实感渲染、几何建模、动画等内容。该书另外一个显著特点是,详细介绍图形学中重要概念的数学原理,并提供OpenGL代码和示例。因此,译者选择了翻译这本著作。读者可扫描书中的二维码观看原著中的彩色插图和参考文献。本书网址为http://www.3dgraphicsfoundations.com/code.html。 感谢Steven J. Gortler教授和麻省理工学院出版社的许可和支持。感谢清华大学出版社支持出版,并帮助译者取得了麻省理工学院出版社的翻译出版权。感谢中国科学院大学教材出版中心资助。 感谢中国科学院计算技术研究所的研究生曾士轩、王倩芸、袁宇杰参与了本书的部分翻译和校对工作。感谢清华大学出版社编辑的耐心和辛勤工作。 感谢中国工程院院士、北京航空航天大学教授赵沁平博士为本教材倾情作序。 由于译者水平有限,译文中难免有不妥之处,敬请读者批评和指正。 夏时洪高林2020年6月于北京