1.0.2点子2——最低标准 3
1.0.3点子3——杜绝硬编码 3
第1章 通用编程技术 3
1.0神奇的数据驱动设计 3
Steve Rabin 3
1.0.1点子1——基础 3
1.0.4点子4——将控制流写成脚本 4
1.0.6点子6——避免重复数据 5
1.0.5点子5——什么时候不适合使用脚本? 5
1.0.8结论 6
1.0.7点子7——开发工具来生成数据 6
1.1.1代码风格 7
James Boer 7
1.1面向对象的编程与设计技术 7
1.1.2类设计 9
1.1.4设计模式 10
1.1.3类层次结构设计 10
1.1.6参考资料 16
1.1.5总结 16
1.2.1斐波纳契数 17
PeteIsensee 17
1.2使用模板元编程的快速数学方法 17
1.2.2阶乘 18
1.2.3三角学 19
1.2.4实际世界中的编译程序 20
1.2.7矩阵 21
1.2.6模板和标准C++ 21
1.2.5重访三角学 21
1.2.8总结 26
1.2.9参考文献 31
1.3.2 优点 32
1.3.1 定义 32
1.3一种自动的Singleton工具 32
Scott Bilas 32
1.3.5较好的方法 33
1.3.4传统的解决方法 33
1.3.3 问题 33
1.3.6更好的方法 34
1.3.7参考文献 35
1.4.1 STL的类型和术语 36
JamesBoer 36
1.4 在游戏编程中使用STL 36
1.4.2 STL概念 37
1.4.3 向量(Vector) 38
1.4.4链表(List) 40
1.4.5双队列(Deque) 42
1.4.6映射表(Map) 43
1.4.7堆栈(Stack),队列(Queue)和优先队列(Priority Queue) 46
1.4.9参考文献 47
1.4.8 总结 47
1.5.2关于平台 48
1.5.1 要求 48
1.5一个通用的函数绑定接口 48
Scott Bilas 48
1.5.3第一次尝试 49
1.5.4第二次尝试 50
1.5.5部分解决方法 51
1.5.6调用约定 52
1.5.7调用函数 54
1.5.8完备解决方案 55
1.5.9结论 56
1.5.10参考文献 57
1.6.1 方法 58
Scott Bilas 58
1.6通用的基于句柄的资源管理器 58
1.6.2 Handle类 59
1.6.3 HandleMgr类 60
1.6.5注意 61
1.6.4使用示例 61
1.6.6参考文献 68
1.7.1 资源类 69
James Boer 69
1.7资源和内存管理 69
1.7.2资源管理类 71
1.7.4可能的扩展和改进 74
1.7.3句柄如何工作 74
1.7.5 结论 75
1.8.2保存你的数据 76
1.8.1预处理你的数据 76
1.8快速数据载入技巧 76
John Olsen 76
1.8.3使用简单方法载入你的数据 77
1.8.4更安全地载入你的数据 78
1.9.2介绍基于帧的内存 80
1.9.1常规内存分配的挑战 80
1.9基于帧的内存分配 80
Steven Ranck 80
1.9.3分配和释放内存 82
1.9.4例子 84
1.9.5 结论 86
1.10.2位数组 87
1.10.1概述 87
1.10简单快速的位数组 87
AndrewKirmse 87
1.10.3其他数组 88
1.10.5参考文献 89
1.10.4应用 89
1.11.2篡改报文 90
1.11.1 定义 90
1.11在线游戏的网络协议 90
AndrewKirmse 90
1.11.3报文重放 91
1.11.5逆向工程 92
1.11.4其他技术 92
1.11.7参考文献 93
1.11.6实现 93
1.12.1 Assert基础 94
Steve Rabin 94
1.12最大限度地利用Assert 94
1.12.3 Assert技巧#2:嵌入更多更多信息 95
1.12.2 Assert技巧#1:嵌入更多信息 95
1.12.5 Assert技巧#4:编写自己的assert宏 96
1.12.4 Assert技巧#3:使之更好用一些 96
1.12.7 Assert技巧#6:给“超级铁杆” 97
1.12.6 Assert技巧#5:无价之宝 97
1.12.9参考文献 98
1.12.8 Assert技巧#7:让它更简单——复制和粘贴 98
1.13.1 Why:需求驱动的技术 99
John Olsen 99
1.13 Stats:实时统计和游戏内调试 99
1.13.3 What:一个基于C++类的系统 100
1.13.2 How:一个进化过程 100
1.13.5 小结 102
1.13.4 Where:可用性 102
1.14.1开始考虑细节 103
Steve Rabin 103
1.14实时的游戏内建剖析 103
1.14.2剖析器将告诉你什么? 104
1.14.3增加剖析器调用 105
1.14.4剖析器的实现 106
1.14.7处理剖析数据的细节 107
1.14.6 ProfileEnd的细节 107
1.14.5 ProfileBegin的细节 107
1.14.9将它们组合起来 108
1.14.8后期增强 108
1.14.10参考文献 113
2.0.1可预测随机数 117
Guy W.Lecky-Thompson 117
第2章 数学技巧 117
2.0可预测随机数 117
2.0.2替换算法 119
2.0.3无限宇宙算法 120
2.0.4结论与展望 122
2.0.5参考文献 123
2.1.1使用浮点数学的帧速相关ease-out 124
John Olsen 124
2.1插值方法 124
2.1.2使用整型数学的帧速相关ease-out 125
2.1.3帧速无关线性内插 126
2.1.4帧速无关ease-in和ease-out 127
2.1.5危险地带 128
2.2.1运动学:平移和旋转 132
Miguel Gomez 132
2.2求刚体运动方程的积分 132
2.2.2动力学:力与旋转力矩(torque) 135
2.2.3刚体的特性 136
2.2.4求运动方程的积分 139
2.2.5 参考文献 140
2.3三角函数的多项式逼近 141
2.3.1 多项式 142
Eddie Edwards 142
2.3.2定义域和值域 143
2.3.4泰勒级数 146
2.3.3偶多项式和奇多项式 146
2.3.5截断的泰勒级数 149
2.3.6拉格朗日级数 150
2.3.8结论 153
2.3.7不连续性处理 153
2.4.2显式的欧拉方法 155
2.4.1 求初值问题的积分及稳定性 155
2.4为数字稳定性而利用隐式欧拉积分 155
Miguel Gomez 155
2.4.3隐式欧拉方法 156
2.4.7参考文献 158
2.4.6结论 158
2.4.4不准确性 158
2.4.5寻找隐式解 158
2.5.1原理 160
Lo?c le Chevalier 160
2.5小波:理论与压缩 160
2.5.3应用 162
2.5.2一个实例 162
2.5.4参考文献 163
2.6.1二维波动方程 164
Miguel Gomez 164
2.6水面的交互式模拟 164
2.6.3实现问题 166
2.6.2边界条件:岛屿和海岸线 166
2.6.4与水面交互 167
2.6.5渲染 169
2.6.6参考文献 170
2.7.1将四元数当作矩阵替换物 171
Jan Svarovsky 171
2.7游戏编程四元数 171
2.7.3 X、Y、Z和W代表什么 172
2.7.2为什么不使用欧拉角 172
2.7.4源自什么数学基础 173
2.7.6参考文献 174
2.7.5四元数如何表示旋转 174
2.8.2四元数到矩阵的转换 175
2.8.1 四元数旋转 175
2.8矩阵和四元数之间的转换 175
JasonShankel 175
2.8.3矩阵到四元数的转换 177
2.8.4参考文献 178
2.9.2四元数插值 179
2.9.1四元数计算 179
2.9四元数插值 179
Jason Shankel 179
2.9.4推导 182
2.9.3示例代码 182
2.10.2数值不稳定性 186
2.10.1动机 186
2.10最短弧四元数 186
Stan Melax 186
2.10.3稳定公式的推导 187
2.10.5源代码 188
2.10.4残存不稳定性条件 188
2.10.7参考文献 189
2.10.6虚拟跟踪球 189
3.0.1事件驱动与轮询的对比 193
SteveRabin 193
第3章 人工智能 193
3.0设计一个通用、健壮的AI引擎 193
3.0.4 一个使用消息的事件驱动状态机 194
3.0.3状态机 194
3.0.2消息概念 194
3.0.6另一个小交待 197
3.0.5交待时间(ConfessionTime) 197
3.0.8状态机消息路由选择 198
3.0.7状态机构建单元 198
3.0.10发送延迟的消息 200
3.0.9发送消息 200
3.0.12增强:定义消息的范围 201
3.0.11删除游戏对象 201
3.0.15增强:多状态机 203
3.0.14增强:交换状态机 203
3.0.13增强:记录所有的消息活动和状态变迁 203
3.0.18结论 204
3.0.17代码外部脚本化行为 204
3.0.16增强:一个状态机队列 204
3.0.19参考文献 207
3.1一个有限状态机类 208
3.1.2定义FSMstate 210
3.1.1 FSMclass和FSMstate 210
Eric Dybsand 210
3.1.3定义FSMclass 211
3.1.4为FSM创建状态 212
3.1.5 使用FSM 213
3.1.6参考文献 219
3.2博弈树 220
3.2.1 极小极大算法的负极大改进算法 221
JanSvarovsky 221
3.2.2α-β剪枝 222
3.2.3走步排序方法 223
3.2.5参考文献 224
3.2.4α-β求精 224
3.3.2方法概述 225
3.3.1 问题 225
3.3 A*路径规划基础 225
Bryan Stout 225
3.3.4将A*应用到游戏路径规划 227
3.3.3 A*的特性 227
3.3.5 A*的弱点 231
3.3.7参考文献 232
3.3.6进一步的工作 232
3.4.1直路径 233
Steve Rabin 233
3.4 A*审美优化 233
3.4.3平滑路径 234
3.4.2多边形搜索空间中的直路径 234
3.4.4预先计算的Catmull-Rom公式 235
3.4.5改进分级路径的直接性 236
3.4.7在分级搜寻过程中减少停顿 238
3.4.6空旷区域上的分级寻径 238
3.4.10参考文献 239
3.4.9结论 239
3.4.8最大化响应率 239
3.5.1搜索空间优化 240
Steve Rabin 240
3.5 A*速度优化 240
3.5.2算法优化 244
3.5.3结论 248
3.5.4参考文献 253
3.6.1简述 254
Greg Snook 254
3.6简化的3D运动和使用导航网格进行寻径 254
3.6.2构造 255
3.6.3滚动骰子并且移动鼠标 256
3.6.4到此仅完成一半 258
3.6.5它是有效的,但不是那么完美 260
3.6.6结论 261
3.6.7参考文献 269
3.7 Flocking:一种模拟群体行为的简单技术 270
3.7.1 实现 271
Steven Woodcock 271
3.7.2代码 273
3.7.3局限性与可能的改进 276
3.7.4资源与致谢 282
3.8.1模糊逻辑如何工作 283
Mason McCuskey 283
3.8用于视频游戏的模糊逻辑 283
3.8.2模糊逻辑运算 285
3.8.3为模糊控制而刹车 286
3.8.6资源 291
3.8.5结论 291
3.8.4模糊逻辑的其他应用 291
3.9.1生物学仿真 292
André LaMothe 292
3.9神经网络初探 292
3.9.2对游戏的应用 293
3.9.3神经网络101 294
3.9.4纯逻辑,Mr.Spock 298
3.9.5分类与“图像”识别 302
3.9.6 Hebbian的Ebb 305
3.9.7运行Hopfield 306
3.9.8结论 309
4.0.1 即时模式 313
HerbertMarselas 313
第4章 多边形技术 313
4.0为OpenGL优化顶点提交 313
4.0.2交叉存取数据 314
4.0.3步数据和流数据 315
4.0.4编译过的顶点数组 316
4.0.6数据格式 317
4.0.5取消数据复制厂家指定扩展 317
4.0.8结论 318
4.0.7一般建议 318
4.0.9参考文献 319
4.1.1考察投影矩阵 320
Eric Lengyel 320
4.1调整顶点的投影深度值 320
4.1.3选择一个适当的ε 321
4.1.2矫正深度值 321
4.1.5源代码 323
4.1.4实现 323
4.2矢量摄像机 324
4.2.1矢量摄像机初步 325
David Paull 325
4.2.2本地空间优化 326
4.2.3 结论 327
4.3.1一种基本的第一人称摄像机 328
Dante Treglia II 328
4.3摄像机控制技术 328
4.3.2脚本摄像机 330
4.3.3摄像机技巧 333
4.4.1 视域棱台 337
EricLengyel 337
4.4一种快速的圆柱棱台相交测试算法 337
4.4.2计算有效半径 338
4.4.3算法 339
4.4.4实现 341
4.5.2包围球碰撞检测 346
4.5.1算法概述 346
4.5 3D碰撞检测 346
Kevin Kaiser 346
4.5.3三角形对三角形的碰撞检测 348
4.6.2对象大小变化的问题 358
4.6.1使用栅格 358
4.6用于交互检测的多分辨率地图 358
JanSvarovsky 358
4.6.3多分辨率地图 359
4.6.4源代码 360
4.7.1问题 368
Steven Ranck 368
4.7计算到区域内部的距离 368
4.7.2算法描述 369
4.7.3应用 371
4.8.1可视棱台裁剪 376
TimRound 376
4.8对象阻塞剔除 376
4.8.2阻塞剔除 378
4.8.3 总结 379
4.9.1 LOD选择 387
Yossarian King 387
4.9永远不要让他们看到你的“抖动”——几何体细节层次选择问题 387
4.9.3滞变阈值 389
4.9.2放大率因子 389
4.9.4实现 390
4.9.5其他问题 391
4.10.1八叉树概述 393
Dan Ginsburg 393
4.10八叉树构造 393
4.10.3建立树 394
4.10.2八叉树数据 394
4.10.4多边形重叠 395
4.10.7结论 396
4.10.6应用 396
4.10.5相邻节点 396
4.10.8参考文献 397
4.11.1 四叉树 398
ThatcherUlrich 398
4.11松散的八叉树 398
4.11.2包围体 399
4.11.3划分物体 400
4.11.4使它松散 402
4.11.5 比较 405
4.11.6结论 406
4.12.1渐进网格概述 407
JanSvarovsky 407
4.12独立于观察的渐进网格 407
4.12.2关于这个主题的变种 408
4.12.4难处理的边 410
4.12.3边缘选择函数 410
4.12.5实现 411
4.12.6源代码 414
4.12.7参考文献 415
4.13.1 线性插值 416
HerbertMarselas 416
4.13插值的3D关键帧动画 416
4.13.3 Hermite样条插值 418
4.13.2对顶点和法线进行插值 418
4.13.4对顶点进行样条插值 420
4.13.7参考文献 421
4.13.6总结 421
4.13.5为什么用Hermite样条 421
4.14.2方法 422
4.14.1为什么对低多边形有价值 422
4.14一种快速而简单的皮肤构造技术 422
TorgeirHagland 422
4.14.3总结 423
4.14.4参考文献 426
4.15填充间隙——使用缝合和皮肤构造的高级动画 427
4.15.1缝合 428
Ryan Woodland 428
4.15.2皮肤构造(Skinning) 430
4.15.3进一步的问题 432
4.16.1风景设计 434
Guy W.lecky-Thompson 434
4.15.4 参考文献 434
4.16实时真实地形生成 434
4.16.2建筑物 439
4.16.3命名算法 442
4.16.4参考文献 446
4.17.2减少dHeight 447
4.17.1 断层构造 447
4.17分形地形生成——断层构造 447
JasonShankel 447
4.17.3生成随机直线 448
4.17.4腐蚀(erosion) 449
4.17.6参考文献 450
4.17.5示例代码 450
4.18.1一维中点置换 451
JasonShankel 451
4.18分形地形生成——中点置换 451
4.18.2二维中点置换——菱形正方形算法 452
4.18.3高地中的菱形——正方形算法 454
4.19.2粒子沉积 455
4.19.1 MBE模型 455
4.19分形地形生成——粒子沉积 455
Jason Shankel 455
4.19.3倒置火山口 457
4.19.5参考文献 458
4.19.4示例代码 458
5.0.1 方法 461
YossarianKing 461
第5章 像素特效 461
5.0 2D镜头光晕 461
5.0.2实现 462
5.0.3源代码 464
5.1.2建立3D场景 465
5.1.1进入D 465
5.1将3D硬件用于2D子画面特效 465
Mason McCuskey 465
5.1.4绘制3D子画面 466
5.1.3建立纹理 466
5.1.6结论 468
5.1.5添加特效 468
5.2.1传统的静态光照 469
Steven Ranck 469
5.2基于运动的静态光照 469
5.2.2基于运动静态光照 472
5.2.3结论 477
5.3.1光照方法 478
Jorge Freitas 478
5.3使用定点颜色插值模拟实时光照 478
5.3.3插值光 479
5.3.2美工创作 479
5.3.4结论 480
5.4.1讲解 485
Sim Dietrich 485
5.4衰减图 485
5.4.2比较衰减图与光照图 488
5.4.6结论 489
5.4.5其他形状 489
5.4.3 CSG效果 489
5.4.4基于范围的雾 489
5.5.2纹理投影 490
5.5.1简单纹理坐标动画 490
5.5使用纹理坐标生成技术的高级纹理 490
Ryan Woodland 490
5.5.3反射映射 493
5.5.4参考文献 494
5.6.1如何将凹凸图应用于对象上 495
Sim Dietrich 495
5.6硬件凹凸贴图 495
5.6.3另一种方法使用正切空间凹凸贴图 496
5.6.2为法线选择一个空间 496
5.6.4解决方案:纹理空间凹凸贴图 498
5.6.6结论 499
5.6.5纹理空间问题 499
5.6.7参考文献 500
5.7.1 阴影数学 501
YossarianKing 501
5.7底面阴影 501
5.7.2实现 503
5.7.3扩展 504
5.8.2光源、遮挡物体和接收物体 505
5.8.1介绍 505
5.8复杂对象上的实时阴影 505
Gabor Nagy 505
5.8.4创建阴影图 507
5.8.3本文的目的 507
5.8.5在接收物体上投影阴影图 513
5.8.6渲染接收物体 514
5.8.7对基本算法的扩展与改进 514
5.8.8参考文献 515
5.9使用光滑预过滤和Fresnel项改善环境映射反射 516
Anis Ahmad 516
5.9.1第一个不正确的假设 516
5.9.2第二个不正确的假设 518
5.9.3结论 518
5.9.4致谢 519
5.9.5参考文献 519
5.10.3光栅化程序、帧缓冲、Z缓冲和像素混合 520
5.10游戏中玻璃的效果 520
GaborNagy 520
5.10.1介绍 520
5.10.2透明物体 520
5.10.4不透明物体与透明物体 521
5.10.5绘制不透明物体 522
5.10.6绘制透明物体 522
5.10.8有色玻璃 525
5.10.9 将它们放到一起 525
5.10.7 反射 525
5.10.10实现 526
5.10.11 参考文献 526
5.11.1介绍 527
Alex Vlachos,Jason L.Mitchell 527
5.11.2折射项 527
5.11用于容器中液体的折射贴图 527
5.11.3反射项 528
5.11.4 Fresnel项 529
5.11.5使用硬件渲染 529
5.11.6该技术的扩展 530
5.11.7结论 531
5.11.8参考文献 531
第6章 附录 535
6.0矩阵工具库 535
Dante Treglia II,MarkA.DeLoura 537
6.1文本工具库 537
Dante Treglia II 538
6.2关于随书光盘 538
MarkA.DeLoura 539
作者索引 539