《游戏物理引擎开发》详细阐述了与游戏物理引擎相关的高效解决方案及相应的数据结构和算法,主要包括粒子数学、运动定律、粒子物理引擎、合力、弹力、硬约束条件、质体物理引擎、旋转操作的数学知识、刚体运算定律、刚体物理引擎、碰撞检测、生成碰撞、碰撞处理方案、静态接触和摩擦力、稳定性和优化问题、整合方案以及其他物理引擎等内容。此外,本书还提供了相应的算法、代码以及伪代码,以帮助读者进一步理解相关方案的实现过程。
《游戏物理引擎开发》适合作为高等院校计算机及相关专业的教材和教学参考书,也可作为相关开发人员的自学教材和参考手册。
本人于20世纪80年代踏上游戏编程之路,当时正是8位机风行的年代,低预算与较短的开发周期鼓励研发人员不断尝试和创新,其中不乏某些游戏精品。至今,我依然对两款游戏印象深刻,它们均采用了真实的物理行为作为游戏体验的核心内容。
第一款游戏由Jeremy Smith开发,并针对英国BBC Micro家用计算机平台而发布,即Thrust。该游戏根据街机游戏Gravitar改编,其中藤叶状船只游弋于地下溶洞之间,且通过2D物理模拟对其加以支配。游戏任务是窃取大型燃料棒,并通过线缆连接至船体。随后,相对简单的船体模型演变为两个大型对象之间的交互行为。游戏本身颇具挑战性且令人欲罢不能,因而不失为一款经典游戏。
第二款游戏则是Exile,由Peter Irvin和Jeremy Smith联袂开发。该游戏具有一定的创造性且令人印象深刻,游戏所蕴含的技术亮点已超出了物理范畴,例如游戏对象的过程式构建方式。
游戏Exile中的物理内容体现于游戏中的各个对象上。其中,发射物沿弹道轨迹行进;玩家可投掷手榴弹,且爆炸冲击波可掀翻周围物体;玩家可负重前行且身体呈弯曲状态;另外,玩家还可漂流于水面上。总之,游戏Exile首次采用了相对完整的物理引擎。
尽管游戏Exile发布于1988年,但其物理编码内容并不落伍。本人于1999年涉足游戏物理引擎程序设计,并在一款赛车游戏中负责车辆模型的物理引擎开发,期待中一个月的开发周期最终变得遥遥无期。
开始阶段,物理问题并未引起足够重视,因而产生了各种各样的问题。例如,硬质悬挂弹簧将车辆以螺旋方式弹射至无限远处;摩擦力导致轮胎高速旋转时产生振动现象;硬质表面呈现为软质橡胶材质。对此,我曾尝试了多种处理方案,包括冲量方案、Jacobian方案、规约坐标方案以及模拟物理方案,其学习曲线不同于之前任何游戏编码经历。
尽管开发时间超出了最后的期限(开发内容为向第三人称射击行为提供物理驱动),但公司人员依然对各个中间件物理系统进行了严格检测,本人也从中了解到各类方案的优缺点。在随后的开发岁月中,本人所编写的代码体现了一定的复用性,并应用于多个不同场合。随着经验的不断积累,本人也研发了多款物理引擎,并为诸多应用制定了相关的物理解决方案。关于如何获取最为简单的方案以及最佳物理效果,我自认为具有正确的判断力。
游戏开发已步入了物理模拟商品化这一阶段,即物理模拟常出现于各类游戏中,且开发公司均会研制内部物理库,或对某一主要的中间件处理方案提供应用许可。尽管物理行为日趋普遍,但其研发阶段仍可视为一个黑盒过程,即开发人员负责实现物理行为,其他团队则直接使用结果。
关于游戏物理学,相关信息以及参考资料均假设读者具有一定的数学和物理知识。然而,某些著作仅罗列了相应的物理内容,且不包含对应的应用框架结构。更为糟糕的是,一些资料甚至包含了某些错误理论,进而使读者陷入困境。物理引擎通常较为复杂,且存在较大的优化和改良空间,部分内容还有待于进一步探讨研究。例如,在读者尝试实现Lemke枢轴算法之前,应于先期理解其基本概念并包含相应的代码测试框架。
本书源自个人初始阶段所经历的种种磨难,同时也希望本书能够填补这一方面的空白,且兼顾逻辑性和清晰易懂之特征,进而引领读者从零开始打造一款属于自己的物理引擎。本书仅是万里长征中的第一步,但却是坚实的一步,因为我们已然拥有了正确的方向。
本书附带光盘
本书附带光盘包含了源代码库,进而实现本书所讨论的各项技术以及示例程序。该代码库易于阅读,并辅以注释和应用示例。
本书附带光盘中的全部内容已上传至www.tup.com.cn,请读者自行下载。
关于作者
Ian Millington,IPR Ventures咨询公司合伙人,该公司致力于次世代技术的研发工作,涉及娱乐、建模技术以及模拟仿真技术。在此之前,他曾创办了Mindlathe Ltd(计算机游戏领域内一家最大的专业AI中间件公司),并涉足多种游戏类型以及开发技术。Ian Millington具有深厚的AI专业背景,包括复杂理论和自然计算博士项目研究。除此之外,他还发表了多篇专业学术论文和文章,内容涉及古生物学和超文本技术。同时,他还是Artificial Intelligence for Games一书的作者(该书由Morgan Kaufmann出版社于2006年出版)。
致谢
本书旨在打造一款健壮的游戏物理引擎,该过程历尽艰辛并得到了编码人员以及数学家们的巨大帮助,本书的出版源自他们所发表的论文和文章、SIGGRAPH大会演讲以及所发布的源代码。当然,我的感谢名单远不止于此,这里要着重感谢Chris Hecker,Andrew Watkin和David Barraf,其思想奠定了本书的编写风格。
感谢本书技术评审小组成员所付出的艰辛劳动,他们是Philip J. Schneider,Jonathan Purdy博士以及Eitan Grinspun,他们的建议极大地提升了本书的编写质量、可读性以及有效性。另外,这里还要特别感谢Dave Eberly,他对细节的关注令我受益匪浅。
本书编写时恰逢RandD咨询公司创业期,因而本书献给我的妻子Mel,感谢她两年来陪我度过无数个不眠之夜。
《游戏物理引擎开发》
第1章 概述
1.1 游戏物理
1.2 物理引擎
1.2.1 物理引擎的优点
1.2.2 物理引擎的缺点
1.3 物理引擎的实现方案
1.3.1 对象类型
1.3.2 碰撞处理方案
1.3.3 冲量和作用力
1.3.4 构建内容
1.4 物理引擎中的数学
1.4.1 必备的数学知识
1.4.2 数学知识回顾
1.4.3 本书引入的数学概念
《游戏物理引擎开发》
第1章 概述
1.1 游戏物理
1.2 物理引擎
1.2.1 物理引擎的优点
1.2.2 物理引擎的缺点
1.3 物理引擎的实现方案
1.3.1 对象类型
1.3.2 碰撞处理方案
1.3.3 冲量和作用力
1.3.4 构建内容
1.4 物理引擎中的数学
1.4.1 必备的数学知识
1.4.2 数学知识回顾
1.4.3 本书引入的数学概念
1.5 本书源代码
1.6 本书组织方式
第1部分 粒 子 物 理
第2章 粒子数学
2.1 向量
.2.1.1 左手空间和右手空间
2.1.2 向量和方向
2.1.3 标量和向量的乘法运算
2.1.4 向量的加法和减法运算
2.1.5 向量乘法
2.1.6 分量积
2.1.7 标量积
2.1.8 向量积
2.1.9 正交基向量
2.2 积分运算
2.2.1 微分学
2.2.2 积分运算
2.3 本章小结
第3章 运动定律
3.1 粒子
3.2 运动定律
3.2.1 牛顿第一定律
3.2.2 牛顿第二定律
3.2.3 力学方程
3.2.4 向粒子添加质量
3.2.5 动量和速度
3.2.6 重力
3.3 积分算式
3.3.1 更新方程
3.3.2 完整的积分算式
3.4 本章小结
第4章 粒子物理引擎
4.1 弹道轨迹
4.1.1 设置发射对象属性
4.1.2 实现方法
4.2 焰火效果
4.2.1 焰火数据
4.2.2 焰火效果规则集
4.2.3 实现方法
4.3 本章小结
第2部分 质量集合体物理
第5章 合力
5.1 d'alembert定理
5.2 作用力发生器
5.2.1 接口和多态
5.2.2 实现方法
5.2.3 重力发生器
5.2.4 阻力发生器
5.3 内建重力和阻尼机制
5.4 本章小结
第6章 弹力
6.1 胡克定律
6.1.1 弹力限制条件
6.1.2 弹性材质
6.2 弹力发生器
6.2.1 基础型弹力发生器
6.2.2 固定弹簧发生器
6.2.3 弹性橡皮筋
6.2.4 浮力发生器
6.3 硬质弹簧
6.3.1 硬质弹簧产生的问题
6.3.2 仿硬质弹簧
6.4 本章小结
第7章 硬约束条件
7.1 简单的碰撞解决方案
7.1.1 闭合速度
7.1.2 回弹系数
7.1.3 碰撞法向和碰撞法线
7.1.4 冲量
7.2 碰撞处理方案
7.2.1 碰撞检测
7.2.2 处理相交对象
7.2.3 静态碰撞
7.3 碰撞处理算法
7.3.1 处理顺序
7.3.2 时分引擎
7.4 类碰撞材质
7.4.1 绳索
7.4.2 连杆
7.5 本章小结
第8章 质体物理引擎
8.1 引擎概述
8.2 使用物理引擎
8.2.1 索桥和线缆
8.2.2 摩擦力
8.2.3 blob游戏
8.3 本章小结
第3部分 刚体物理系统
第9章 旋转操作的数学知识
9.1 二维环境下的旋转对象
9.1.2 角速度
9.1.3 原点和质心
9.2 三维环境中的方向
9.2.1 欧拉角
9.2.2 轴-角
9.2.3 旋转矩阵
9.2.4 四元数
9.3 角速度和加速度
9.3.1 点速度
9.3.2 角加速度
9.4 实现方案
9.4.1 矩阵类
9.4.2 矩阵乘法
9.4.3 逆矩阵和转置矩阵
9.4.4 将四元数转换为矩阵
9.4.5 转换向量
9.4.6 调整矩阵中的基向量
9.4.7 四元数类
9.4.8 四元数的标准化操作
9.4.9 四元数组合操作
9.4.10 旋转
9.4.11 基于角速度的更新操作
9.5 本章小结
第10章 刚体运算定律
10.1 刚体
10.2 基于旋转的牛顿第二定律
10.3 转矩
10.3.1 转动惯量
10.3.2 世界坐标系中的惯性张量
10.4 基于旋转的d'alembert定理
10.5 刚体积分运算
10.6 本章小结
第11章 刚体物理引擎
11.1 引擎概述
11.2 物理引擎应用
11.2.1 飞行模拟器
11.2.2 帆船模拟器
11.3 本章小结
第4部分 碰撞检测系统
第12章 碰撞检测
12.1 碰撞检测管线
12.2 粗略碰撞检测
12.3 包围体
12.3.1 层次结构
12.3.2 构造层次结构
12.3.3 子对象层次结构
12.4 空间数据结构
12.4.1 二分空间划分
12.4.2 八叉树和四叉树
12.4.3 网格方案
12.4.4 多分辨率图
12.5 本章小结
第13章 生成碰撞
13.1 碰撞几何体
13.1.1 图元组装
13.1.2 生成碰撞几何体
13.2 碰撞生成过程
13.2.1 碰撞数据
13.2.2 点-面碰撞
13.2.3 边-边碰撞
13.2.4 边-面碰撞
13.2.5 面-面碰撞
13.2.6 前期退出
13.3 图元碰撞算法
13.3.1 球体间的碰撞
13.3.2 球体和平面之间的碰撞
13.3.3 盒体与平面之间的碰撞
13.3.4 球体与盒体之间的碰撞
13.3.5 盒体间的碰撞
13.3.6 效率和通用多面体
13.4 本章小结
第5部分 接触型物理系统
第14章 碰撞处理方案
14.1 冲量和冲击转矩
14.1.1 冲击转矩
14.1.2 旋转碰撞
14.1.3 处理旋转碰撞
14.2 碰撞冲量
14.2.1 调整碰撞坐标系
14.2.2 基于冲量的速度变化
14.2.3 基于速度的冲量变化
14.2.4 计算期望速度变化
14.2.5 冲量计算
14.2.6 冲量应用
14.3 处理相交行为
14.3.1 方案选取
14.3.2 实现非线性投影
14.3.3 避免过度的旋转
14.4 碰撞处理过程
14.4.1 碰撞处理管线
14.4.2 预置碰撞数据
14.4.3 处理相交问题
14.4.4 处理速度
14.4.5 更新算法的替代方案
14.5 本章小结
第15章 静态接触和摩擦力
15.1 静态作用力
15.2 微碰撞
15.2.1 移除速度
15.2.2 减少复原
15.2.3 计算最新速度
15.3 摩擦力类型
15.3.1 静态摩擦力和动态摩擦力
15.3.2 各向同性摩擦力和各向异性摩擦力
15.4 摩擦力实现方案
15.4.1 基于冲量的摩擦力
15.4.2 调整速度处理算法
15.4.3 整合方案
15.5 碰撞和连续碰撞处理
15.6 本章小结
第16章 稳定性和优化问题
16.1 稳定性
16.1.1 四元数漂移
16.1.2 斜面上的相交
16.1.3 积分稳定性
16.1.4 保守碰撞检测的优点
16.1.5 调整数学精确度
16.2 优化操作
16.2.1 休眠机制
16.2.2 相交和速度误差处理
16.2.3 碰撞(接触)分组机制
16.2.4 代码优化
16.3 本章小结
第17章 整合方案
17.1 引擎综述
17.2 物理引擎应用
17.2.1 布娃娃系统
17.2.2 断裂物理学
17.2.3 爆炸物理学
17.3 引擎的局限性
17.3.1 堆砌型对象
17.3.2 反作用力摩擦力
17.3.3 关节组装
17.3.4 硬质弹簧
17.4 本章小结
第6部分 扩 展 引 擎
第18章 其他物理引擎
18.1 同步碰撞处理
18.1.1 jacobian方案
18.1.2 线性互补问题
18.2 约化坐标方案
18.3 本章小结
参考文献
附录a 常见惯性能量
a.1 离散质体
a.2 连续质体
a.3 常见形状
a.3.1 长方体
a.3.2 球体
a.3.3 圆柱体
a.3.4 圆锥体
附录b 游戏中常见的摩擦系数
附录c 其他程序设计语言
c.1 c语言
c.2 java语言
c.3 公共语言运行库(.net)
c.4 lua语言
附录d 数学背景知识
d.1 向量
d.2 四元数
d.3 矩阵
d.4 积分运算
d.5 物理运算
d.6 其他公式