数学系列:数学在计算机图形学中的应用

Copyright © 1900-2016, NORYES, All Rights Reserved.

http://www.cnblogs.com/noryes/

欢迎转载,请保留此版权声明。

-----------------------------------------------------------------------------------------

 

    “学习计算机图形学需要多少的数学?”这是初学者最经常问的问题。狭义的计算机图形学指的是传统的三维建模,绘制,动画等,而广义的计算机图形学还包括计算机图像处理,视频处理,计算机视觉和机器学习等领域。

    答案取决于你想在计算机图形学领域钻研多深:

    如果仅仅使用周围唾手可得的图形软件,如Photoshop, 3D Studio Max, Maya, AutoCAD等,你不需要知道多少数学知识;通过掌握简单的概念和阅读使用教程你就能使用这些软件的基本功能;但是如果你想精通这些软件,你还是需要学习计算机图形学的一些入门知识的;

    如果想学习计算机图形学的入门知识,你至少需要掌握代数,三角学和线性代数的一些基本知识;这也是要成为图形软件高手所必需掌握的;

    如果想成为一名计算机图形学的研究工作者,那么对数学的学习将是“活到老,学到老”。重要的是,从以前看似枯燥的数学到看到它的实际应用的过程中,你会更容易享受数学的美妙。在你不断进行计算机图形学的研究的过程中,你会感觉到你的数学知识越来越不够用,从而真正理解“数学不是没有用,而是不够用!”。

 

    如果你并不特别喜欢数学,是否仍有在计算机图形学领域工作的机会?是的,计算机图形学的确有一些方面不需要考虑太多的数学问题。你不应该因为数学成绩不好而放弃它,如果你对计算机图形学具有强烈兴趣和好奇心的话,而且你还特别喜欢和擅长计算机编程的话。不过,如果学习了更多的数学知识,那么你将在研究课题上有更多的选择余地。如果你要做很好的计算机图形学的研究工作,则建议你还是多学习些数学。

    对于在计算机图形学中哪些数学才是重要的?这个问题是没有明确的答案的。这领域里不同的方面要求掌握不同的数学知识,也许兴趣将会决定了你的方向。那些基本的数学知识和分析能力是最重要的,而其他的数学则是根据你所从事的方向相关。

    下面将介绍我们认为对于计算机图形学有用的数学。别以为想成为一名计算机图形学的研究者就必须精通各门数学!在大学里,你所学的那些数学看起来都很抽象,枯燥无味,这是因为你并不知道它们的用处,甚至连讲课的老师也不知道,而你们的目的只是记住那些定理和公式,考个好分数。与大学学习数学不一样的是,你在计算机图形学的学习和研究过程中会感受到数学的用处和美妙,这时你学习数学的目的将更加明确,兴趣将更加浓厚,学习方法将更加有效。因为你是在使用数学的过程中在学习数学!想想看你是如何学会中文说话的?为了对用于计算机图形学的数学有一个全面的看法,这里特地列出了很多方面。注意,不是这里提到的每个方面你都必须熟悉,许多研究工作者从不需要考虑下面提到的某些数学知识,成功的研究者总是将某一方面的数学知识和数学工具用到极致!

    最后,虽然读了这篇文章后,你应该会对数学在计算机图形学中的应用有所了解,不过这也是一家之言。也许你应该阅读更多的此类文章,或者至少从其他从事计算机图形学工作的人那里了解不同的学习重点。

 

1、初等代数和三角学

对于计算机图形学的初学者来说,高中的代数和三角学可能是最重要的数学。日复一日,我从简单的方程解出一个或更多的根。我时常还要解决类似求一些几何图形边长的简单三角学问题。代数和三角学是计算机图形学的最基础的知识。

那么高中的几何学怎么样呢?可能让人惊讶,不过在多数计算机图形学里,高中的几何学并不经常被用到。原因是许多学校教的几何学实际上是如何建立数学证明的课程。虽然证明题对提高智力显然是有效的,但对于计算机图形学来说,那些与几何课有关的定理和证明并不常被用到。如果你毕业于数学相关领域(包括计算机图形学),就会发现虽然你在证明定理,不过这对开始学习图形学不是必要的。

如果精通代数和三角学,就可以开始读一本计算机图形学的入门书了。下一个重要的用于计算机图形学的数学——线性代数,多数此类书籍至少包含了一个对线性代数的简要介绍。

 

推荐的参考书:

Computer Graphics: Principles and Practice

James Foley, Andries van Dam, StevenFeiner, John Hughes

Addison-Wesley

 

2、线性代数

线性代数的思想贯穿于计算机图形学。事实上,只要牵涉到几何数值表示法,就常常抽象出例如x,y,z坐标之类的数值,我们称之为矢量。计算机图形学自始至终离不开矢量和矩阵。用矢量和矩阵来描述旋转,平移,或者缩放是再好不过了。高中和大学都有线性代数的课程。只要想在计算机图形学领域工作,就应该打下坚实的线性代数基础。我刚才提到,许多图形学的书都有关于线性代数的简要介绍——足够教给你图形学的第一门课。

 

3      数学分析(微积分学)

微积分学是高级计算机图形学的重要成分。如果打算学习研究图形学,我强烈建议你应该对微积分学有初步认识。理由不仅仅是微积分学是一种很有用的工具,还有许多研究者用微积分学的术语来描述他们的问题和解决办法。另外,在许多重要的数学领域,微积分学被作为进一步学习的前提。学习了基本代数之后,微积分学又是一种能为你打开多数计算机图形学与后继的数学学习之门的课程。

 

4      微分几何

微分几何学研究描述和控制光滑曲线,曲面的方程。如果你要计算出经过某个远离曲面的点并垂直于曲面的矢量(法向矢量)就会用到微分几何学。让一辆汽车以特定速度在曲线上行驶也牵涉到微分几何学。有一种通用的绘制光滑曲面的图形学技术,叫做“凹凸帖图”,这个技术用到了微分几何学。另外,要研究曲面的一些几何性质,如曲率、可展性、测地性质等,需要较多的微分几何知识。如果要着手于用曲线和曲面来创造形体(在图形学里称之为建模),你至少应该学习微分几何学的基础。

 

5      数值方法(计算方法)

几乎任何时候,我们在计算机里用近似值代替精确值来表示和操作数值,所以计算过程总是会有误差。而且对于给定的数值问题,常常有多种解决的方法,一些方法会更块,更精确或者对内存的需求更少。数值方法研究的对象包括“计算方法”和“科学计算”等等。这是一个很广阔的领域,而且我将提及的其他几门数学其实是数值方法的一些分支。这些分支包括抽样法理论,矩阵方程组,数值微分方程组和最优化。

 

推荐的参考书:

Numerical Recipes in C++: The Art ofScientific Computing

William Press, Saul Teukolsky, WilliamVetterling and Brian Flannery

Cambridge University Press

 

6      抽样法理论和信号处理

在计算机图形学里我们反复使用储存在正规二维数组里的数字集合来表示一些对象,例如图片和曲面。这时,我们就要用抽样法来表示这些对象。如果要控制这些对象的品质,抽样法理论就变得尤为重要。抽样法应用于图形学的常见例子是当物体被绘制在屏幕上时,它的轮廓呈现锯齿状的边缘。这锯齿状的边缘(被认为是“混淆”现象)是非常让人分散注意力的,用抽样法中著名的技术例如回旋,傅立叶变换,空间和频率的函数表示就能把这个现象减少到最小。这些思想在图像和音频处理领域是同样重要的。

 

推荐的参考书:

The Fourier Transform and Its Applications

Ronald N. Bracewell

McGraw Hill

 

7      矩阵计算

计算机图形学的许多问题要用到矩阵方程组的数值解法。一些涉及矩阵的问题包括:找出最好的位置与方向以使对象们互相匹配(最小二乘法),创建一个覆盖所给点集的曲面,并使皱折程度最小(薄板样条算法),还有材质模拟,例如水和衣服等。在图形学里矩阵表述相当流行,因此在用于图形学的数学中我对矩阵方程组的评价是很高的。

 

推荐的参考书:

Matrix Computations

Gene Golub and Charles Van Loan

Johns Hopkins University Press

 

8      物理学(物理模拟)

物理学显然不是数学的分支,它是自成一家的学科。但是在计算机图形学的某些领域,物理学和数学是紧密联系的。在图形学里,牵涉物理学的问题包括光与物体的表面是怎样互相影响的,人与动物的移动方式,水与空气的流动。为了模拟这些自然现象,物理学的知识是必不可少的。这和解微分方程紧密联系,我将会在下一节提到微分方程。

 

9      微分方程的数值解法(有限元方法)

我相信对于计算机图形学来说,解微分方程的技巧是非常重要的。像我们刚才讨论的,计算机图形学致力于模拟源于真实世界的物理系统。波浪是怎样在水里形成的,动物是怎样在地面上行走的,这就是两个模拟物理系统的例子。模拟物理系统的问题经常就是怎样解微分方程的数值解。请注意,微分方程的数值解法与微分方程的符号解法是有很大差异的。符号解法求出没有误差的解,而且时常只用于一些非常简单的方程。有时大学课程里的“微分方程”只教符号解法,不过这并不会对多数计算机图形学的问题有帮助。

在对物理系统的模拟中,我们把世界细分为许多表示成矢量的小元素。然后这些元素之间的关系就可以用矩阵来描述。虽然要处理的矩阵方程组往往没有很精确的解,但是取而代之的是执行了一系列的计算,这些计算产生一个表示成数列的近似解。这就是微分方程的数值解法。请注意,矩阵方程的解法与微分方程数值解法的关系是很密切的。

 

10 最优化

在计算机图形学里,我们常常为了期望的目标寻求一种合适的描述对象或者对象集的方法。例如安排灯的位置使得房间的照明看起来有种特殊的“感觉”,动画里的人物要怎样活动四肢才能实现一个特殊的动作,怎样排版才不会使页面混乱。以上这些例子可以归结为最优化问题。十年前的计算机图形学几乎没有最优化技术的文献,不过最近这个领域越来越重视最优化理论。我认为在计算机图形学里,最优化的重要性将会日益增加。

 

11 概率论与统计学

计算机图形学的许多领域都要用到概率论与统计学。当研究者涉足人类学科时,他们当然需要统计学来分析数据。图形学相关领域涉及人类学科,例如虚拟现实和人机交互(HCI)。另外,许多用计算机描绘真实世界的问题牵涉到各种未知事件的概率。两个例子:一棵成长期的树,它的树枝分杈的概率;虚拟的动物如何决定它的行走路线。最后,一些解高难度方程组的技巧用了随机数来估计方程组的解。重要的例子:蒙特卡罗方法经常用于光如何传播的问题。以上仅是一部分在计算机图形学里使用概率论和统计学的方法。

另外,在机器学习和统计学习中,需要非常多和深入的统计学知识。

 

12 拓扑学

用一句话来形容拓扑学,它研究油炸圈饼与咖啡杯为什么在本质上是相同的。答案是他们都是只有一个洞的曲面。对于计算机图形学来说,拓扑学的形式(符号表示法)是表达思想的简便方法,常用于分析一些曲面的性质,在形状分析、形状匹配和搜索中得到应用。

 

13 黎曼几何

黎曼几何是研究流形曲面上的微积分与微分几何。不同于三维欧氏空间,它研究的曲面是在流形曲面上,其中用到不同的度量。这部分数学知识有点抽象,但是同样有效地被用到计算机图形学中。如共形几何理论就被发展起来在计算机图形学中得到广泛的应用。

 

14 抽象代数

抽象代数就是研究群论,环论和域的代数学。相对于线性代数,内容也比较抽象。在计算机图形学上也时有用到。

 

15 计算几何

计算几何学研究如何用计算机高效地表示与操作几何体。典型问题如,碰撞检测,把多边形分解为三角形,找出最靠近某个位置的点,这个学科包括了运算法则,数据结构和数学。图形学的研究者,只要涉足创建形体(建模),就要大量用到计算几何学。

 

推荐的参考书:

Computational Geometry in C

Joseph O'Rourke

Cambridge University Press

 

Computational Geometry: An Introduction

Franco Preparata and Michael Shamos

Springer-Verlag

 

16 其他几何学

一些其他的几何学,如仿射几何、射影几何在计算机图形学的某些问题上用得比较多,对工程具有较大的促进应用。

 

17 总结:数学应用和数学理论

对于图形学来说,以上提到的许多数学学科都有个共同点:比起这些数学的理论价值,我们更倾向于发掘它们的应用价值。不要惊讶。计算机图形学的许多问题和物理学者与工程师们研究的问题是紧密联系的,并且物理学者与工程师们使用的数学工具正是计算机图形学研究者们使用的。多数研究纯数学理论的学科从不被用于计算机图形学。不过这不是绝对的。请注意这些特例:分子生物学正利用节理论来研究DNA分子动力学,亚原子物理学用到了抽象群论。也许有一天,纯数学理论也能推动计算机图形学的发展,谁知道呢?

事实上,文章中所提到一些数学分支,按照我国的教育体制,在数学系本科的学生(或者硕士研究生阶段的理工科学生)基本都能接触到。但是大学所学习的数学比较偏重于证明以构建完备的数学理论框架,而不太注重实际的使用,现在的大学教师授课的方式也是这样。

我认为,学习数学最好的方式就是使用它,使用它越多,你就觉得它越有用,越有趣,学得就越好,也越快,越扎实。当然,很少有人能精通全部的知识,对于计算机图形学的学习和实践,应当采取掌握较为宽广的数学知识基础,在需要的时候,对相关的数学知识再进行深入的学习和挖掘;不要因为自身数学知识的匮乏而沮丧,更不能因此而敌视数学,保持对计算机图形学强烈的兴趣和乐观上进的学习态度是学习计算机图形学的关键。

还有一点需要指出的是,在学习计算机图形学的过程中,你会发现各个方面的数学知识都会被用到,因此你掌握的数学知识会比较全面,也知道如何在实际中应用。这可能是应用数学在所有学科得到最好的体现。相反,一些做纯理论的数学工作者,掌握的数学知识就是他们所研究的一块,而对其他的数学知识掌握得就不够好,他们做得比较深入。当然,做应用数学和理论数学都有值得敬仰的地方,一个侧重在实际应用,而另一个侧重在理论深度,但要做好都不是很容易。数学说到底还是要学老用的。相对来讲,做计算机图形学能看到学到的数学在实际中所用了,“所用即所学”。试想一下,当你能看到自己做的美妙的东西被别人看到且被敬仰的时候,你的成就感一定会很大!

最后说一点的就是,学习计算机图形学和从事计算机图形学的研究,除了数学基础外,还需要较强的计算机编程能力,你务必要掌握和熟练一门编程语言,一般建议C/C++,因为你要实现出你的想法,你必须编程去实现出来,做出漂亮的结果。编程也是很有趣的,只要你有兴趣,提高是非常快的!当然,这里我不阐述如何提高编程的能力和水平的方法。“数学”和“编程”,两手都要抓,两手都要硬!提醒大家一点的是,如果你对编程兴趣不大,或者就不愿编程,那你就不适合选择计算机图形学,可能更适合选择其他方向,比如统计学或理论数学。

 

注:

本文由Greg Turk. “Mathematics forComputer Graphics, August 1997.” 及网上的中文翻译整理扩充而得。

 

18 进阶

作者:Dahua

 

感觉数学似乎总是不够的。这些日子为了解决research中的一些问题,又在图书馆捧起了数学的教科书。从大学到现在,课堂上学的和自学的数学其实不算少了,可是在研究的过程中总是发现需要补充新的数学知识。Learning和Vision都是很多种数学的交汇场。看着不同的理论体系的交汇,对于一个researcher来说,往往是非常exciting的enjoyable的事情。不过,这也代表着要充分了解这个领域并且取得有意义的进展是很艰苦的。记得在两年前的一次blog里面,提到过和learning有关的数学。今天看来,我对于数学在这个领域的作用有了新的思考。对于Learning的研究,

 

1、Linear Algebra (线性代数) 和 Statistics (统计学) 是最重要和不可缺少的。这代表了Machine Learning中最主流的两大类方法的基础。一种是以研究函数和变换为重点的代数方法,比如Dimension reduction,feature extraction,Kernel等,一种是以研究统计模型和样本分布为重点的统计方法,比如Graphical model, Information theoretical models等。它们侧重虽有不同,但是常常是共同使用的,对于代数方法,往往需要统计上的解释,对于统计模型,其具体计算则需要代数的帮助。以代数和统计为出发点,继续往深处走,我们会发现需要更多的数学。

 

2、Calculus (微积分),只是数学分析体系的基础。其基础性作用不言而喻。Learning研究的大部分问题是在连续的度量空间进行的,无论代数还是统计,在研究优化问题的时候,对一个映射的微分或者梯度的分析总是不可避免。而在统计学中,Marginalization和积分更是密不可分——不过,以解析形式把积分导出来的情况则不多见。

 

3、Partial Differential Equation (偏微分方程),这主要用于描述动态过程,或者仿动态过程。这个学科在Vision中用得比Learning多,主要用于描述连续场的运动或者扩散过程。比如Level set, Optical flow都是这方面的典型例子。

 

4、Functional Analysis (泛函分析),通俗地,可以理解为微积分从有限维空间到无限维空间的拓展——当然了,它实际上远不止于此。在这个地方,函数以及其所作用的对象之间存在的对偶关系扮演了非常重要的角色。Learning发展至今,也在向无限维延伸——从研究有限维向量的问题到以无限维的函数为研究对象。Kernel Learning 和 Gaussian Process 是其中典型的例子——其中的核心概念都是Kernel。很多做Learning的人把Kernel简单理解为Kernel trick的运用,这就把kernel的意义严重弱化了。在泛函里面,Kernel (Inner Product)是建立整个博大的代数体系的根本,从metric, transform到spectrum都根源于此。

 

5、Measure Theory (测度理论),这是和实分析关系非常密切的学科。但是测度理论并不限于此。从某种意义上说,Real Analysis可以从Lebesgue Measure(勒贝格测度)推演,不过其实还有很多别的测度体系——概率本身就是一种测度。测度理论对于Learning的意义是根本的,现代统计学整个就是建立在测度理论的基础之上——虽然初级的概率论教科书一般不这样引入。在看一些统计方面的文章的时候,你可能会发现,它们会把统计的公式改用测度来表达,这样做有两个好处:所有的推导和结论不用分别给连续分布和离散分布各自写一遍了,这两种东西都可以用同一的测度形式表达:连续分布的积分基于Lebesgue测度,离散分布的求和基于计数测度,而且还能推广到那种既不连续又不离散的分布中去(这种东西不是数学家的游戏,而是已经在实用的东西,在Dirchlet Process或者Pitman-Yor Process里面会经常看到)。而且,即使是连续积分,如果不是在欧氏空间进行,而是在更一般的拓扑空间(比如微分流形或者变换群),那么传统的黎曼积分(就是大学一年级在微积分课学的那种)就不work了,你可能需要它们的一些推广,比如Haar Measure或者Lebesgue-Stieltjes积分。

 

6、Topology(拓扑学),这是学术中很基础的学科。它一般不直接提供方法,但是它的很多概念和定理是其它数学分支的基石。看很多别的数学的时候,你会经常接触这样一些概念:Open set / Closed set,set basis,Hausdauf, continuous function,metric space,Cauchy sequence, neighborhood, compactness, connectivity。很多这些也许在大学一年级就学习过一些,当时是基于极限的概念获得的。如果,看过拓扑学之后,对这些概念的认识会有根本性的拓展。比如,连续函数,当时是由epison法定义的,就是无论取多小的正数epsilon,都存在xxx,使得xxx。这是需要一种metric去度量距离的,在general topology里面,对于连续函数的定义连坐标和距离都不需要——如果一个映射使得开集的原像是开集,它就是连续的——至于开集是基于集合论定义的,不是通常的开区间的意思。这只是最简单的例子。当然,我们研究learning也许不需要深究这些数学概念背后的公理体系,但是,打破原来定义的概念的局限在很多问题上是必须的——尤其是当你研究的东西它不是在欧氏空间里面的时候——正交矩阵,变换群,流形,概率分布的空间,都属于此。

 

7、Differential Manifold (微分流形),通俗地说它研究的是平滑的曲面。一个直接的印象是它是不是可以用来fitting一个surface什么的——当然这算是一种应用,但是这是非常初步的。本质上说,微分流形研究的是平滑的拓扑结构。一个空间构成微分流形的基本要素是局部平滑:从拓扑学来理解,就是它的任意局部都同胚于欧氏空间,从解析的角度来看,就是相容的局部坐标系统。当然,在全局上,它不要求和欧氏空间同胚。它除了可以用于刻画集合上的平滑曲面外,更重要的意义在于,它可以用于研究很多重要的集合。一个n-维线性空间的全部k-维子空间(k

 

8、Lie Group Theory (李群论),一般意义的群论在Learning中被运用的不是很多,群论在Learning中用得较多的是它的一个重要方向Lie group。定义在平滑流形上的群,并且其群运算是平滑的话,那么这就叫李群。因为Learning和编码不同,更多关注的是连续空间,因为Lie group在各种群中对于Learning特别重要。各种子空间,线性变换,非奇异矩阵都基于通常意义的矩阵乘法构成李群。在李群中的映射,变换,度量,划分等等都对于Learning中代数方法的研究有重要指导意义。

 

9、Graph Theory(图论),图,由于它在表述各种关系的强大能力以及优雅的理论,高效的算法,越来越受到Learning领域的欢迎。经典图论,在Learning中的一个最重要应用就是graphical models了,它被成功运用于分析统计网络的结构和规划统计推断的流程。Graphical model所取得的成功,图论可谓功不可没。在Vision里面,maxflow (graphcut)算法在图像分割,Stereo还有各种能量优化中也广受应用。另外一个重要的图论分支就是Algebraic graph theory (代数图论),主要运用于图的谱分析,著名的应用包括Normalized Cut和Spectral Clustering。近年来在semi-supervised learning中受到特别关注。

 

 

 

 

posted @ 2016-07-28 09:47  朔方  阅读(6059)  评论(0编辑  收藏  举报