第1章 计算机图形学概述 1
1.1什么是计算机图形学 1
1.2计算机生成的图片用在哪里 3
1.2.1艺术、娱乐和出版行业 3
1.2.2计算机图形学、感知和图像处理 7
1.2.3过程监视 7
1.2.4仿真显示 8
1.2.5计算机辅助设计 8
1.2.6科学分析与体可视化 9
1.3计算机图形学中制作图像的基本元素 11
1.3.1折线 11
1.3.2文本 13
1.3.3填充区域 14
1.3.4光栅图像 15
1.3.5光栅图像的灰度和色彩表达 18
1.4图形显示设备 21
1.4.1线画显示 21
1.4.2光栅显示器 21
1.4.3视频卡/3D加速器 24
1.4.4其他的光栅显示设备 26
1.4.5硬拷贝光栅设备 27
1.5图形输入的基本单元和设备 28
1.5.1逻辑上的输入图形基元类型 28
1.5.2物理输入设备的类型 29
本章小结 31
本章习题 32
进一步阅读 32
第2章 OpenGL绘图入门 33
2.1生成图像初步 33
2.1.1设备无关的编程和OpenGL 35
2.1.2窗口的编程 36
2.1.3如何打开一个窗口画图 38
2.2 OpenGL的基本图形元素 40
2.2.1几个点丛绘制的例子 43
2.3 OpenGL中的直线绘制 50
2.3.1绘制折线和多边形 51
2.3.2使用moveTo()和lineTo()绘制线段 57
2.3.3绘制边校正的矩形 58
2.3.4边校正矩形的长宽比 58
2.3.5填充多边形 60
2.3.6 OpenGL中的其他图形元素 61
2.4与鼠标和键盘的交互 62
2.4.1用鼠标交互 62
2.4.2键盘交互 66
2.5程序中的菜单设计与使用 67
本章小结 71
案例分析 71
进一步阅读 80
第3章 更多的绘图工具 81
3.1概述 81
3.2世界窗口和视口 83
3.2.1窗口到视口的映射 86
3.3裁减线 95
3.3.1如何裁减一条线 95
3.3.2 Cohen-Sutherland裁减算法 96
3.4正多边形、圆和圆弧 99
3.4.1正多边形 99
3.4.2正n边形的变种 100
3.4.3绘制圆弧和圆 104
3.4.4曲线的逐次细化 105
3.5曲线的参数形式 107
3.5.1曲线的参数形式 107
3.5.2绘制参数曲线 110
3.5.3极坐标形状 111
本章小结 113
案例分析 114
进一步阅读 120
第4章 图形学中的向量工具 121
4.1概述 121
4.2向量回顾 124
4.2.1向量基本运算法则 125
4.2.2向量线性组合 126
4.2.3向量的度量和单位向量 127
4.3点积 128
4.3.1点积的性质 129
4.3.2两个向量的夹角 129
4.3.3 b·c的符号和正交性 130
4.3.4二维正交向量 132
4.3.5正交投影和点到直线的距离 133
4.3.6投影的应用:反射 135
4.4两个向量的叉积 136
4.4.1叉积的几何解释 137
4.4.2求平面的法向量 138
4.4.3判断平面多边形的凸性 139
4.5重要几何对象的表示 140
4.5.1坐标系统和坐标框架 141
4.5.2点的仿射组合 143
4.5.3两个点的线性插值 145
4.5.4使用内插的艺术和动画 145
4.5.5预览:用二次、三次内插生成贝塞尔曲线 148
4.5.6表示直线和平面 149
4.6求两个线段的交点 154
4.6.1直线求交的应用:过三点的圆 155
4.7直线和平面求交及裁剪 157
4.8多边形求交问题 160
4.8.1处理凸多边形和凸多面体 161
4.8.2射线与凸多边形的交点以及裁剪问题 161
4.8.3 Cyrus-Beck裁剪算法 164
4.8.4更高级的裁剪问题 166
本章小结 167
案例分析 168
进一步阅读 172
第5章 物体变换 173
5.1概述 174
5.2几何变换初步 174
5.2.1点和物体变换 177
5.2.2仿射变换 179
5.2.3二维基本仿射变换的几何效果 180
5.2.4仿射变换的逆变换 184
5.2.5组合一个仿射变换 185
5.2.6二维组合变换的实例 186
5.2.7仿射变换的一些有用的性质 189
5.3三维仿射变换 193
5.3.1基本三维变换 193
5.3.2组合一个三维仿射变换 197
5.3.3旋转的组合 198
5.3.4总结三维仿射变换的性质 202
5.4如何实现坐标系变换 202
5.5在程序中使用仿射变换 206
5.5.1为后面的使用保存CT 212
5.6使用OpenGL绘制三维场景 215
5.6.1观察过程和图形绘制管道概述 215
5.6.2 OpenGL中的建模和视点工具 218
5.6.3用OpenGL绘制基本形状 221
5.6.4使用SDL从文件中读取一个场景的描述 230
本章小结 234
案例分析 235
进一步阅读 238
第6章 使用多边形网格建模 239
6.1概述 240
6.2多边形网格实体建模初步 241
6.2.1定义多边形网格 242
6.2.2 3D文件格式举例 244
6.2.3计算法向量 245
6.2.4网格的性质 246
6.2.5非实体对象的网格模型 248
6.2.6在程序中使用网格 248
6.3多面体 251
6.3.1棱柱 252
6.3.2柏拉图实体 253
6.3.3其他有趣的多面体 258
6.4拉伸形体 259
6.4.1生成棱柱 259
6.4.2带“扭结”的拉伸 261
6.4.3离散扫掠而成的旋转曲面 268
6.5用网格逼近光滑物体 269
6.5.1曲面的表示 270
6.5.2曲面的法向量 271
6.5.3仿射变换的影响 273
6.5.4三个“通用”形体:球面、柱面和锥面 274
6.5.5构造弯曲曲面的多边形网格 277
6.5.6直纹面 279
6.5.7旋转曲面 281
6.5.8基于3D曲线的管状体 284
6.5.9基于双变量显式函数的曲面 284
6.6粒子系统与基于物理的系统 285
6.6.1粒子系统 285
6.6.2基于物理的系统 286
本章小结 287
案例分析 288
进一步阅读 294
第7章 三维观察 295
7.1概述 295
7.2再次研究摄像机 296
7.2.1设置视景体 297
7.2.2摄像机的定位和定向 297
7.3在程序中指定一个摄像机 301
7.3.1交互地移动摄像机 303
7.4三维物体的透视投影 307
7.4.1点的透视投影 308
7.4.2直线的透视投影 310
7.4.3在图形绘制管道中加入透视投影 313
7.5生成立体视图 326
7.6投影的分类 327
7.6.1一点、两点以及三点透视 328
7.6.2平行投影的类型 330
本章小结 334
案例分析 334
进一步阅读 336
第8章 几何体的真实感渲染 337
8.1概述 337
8.2渲染模型 340
8.2.1影响反射光的几何因素 341
8.2.2如何计算漫反射分量 342
8.2.3镜面反射 343
8.2.4环境光的作用和人类的视觉感知 346
8.2.5如何综合光的贡献 347
8.2.6增加颜色 347
8.2.7渲染和图形管线 350
8.2.8在OpenGL中使用光源 351
8.2.9在OpenGL中使用材质属性 355
8.2.10渲染SDL设定的场景 356
8.3平面着色与平滑着色 357
8.3.1平面着色和马赫带 358
8.3.2平滑着色 359
8.4增加隐藏面消隐 362
8.4.1深度缓存方法——OpenGL使用的方法 362
8.5为面片添加纹理 365
8.5.1在平面上贴纹理 367
8.5.2渲染纹理 369
8.5.3什么是纹理调和 376
8.5.4一个OpenGL纹理的例子 377
8.5.5在曲面上卷绕纹理 382
8.5.6反射映射 386
8.6给物体添加阴影 389
8.6.1阴影简介 389
8.6.2利用阴影缓冲区绘制阴影 391
8.6.3辐射度的简要介绍 393
8.7 OPENGL2.0和着色语言(GLSL) 393
8.7.1凹凸贴图 394
8.7.2非真实感绘制 395
本章小结 396
案例分析 397
进一步阅读 398
第9章 光栅显示工具 399
9.1概述 399
9.2处理像素映射 401
9.2.1对像素映射的操作 401
9.2.2对像素映射有用的数据类型 402
9.2.3图像缩放和旋转 407
9.3合并像素映射 409
9.3.1读-改-写循环 410
9.3.2 alpha通道和图像融合 410
9.3.3像素的逻辑合并 414
9.3.4 BitBLT操作 418
9.4自己实现直线绘制:Bresenham算法 419
9.4.1 Bresenham直线绘制算法 420
9.5定义和填充像素区域 429
9.5.1区域定义 429
9.6处理符号定义的区域 430
9.6.1矩形定义的区域 430
9.6.2路径定义的区域 431
9.7填充多边形定义的区域 432
9.7.1边界上的哪些像素属于多边形 433
9.7.2改进算法性能 436
9.8走样和反走样技术 439
9.8.1反走样技术 440
9.8.2纹理的反走样 443
9.8.3使用OpenGL反走样 446
9.9生成更多的明暗效果和色彩 447
9.9.1误差扩散 448
本章小结 450
案例分析 451
进一步阅读 452
第10章 曲线和曲面设计 453
10.1概述 453
10.1.1作为运动轨迹的参数曲线 454
10.1.2运动的光滑性 454
10.2用多项式描述曲线 458
10.3关于交互式曲线设计 461
10.4用贝塞尔曲线进行曲线设计 463
10.4.1德卡斯特里奥算法 464
10.5贝塞尔曲线的性质 468
10.6寻找更好的混合函数 472
10.6.1局部控制问题 472
10.6.2混合函数集的性质 473
10.6.3分段多项式曲线和样条 475
10.6.4根据g(t)建立一组混合函数 476
10.6.5样条曲线和基函数 479
10.7 B样条基函数 480
10.7.1 B样条函数的定义 480
10.7.2如何利用节点向量中的多重节点 484
10.7.3非封闭B样条曲线:标准节点向量 485
10.8 B样条曲线在设计中的重要性质 488
10.8.1多重控制顶点 489
10.9有理曲线和非均匀有理B样条曲线 490
10.10插值一瞥 494
10.10.1利用分段三次多项式插值 494
10.10.2 Hermite插值 496
10.10.3自然三次样条 498
10.10.4三次样条插值中斜率的计算 500
10.10.5交互指定切向量 503
10.11自由曲面造型 504
10.11.1基于B样条的直纹面 504
10.11.2基于B样条的旋转曲面 505
10.11.3贝塞尔曲面片 506
10.11.4贝塞尔曲面片的拼接 507
10.11.5 B样条曲面片 509
10.11.6 NURBS曲面 510
10.11.7细分曲面 511
本章小结 513
案例分析 514
进一步阅读 522
第11章 颜色理论 523
11.1概述 523
11.1.1眼睛:人类颜色感知的生理学基础 524
11.1.2红绿蓝色盲 526
11.2颜色描述 526
11.2.1主导波长 526
11.2.2颜色感知和匹配 527
11.3 CIE标准 529
11.3.1构造CIE色度图 531
11.3.2 CIE色度图的应用 532
11.3.3色域 533
11.4颜色空间 534
11.4.1 RGB颜色空间 535
11.4.2加/减色系统 535
11.4.3 HLS颜色模型 537
11.5索引颜色和颜色查找表 538
11.6颜色量化 540
11.6.1均匀量化 541
11.6.2流行度算法 543
11.6.3中值切分算法 544
11.6.4八叉树量化 545
本章小结 547
案例分析 547
进一步阅读 549
第12章 光线跟踪基础 550
12.1前言 551
12.2建立光线跟踪的几何场景 552
12.3光线跟踪过程纵览 554
12.4光线与物体求交 555
12.4.1光线与通用平面求交 556
12.4.2光线与通用球面求交 557
12.4.3光线与仿射变换后的物体求交 558
12.5一个光线跟踪器的应用 560
12.5.1光线和球体的求交程序 565
12.5.2一个完整的光线跟踪器 567
12.6光线和其他基本几何体求交 568
12.6.1与正方形求交 568
12.6.2与锥形柱体求交 569
12.6.3与立方体(或任何凸多面体)求交 571
12.6.4添加更多的基本形状 576
12.7绘制场景的明暗图 577
12.7.1计算交点处的法向量 578
12.7.2根据物体的表面材质为其着色 578
12.7.3基于物理的明暗着色模型—Cook Torrance明暗处理 580
12.8添加表面纹理 585
12.8.1体纹理 586
12.8.2在表面上粘贴图像 594
12.9光线跟踪算法中的反走样技术 596
12.10包围盒技术 597
12.10.1长方体和球体包围盒 599
12.10.2投影包围盒 603
12.10.3其他光线跟踪加速方法:二叉空间剖分树技术 605
12.11添加阴影 607
12.12反射与透明 610
12.12.1光线的折射 612
12.12.2在函数shade()中处理折射 616
12.13复合体:物体上的布尔操作 618
12.13.1 CSG体的光线跟踪 620
12.13.2布尔物体的数据结构 622
12.13.3布尔体与光线的交 624
12.13.4为CSG物体构建和使用包围盒 627
12.14光线跟踪与光线投射 628
本章小结 629
案例分析 630
进一步阅读 632
附录1 图形工具:怎样获取和安装OpenGL 633
A1.1获取和安装OpenGL 633
附录2 计算机图形学的数学基础 636
A2.1一些关于矩阵及其运算的主要定义 636
A2.1.1矩阵运算 636
A2.1.2两个矩阵相乘 637
A2.1.3矩阵分块 639
A2.1.4矩阵的行列式 639
A2.1.5矩阵的逆 640
A2.2向量及其运算的一些性质 641
A2.2.1向量的正交、正交点积 641
A2.3球坐标和方向余弦 642
附录3 有用的类、例程以及SDL 644
A3.1 2D图形类 644
A3.1.1基本2D图形类 644
A3.1.2场景和支持类 652
A3.1.3一些用于光线跟踪的类 680
A3.1.4 SDL:场景描述语言 682
A3.1.5 Scene类 683
A3.2 SDL语法 683
A3.3 SDL中的宏 687
A3.4扩展SDL 688
附录4 分形和曼德布洛特集合 690
A4.1引言 690
A4.2分形和自相似 690
A4.3曼德布洛特集合 691
A4.3.1曼德布洛特集合和迭代函数系统 691
A4.3.2如何判断点c是否属于曼德布洛特集合 693
A4.3.3描绘曼德布洛特集合 694
A4.3.4曼德布洛特集合的一些注释 696
附录5 相对性和海龟绘图 698
A5.1编写moveRel()和lineRel()函数 698
A5.2海龟绘图法 699
A5.2.3绘制曲径 702
A5.2.4其他类型的曲径 702
A5.3基于正多边形的图 702
A5.3.1正多边形 703
A5.3.2 n-gon的变种 704