如何自学《计算机图形学》

& C++面向对象编程?

刘利刚

中国科学技术大学

http://staff.ustc.edu.cn/~lgliu


【注】 本文笔者的经验之谈,仅供参考。


 

 一、动机(WHY

1. 为何学习C++编程语言?

编程语言有很多,越来越多的编程语言(比如Python, Java, JS, GO等)上手越来越容易。C/C++作为直接能与硬件打交道的编程语言,仍然成为一些领域(比如计算机图形学、GPU编程、Unity3D游戏开发等)的必须学习和使用的编程语言。

 

2. 同时学习《计算机图形学》和C++面向对象编程

计算机图形学有着广泛的应用以及无穷的潜力(见笔者撰写的科普文章《什么是计算机图形学?》)。笔者一直从事和热爱计算机图形学的教学和科研工作。从事计算机图形学相关的工作大部分都需要使用C++语言进行算法实现及研发(当然也有使用其他语言或Matlab来从事科研工作的)。笔者在长期教学和科研的过程中摸索出一套在学习《计算机图形学》的过程中同时学习和掌握C++面向对象编程的行之有效的方法,这是一举两得的过程。

 

3. 你能学到什么?

上面所述的“一举两得”的学习方法,可以通过学习笔者所讲授的

2020年中国科学技术大学《计算机图形学》本科课程

来实现。通过学习该课程,你能够迅速学习和掌握C++面向对象编程思想以及计算机图形学的基础内容,包括:

(1)    C++面向对象编程思想(封装、继承、多态)和方法;

(2)    VS编程环境、cmake编程配置、QT图形编程;

(3)    图像编程,OpenCV入门;

(4)    计算机图形学的基本内容和算法实现(包括极小曲面、曲面参数化、布料仿真、GPU Shader编程、光路追踪渲染等)。

 

4. 需要什么样的基础?

该课程面向的学生大多数是数学系的本科学生,也有不少非数学系(比如计算机、信息、物理、工程等)的学生,都是适合的。

 

有些学生学习过C语言;有些连C语言都没学过,直接学习C++的。只要对编程有兴趣(至少不反感),而且愿意去实践琢磨的同学,都能在1-2个月内掌握C++面向编程思想的。

 

只要学习方法正确,学习之路并不遥远。

 

二、方法(HOW

 1. 学习方法

任何编程语言是相通的,学习起来并不困难,关键要有方法。“方法不对,努力白费”,学习方法到位,学习起来效率和速度就会快很多。

 

最有效的学习方法就是面向任务的学习。因此,笔者在《计算机图形学》课程中将图形学的一些基本知识点和技术点精心设计成若干个作业任务,从简单到复杂,循序渐进。 每个作业都能让你通过完成作业的过程中学习和掌握一些基本知识点和技能。后一个作业是在前一个作业的基础上增加了少许的新任务,让你通过努力能够“够得着”,而不会跨越太大而沮丧和失去信心。通过这一系列的作业,能够不断让你能掌握越来越多的知识点和技术点。

 

2. 学习过程

简而言之,学习方法是“面向任务的学习” 。然后就是简单的学习过程:实践、实践、实践... 你只要通过自己的努力(思索、探索、实践)、逐个去完成这些作业的任务,解决这些任务中出现的问题,就能掌握C++编程以及计算机图形学的基本知识和技能。

 

任何知识和方法,如果不自己去尝试与实践,都无法成为自己的技能和能力的。因此,你必须跟着课程的作业,一个一个地去做。对每个作业,先不要看参考代码或优秀代码,须经过自己的独立思考和实践去完成。如遇到困难的,可以先通过查找书籍、网络搜索等方式,自己去解决。亦或询问周边有经验的同学或助教等,他们的“点拨”能够让你对深陷问题的你恍然大悟。

 

当你不断通过自己的努力解决了这些任务和困难,你就有不断的成就感和“愉悦的心流”,也就不断地有了自信,你就能明显看到自己的成长和进步。

 

许多同学都是通过自学,通过观看课程的视频及完成作业的方式,学习了计算机图形学及掌握了C++面向对象编程,在2-3个月内迅速提升了编程能力,同时对计算机图形学产生了浓厚的兴趣。这已经是得到无数案例的证明!他们行,你也一定行!

 

3. 学习误区

编程可以看成是一种技能,比学习数学要容易得多。就像要学习游泳那样,你必须跳到水里去折腾、琢磨、实践,才能学会。光学习理论的知识而不去下水实践,是永远学不会游泳。

 

因此,切不可啃着编程的教材或书籍,每个语法点、知识点要学得很透后才敢去编程。这个跟学习数学是不一样的。一定要边做边学,对不懂的地方通过查找教材或资料及时解决。围绕着作业的目标去将相关的知识点学会并琢磨透,对于暂时用不着的知识点不必花太多时间去学习(可能后面的作业会涉及到,等到后面做作业的时候再去深入学习和琢磨)。随着你做的作业任务或其他项目的不断增加,你就会学到越来越多的知识与技能。

 

三、行动(WHAT

 1.      C++基本知识(1-2周)

先找一本合适的教材(不用多,1本经典的教材即可),对C++的基本语法大致过一遍,或者跟着做少量的练习即可,切不可咬文嚼字地去深挖语法。这样对其有所宏观的了解,知道在教材的哪一章节有哪些知识点,将这些“知识指针”记住即可。

 

2.      类的封装及STL1-2周)

完成“C++课前热身练习”,该练习由5-6个小练习构成。务必一个一个独立练习,再与参考代码进行对比学习。

 

这些练习的逻辑是:

(1)    先通过封装一个数组的对象,掌握动态内存分配与管理、类的构造与析构函数、运算符重载等;

(2)    改进上一个数组对象,不改变接口,改进接口的实现方法,提高效率,理解对象是通过接口给用户使用的,用户可以不关心接口的实现,但不同的实现影响到用户的使用体验;

(3)    将数组对象改为template类,掌握template模板编程;深刻体会了STL中的vector的实现机制;

(4)    掌握STLlistmap等容器的使用;

(5)    初步学习静态链接库lib和动态链接库dll的原理和使用。

 

3.      基于QTGUI编程:类的继承和多态(1周)

通过作业1(画图小程序),学习基于QTGUI(图形界面接口)的编程(窗口、鼠标交互、GDI画图等),并初步学习类的继承和多态。

通过该作业,已初步对对象的三大特性(封装、继承、多态)有所了解。

 

4.      图像变形:巩固类继承和多态(1周)

通过作业2Image warping),实现图像变形的2个方法。需要理解这2个方法是一个图像变形任务的两种实现,需要实现多个类的继承和多态的关系才合理。

通过该作业,进一步巩固了类的继承和多态特性的深刻理解和使用,确保未来能主动地这样去做类的封装和设计。

 

5.      Poisson图像编辑:使用数学库Eigen1周)

通过作业3Poisson image editing),实现扫描线算法、稀疏方程组求解等。对不同的方法,要主动设计类的继承和多态,进一步巩固类的三大特性。

另外,学习使用现有的代码和库(Eigen等),不必“重复造轮子”,学会集成和使用他人的代码。

 

经过前面的几个作业的练习和理解,现在应该对C++面向对象编程完全掌握了。前面几个作业是个“坎”,必须跨过去!若跨过去了,后面的作业做起来就没有太大的困难,就能聚焦学习计算机图形学的内容了。

 

6.      计算机图形学的基础内容

后面计算机图形学部分的编程作业的基本方法是:在基于面向对象思想之上,先学会利用已有框架,将编程及图形学的算法做起来,培养对编程及图形学的兴趣,对其有掌控的心理;随着做的多了,就对编程及图形学不会怕了。之后,随着经验增加后,如对C++的高级语法、设计模式、或者渲染的管线产生好奇,再去主动通过自学去了解其中原理。前面的作业的“坎”已经培养了你的自学方法和能力,这是你去主动学习新东西就不难了。

 

作业4和作业5是关于几何建模的;作业6和作业7是关于物理仿真的;作业8和作业9是关于真实感渲染的。

 

7.      学习计算机图形学的误区

很多同学(也是传统的计算机图形学的教学方法)是从非常基本的图形算法(比如利用OpenGL搭建框架、光栅化、变换、消隐等)或从底层写渲染框架开始上手。这样的学习方法往往无法很快上手,学习曲线相对较长,而且容易走弯路或失去耐心。因此,从笔者多年培养学生的经验来看,这是一种不太高效的学习方法和学习曲线。

 

在现成的框架上面围绕着任务先解决问题,对知识和算法有了掌控的心理后,就不会产生害怕的感觉。等到你有了这些经验和能力后,再回过去搭建基础框架,就不是难事了。

 

【后记】这里建议的学习方法是非常适合初学者,无数实践也证明了其有效性。当然,学习没有唯一的方法,比如闫令琪老师的GAMES 101课程(课程主页B站视频)也是自学计算机图形学的非常好的课程 。这里提供的方法仅供参考,希望对你有用!并享受图形学与编程的快乐!!加油!!!

 

刘利刚

中国科学技术大学图形与几何计算实验室(http://gcl.ustc.edu.cn)

个人主页:http://staff.ustc.edu.cn/~lgliu

电子邮箱:lgliu@ustc.edu.cn

2020年7月14日