作为省级精品课程“计算机图形学”的建设成果,《计算机图形学基础教程(Visual C++版)(第2版)》采用面向对象语言Visual C++ 6.0的MFC框架作为开发平台,系统地讲解“基本图形的扫描转换”、“多边形填充”、“二维变换与裁剪”、“三维变换与投影”、“自由曲线与曲面”、“分形几何”、“建模与消隐”和“真实感图形”的实现原理及算法。
《计算机图形学基础教程(Visual C++版)(第2版)》以生成真实感光照模型为主线,引导读者重点掌握直线的扫描转换原理、多边形的填充原理、三维物体的几何变换与透视投影原理、光滑曲面的建模与深度缓冲动态隐面原理、Gouraud双线性光强插值与Phong双线性法矢插值原理、图像纹理与几何纹理映射原理、基于简单光照模型、简单透明模型与简单阴影模型的真实感图形绘制等原理。系统学习完本书后,读者可以在简单光照模型场景中渲染出光源与材质交互作用的真实感三维物体,同时支持鼠标与键盘的交互操作,为进一步从事游戏开发奠定理论基础。
《计算机图形学基础教程(Visual C++版)(第2版)》提供了丰富的教学资源,涵盖了计算机图形学原理的主要知识点,由于采用VC++的MFC编程可以模拟真实感光照以及纹理等效果,对学生很有吸引力,对提升计算机图形学的教学效果也很有帮助。原理的案例化可以让学生面对枯燥的图形数学模型及绘制算法,能尽快直观地体验到真实效果并深刻理解绘制算法的原理。
笔者花费了七年多时间,打造了“省级精品课程+系列化教材+数字化教学资源”立体化图形学教学平台。2006年建设完成山西省省级精品课程“C++程序设计”后,直接基于Visual C++中的MFC框架,采用案例化教学方法建设了“计算机图形学”教学资源。2008年笔者主持的“计算机图形学”课程被评为山西省省级精品课程之后,出版了《计算机图形学基础教程(Visual C++版)》、《计算机图形学实践教程(Visual C++版)》两本教材,并双双获得兵工高校优秀教材一等奖,随后相继出版了《计算机图形学基础教程(Visual C++版)习题解答与编程实践》、《计算机图形学实验及课程设计(Visual C++版)》等系列教材,其中《计算机图形学实践教程(Visual C++版)》提供了与《计算机图形学基础教程(Visual C++版)》中所讲解原理一一对应的案例,共计43个案例。这些案例被国内的近百所院校试用后,给予了肯定。下面某高校教师对本书的评价:
“教材提供了丰富的教学资源,涵盖了计算机图形学原理的主要知识点,由于采用VC++的MFC编程可以模拟真实感光照以及纹理等效果,对学生很有吸引力,对提升计算机图形学的教学效果也很有帮助。原理的案例化可以让学生面对枯燥的图形数学模型及绘制算法,能尽快直观地体验到真实效果并深刻理解绘制算法的原理”.
下面是某高校本科生对本书的评价:
“我是一名三年级本科生,学校开设了计算机图形学这门课程,出于兴趣,我也选择这门课程,并且很荣幸地读到了您的作品。清晰的讲解也给我留下了很深刻的印象 ,我甚至可以不用听老师讲解就可以通过看书将后面的大部分习题解决出来。当优美的图形在我点下那个感叹号后突然显示的时候,那种感觉是美妙的!"
读者的肯定是改版的动力。本书第2版在保留第1版体系结构的基础上,重写了全书所有章节,调整了三维坐标系z轴的指向,完善了光照模型、新增了简单透明模型、简单阴影模型、图像纹理、几何纹理等内容。相应地,《计算机图形学实践教程(Visual C++版)(第2版)》中的案例也由43个扩充为60个。
笔者将《计算机图形学实践教程(Visual C++版)(第2版)》的60个案例、《计算机图形学基础教程(Visual C++版)习题解答与编程实践》的近200个习题解答与拓展案例、《计算机图形学实验及课程设计(Visual C++版)》的18个上机实验与5个课程设计案例集结一起建设了计算机图形学实践教学资源库。并将全部资源提供在笔者的个人网站: http: //www.klingde.com上。网站上同时提供的还有《计算机图形学基础教程(Visual C++版)(第2版)》的教案和课件。2010年笔者主持完成的“应用型工科院校计算机图形学教学模式的改革与实践”项目被评为山西省教学成果二等奖。该成果建议教师课堂教学采用“演示案例”、“讲解原理”、“学习代码”、“拓展案例”的教学模式讲授计算机图形学课程,以形象化的案例激发起学生学习计算机图形学的主动性。2012年笔者主持的“计算机图形学实践教学资源库的建设”被评为山西省教学成果一等奖。该成果将计算机图形学实践教学资源划分为“验证性资源”、“综合性资源”、“创新性资源”和“工程化资源”4个部分,涵盖了前面介绍的近300个案例以及20个3ds max模型。
虽然计算机图形学领域每年有大量的新技术不断涌现,但最基本的原理和方法却保持着稳定性和连贯性。笔者是从计算机编程角度讲授计算机图形学原理,在不使用任何图形库的前提下,仅单纯使用MFC的绘制像素点函数,按照计算机图形学的基本原理开发出与OpenGL或Direct3D显示效果一致的真实感图形。更确切的说法是笔者依据本书讲解的原理搭建了一个自己的图形库。只要在场景中构造出物体的几何模型,就可以根据假定的光照条件下,动态渲染出包含材质、纹理的真实感图形,产生如临其境、如见其物的视觉效果。
用算法实现本书讲到的所有原理,调试程序需要花费很长时间,正是因为有幸得到博创研究所廖小谊、左亮亮、潘晓、宋准、孙立广、高腾等人的协助,使用MFC框架开发了本书所有原理的案例源代码,才使得案例以漂亮的效果出现在读者面前。
希望本书的出版对计算机图形学的教学有所帮助,感谢国内高校师生对笔者第1版作品的肯定。同时也恳请教学一线的计算机图形教师继续提出宝贵的意见和建议。笔者E-mail: klingde@163.com, QQ: 997796978.
本书配套的《计算机图形学实践教程(Visual C++版)(第2版)》中60个案例的设置与本书章节的对应关系见附录A.
本书得到2011年山西省重点教改项目“图形图像处理系列课程实践教学资源与平台的建设”的资助。
孔令德2012年10月第1版前言
计算机图形学(computer graphics, CG)是研究如何利用计算机算法来生成、处理和显示图形的一门学科。主要的算法原理包括基于光栅扫描显示器的基本图形扫描转换原理;基于齐次坐标的二维、三维图形的几何变换原理;基于几何造型的自由曲线、曲面的生成原理;基于分形几何学的分数维造型原理;基于图像空间和物体空间的三维物体动态消隐原理;基于颜色模型、光照模型和纹理映射技术的真实感图形显示原理。
本书有以下特色。
(1) 编程环境的先进性。本书采用Visual C++ 6.0编程环境进行算法讲解。目前市面上的计算机图形学教材大多采用Turbo C语言作为编程环境,但面向过程语言Turbo C开发的程序是基于DOS界面的,图形操作基本不具备交互性,而且只能显示256种颜色,无法生成真实感光照图形。本书选用了Microsoft公司的面向对象程序设计语言Visual C++ 6.0的MFC框架作为编程环境,不仅可以制作出和3ds效果一致的三维真实感图形,而且支持交互式操作。本书的彩插效果图全部使用MFC框架制作,并没有借助OpenGL或DirectX等图形库的支持。
(2) 所有原理算法的案例化。计算机图形学,原理众多、算法复杂。作为省级精品课程“计算机图形学”和“C++程序设计”的第一负责人,笔者在十多年的计算机图形学教学实践中,使用Visual C++ 6.0的MFC框架自主开发了所有原理的实现程序,做到了本书所讲解到的每个原理在配套的实践教程中都有相应的算法实现案例。
(3) 编写内容的系统化。本书配有实践教程。本书分为10章,实践教程包含和本书对应的43个案例。两本书的内容均由同一作者编写,保证了编写体系的一致性。
本书各章节主要内容如下。
第1章 导论。介绍了计算机图形学的应用领域,以及图形显示设备的发展历程。
第2章 Visual C++ 6.0 绘图基础。介绍面向对象程序设计基础、MFC上机操作步骤以及CDC类的基本绘图函数。
第3章 基本图形的扫描转换。讲解直线、圆、椭圆的像素级扫描转换原理,以及反走样技术。
第4章 多边形填充。讲解了实面积图形的概念,有效边表填充原理和算法,边缘填充原理和算法、区域填充原理和算法。
第5章 二维变换与裁剪。讲解齐次坐标,平移、比例、旋转、反射和错切的二维基本几何变换矩阵,Cohen\|Sutherland直线段裁剪原理和算法,中点分割直线段裁剪原理和算法,以及Liang-Barsky直线段裁剪原理和算法。
第6章 三维变换与投影。讲解平移、比例、旋转、反射和错切的三维基本几何变换矩阵、三视图、斜轴侧图以及透视投影的变换矩阵。
第7章 自由曲线与曲面。讲解三次参数样条曲线、Bezier曲线曲面和B样条曲线曲面的生成原理和算法。
第8章 分形几何。讲解分形曲线的递归模型、植物的L-系统模型,以及IFS 迭代函数系统等的原理和算法。
第9章 建模与消隐。讲解动态凸多面体和曲面体的隐线原理和算法,动态Z-Buffer的隐面原理和算法,以及画家算法的隐面原理和算法。
第10章 真实感图形。讲解RGB颜色模型、Gouraud明暗处理、Phong明暗处理、光照模型,以及纹理映射技术的原理和算法。
实践教程的案例设置和本书的对应关系参见附录A.
经过历时3年的编写,本书终于要和读者见面了,其间的艰辛一言难尽。由于要用算法实现本书讲到的所有原理,程序调试花费了很长时间。幸喜在博创研究所的工作人员的协助下,使用Visual C++的MFC框架完成了本书所有原理的算法实现,本书也得以完稿。
感谢在博创研究所先后工作的人员廖小谊、彭贺亮、刘鹏、申明达、傅立群、杨铭等在程序调试方面作出的贡献。
本书及其配套的实践教程适合作为计算机科学与技术专业的本科教材。欢迎访问笔者个人网站:http://www.klingde.com下载《计算机图形学实践教程(Visual C++版)》的43个源程序、教案、电子课件和习题解答源程序等相关的教学资源。
希望本书的出版对读者有所帮助,请计算机图形学方面的专家提出宝贵意见,同时也希望能和广大的计算机图形学教师进行学术交流。
第1章 导论
1.1 计算机图形学的应用领域
1.1.1 计算机游戏
1.1.2 计算机辅助设计
1.1.3 计算机艺术
1.1.4 虚拟现实
1.1.5 计算机辅助教学
1.2 计算机图形学的概念
1.3 计算机图形学的相关学科
1.4 计算机图形学的确立与发展
1.5 图形显示器的发展及其工作原理
1.5.1 阴极射线管
1.5.2 随机扫描显示器
1.5.3 直视存储管显示器
1.5.4 光栅扫描显示器
1.5.5 液晶显示器
1.5.6 三维图形显示原理及立体显示器
1.6 图形软件标准
1.7 计算机图形学研究的热点技术
1.7.1 层次细节技术
1.7.2 图像绘制技术
1.8 本章小结
习题
第2章 MFC绘图基础
2.1 面向对象程序设计基础
2.1.1 类和对象
2.1.2 构造函数与析构函数
2.1.3 对象的动态建立与释放
2.1.4 继承与派生
2.2 MFC上机操作步骤
2.3 MFC基本绘图函数
2.3.1 CDC类结构与GDI对象
2.3.2 映射模式
2.3.3 使用GDI对象
2.3.4 CDC类绘图成员函数
2.3.5 双缓冲机制
2.3.6 设备上下文的调用与释放
2.3.7 MFC绘图的几种方法
2.4 本章小结
习题
第3章 基本图形的扫描转换
3.1 直线的扫描转换
3.1.1 算法原理
3.1.2 构造中点误差项
3.1.3 递推公式
3.1.4 绘制任意斜率的直线
3.2 圆的扫描转换
3.2.1 算法原理
3.2.2 构造中点误差项
3.2.3 递推公式
3.3 椭圆的扫描转换
3.3.1 算法原理
3.3.2 构造上半部分I的中点误差项
3.3.3 上半部分I的递推公式
3.3.4 构造下半部分II的中点误差项
3.3.5 下半部分II的递推公式
3.4 反走样技术
3.5 Wu反走样算法
3.5.1 算法原理
3.5.2 构造距离误差项
3.5.3 计算机化
3.5.4 彩色直线段的反走样
3.6 本章小结
习题3
第4章 多边形填充
4.1 多边形的扫描转换
4.1.1 多边形的定义
4.1.2 多边形的表示
4.1.3 多边形着色模式
4.1.4 填充多边形
4.1.5 填充区域
4.2 有效边表填充算法
4.2.1 填充原理
4.2.2 边界像素的处理原则
4.2.3 有效边与有效边表
4.2.4 桶表与边表
4.3 边缘填充算法
4.3.1 填充原理
4.3.2 填充过程
4.4 区域填充算法
4.4.1 填充原理
4.4.2 四邻接点与八邻接点
4.4.3 四连通域与八连通域
4.4.4 种子填充算法
4.4.5 扫描线种子填充算法
4.5 本章小结
习题4
第5章 二维变换与裁剪
5.1 图形几何变换基础
5.1.1 规范化齐次坐标
5.1.2 矩阵相乘
5.1.3 二维几何变换矩阵
5.1.4 物体变换与坐标变换
5.1.5 二维几何变换形式
5.2 二维图形基本几何变换矩阵
5.2.1 平移变换矩阵
5.2.2 比例变换矩阵
5.2.3 旋转变换矩阵
5.2.4 反射变换矩阵
5.2.5 错切变换矩阵
5.3 二维复合变换
5.3.1 复合变换原理
5.3.2 相对于任意参考点的二维几何变换
5.3.3 相对于任意方向的二维几何变换
5.4 二维图形裁剪
5.4.1 图形学中常用的坐标系
5.4.2 窗口与视区
5.4.3 窗视变换矩阵
5.5 Cohen-Sutherland直线段裁剪算法
5.5.1 编码原理
5.5.2 裁剪步骤
5.5.3 交点计算公式
5.6 中点分割直线段裁剪算法
5.6.1 中点分割算法原理
5.6.2 中点计算公式
5.7 Liang-Barsky直线段裁剪算法
5.7.1 Liang-Barsky裁剪算法原理
5.7.2 算法分析
5.7.3 算法的几何意义
5.8 多边形裁剪算法
5.9 本章小结
习题5
第6章 三维变换与投影
6.1 三维图形几何变换
6.1.1 三维几何变换矩阵
6.1.2 三维几何变换形式
6.2 三维基本几何变换矩阵
6.2.1 平移变换
6.2.2 比例变换
6.2.3 旋转变换
6.2.4 反射变换
6.2.5 错切变换
6.3 三维复合变换
6.3.1 相对于任意参考点的三维几何变换
6.3.2 相对于任意方向的三维几何变换
6.4 坐标系变换
6.4.1 二维坐标系变换
6.4.2 三维坐标系变换
6.5 平行投影
6.5.1 正交投影矩阵
6.5.2 三视图
6.5.3 斜投影
6.6 透视投影
6.6.1 透视变换坐标系
6.6.2 世界坐标系到观察坐标系的变换
6.6.3 观察坐标系到屏幕坐标系的变换
6.6.4 透视投影分类
6.5.5 屏幕坐标系的透视深度坐标
6.7 本章小结
习题6
第7章 自由曲线与曲面
7.1 基本概念
7.1.1 曲线与曲面的表示形式
7.1.2 插值与逼近
7.1.3 连续性条件
7.2 Bezier曲线
7.2.1 Bezier曲线的定义
7.2.2 Bernstein基函数的性质
7.2.3 Bezier曲线的性质
7.2.4 de Casteljau递推算法
7.2.5 Bezier曲线的拼接
7.3 Bezier曲面
7.3.1 Bezier曲面的定义
7.3.2 双三次Bezier曲面的定义
7.3.3 双三次Bezier曲面的拼接
7.4 B样条曲线
7.4.1 B样条曲线的定义
7.4.2 二次B样条曲线
7.4.3 三次B样条曲线
7.4.4 B样条曲线的性质
7.4.5 构造特殊的三次B样条曲线的技巧
7.5 B样条曲面
7.5.1 B样条曲面的定义
7.5.2 双三次B样条曲面的定义
7.5.3 双三次B样条曲面的连续性
7.6 本章小结
习题7
第8章 分形几何
8.1 分形与分维
8.1.1 分形的诞生
8.1.2 分形的基本特征
8.1.3 分形的定义
8.1.4 分形维数的定义
8.2 递归模型
8.2.1 Cantor集
8.2.2 Koch曲线
8.2.3 Peano-Hilbert曲线
8.2.4 Sierpinski垫片与地毯
8.2.5 Menger海绵
8.2.6 C字曲线
8.2.7 Cayley树
8.3 L系统模型
8.3.1 L系统文法构图法
8.3.2 Koch曲线
8.3.3 分形草
8.3.4 Peano-Hilbert曲线
8.3.5 分形灌木丛
8.4 IFS迭代函数系统模型
8.4.1 仿射变换
8.4.2 IFS
8.4.3 Koch曲线
8.4.4 Sierpinski垫片
8.4.5 Barnsley蕨
8.4.6 拼贴与IFS码的确定
8.5 本章小结
习题8
第9章 建模与消隐
9.1 三维物体的数据结构
9.1.1 物体的几何信息与拓扑信息
9.1.2 三表结构
9.1.3 物体的描述模型
9.1.4 双表结构
9.1.5 常用物体的几何模型
9.2 消隐算法分类
9.3 隐线算法
9.3.1 凸多面体消隐算法
9.3.2 曲面体消隐算法
9.4 隐面算法
9.4.1 深度缓冲器算法
9.4.2 深度排序算法
9.5 本章小结
习题9
第10章 真实感图形
10.1 颜色模型
10.1.1 原色系统
10.1.2 RGB颜色模型
10.1.3 HSV颜色模型
10.1.4 CMYK颜色模型
10.2 简单光照模型
10.2.1 材质模型
10.2.2 环境光模型
10.2.3 漫反射光模型
10.2.4 镜面反射光模型
10.2.5 光强衰减
10.2.6 增加颜色
10.3 光滑着色
10.3.1 直线的光滑着色
10.3.2 Gouraud明暗处理
10.3.3 Phong明暗处理
10.4 简单透明模型
10.5 阴影模型
10.6 纹理映射
10.6.1 颜色纹理
10.6.2 三维纹理
10.6.3 几何纹理
10.6.4 简单纹理反走样
10.7 本章小结
习题10
附录A 配套实践教程的案例设置及与本书的对应关系
参考文献