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