本书是常用线性代数和碰撞检测游戏的综合指南,但仅简要介绍了碰撞解决(物理)主题。本书结构如下:
本书涵盖的所有主题都用于逐步构建刚体物理引擎。最后三章(14、15 和 16)实现了粒子物理、刚体物理和软体物理(布料)。提供的附录简要介绍了高级主题、探索这些主题的资源以及探索游戏物理的其他资源。
为这本书创建的一些图表并没有很好地印刷出来。为了解决这个问题,我已将所有书中的图表包含在此存储库中,并在线发布这些图表:https://github.com/gamephysicalscookbook/Figures
本书的前三章致力于教授游戏开发所需的基本线性代数。每个概念都在数学背景下进行解释,为每个概念提供源代码,并且当可以直观地探索某些内容时还提供图像。在前三章中创建了以下数据结构:
vec2
)vec3
)mat2
)mat3
)mat4
)如果可能,矩阵运算以通用方式实现。例如,提供了将两个任意大小的矩阵相乘的代码。
本书涵盖了以下交叉点:
观点 | 线 | 射线 | 领域 | AABB | 奥布 | 飞机 | 三角形 | 截锥体 | |
---|---|---|---|---|---|---|---|---|---|
观点 | |||||||||
线 | |||||||||
射线 | |||||||||
领域 | |||||||||
AABB | |||||||||
奥布 | |||||||||
飞机 | |||||||||
三角形 | |||||||||
截锥体 |
第 14 章介绍了朴素粒子物理学,本章旨在介绍如何建立物理循环并考虑物理循环的一般格式。第15章是最有趣的一章,它实现了一个基本的刚体物理引擎。基本引擎支持定向盒子和球体,可以使堆叠工作,但不直接支持。第 16 章介绍了弹簧以及如何使用弹簧来实现软体物理。本书的最后一个演示是软体、布料物理演示。
这是我的第一本书,我学到了很多关于写作过程的知识;也许更多的是关于规划。以下是我在写这本书时发现的一些我没有正确计划的事情的列表:
四元数:拥有四元数是必须的!我计划使用欧拉旋转和旋转矩阵来写这本书。虽然这有效,但获得四元数会让事情变得容易得多。
Planes :平面相交不应返回布尔值,它们应将相交分类为:后面、相交、前面。最好,如果交叉路口在前面或后面,您希望返回一些距离指示。这在进行视锥体剔除时变得非常有用。我不知道我要写多深入的平截头体,所以我决定做简单的布尔交集。
光线投射:我应该编写光线投射以从一开始就返回光线投射结果。后来不得不返回并重新编写光线投射 API,结果发现用文本表达比我预期的更复杂。这背后的困难是一开始就让事情变得简单,只在需要时才变得复杂。
源代码的物理实现存在各种问题。这些问题来自于本书的物理部分必须压缩为三章这一事实。只是没有足够的时间来涵盖制作强大的刚体物理系统所需的所有内容。该引擎最大的问题是没有Arbiter 。
如果没有仲裁器,我们就无法构建顺序脉冲求解器。这给我们留下了一个相当简单的脉冲求解器。问题是,每帧的每个接触都解决了脉冲。这会导致过度滑动。我通过线性投影和积极的摩擦偏置来补偿顺序脉冲的缺乏。较旧的物理引擎也做了类似的事情,即依靠强硬的睡眠来掩盖问题。不用说,睡眠并没有实现。
如果我有机会写本书的第二版,我将删除有关二维碰撞的章节(第4、5和6章)并减少场景管理章节的页数。我计划使用额外的页面来涵盖以下主题: