这一章描述了物理引擎的结构,并对整个系列文章的路线进行介绍
游戏物理概述
常见的物理引擎由如下几部分组成:

最基础的:
数学库:或者说线性代数库。基本上都需要支持SIMD,因为物理是需要高性能的系统。市面上大部分开源的都是自研(PhysX, Jolt, Bullet, UE的Chaos)。我这个系列就直接调库了(Eigen库)
几何和空间划分:
几何:几何体信息和碰撞检测相关算法:
- 几何体构建:比如从点云构建凸包的凸包算法,快速构建AABB等BV的BV构建算法
- 碰撞检测相关:包括几何体之间的判交,最小穿透深度计算,支撑点计算,射线和扫略检测等
几何是最基本的功能,无论是Query还是Simulation solver都需要他提供信息
空间划分:用来加速碰撞检测相关算法的辅助功能
模拟:使用物理定律进行物理模拟。这里的核心是模拟解算器(Simulate Solver)。不同引擎会使用不同的模拟算法,一般针对刚体使用基于冲量的算法及其变体(比如TGS, PGS等),刚体算法中还有约束求解器(用于碰撞分离和Joint结构)。对于软体和流体使用PBD/XPBD算法。不过现在PBD算法也可以用于刚体模拟(比如UE的Chaos)
模拟大部分时间是在做表现相关的事情(纯提供视觉效果的)
查询:包含三大查询算法——Raycast, Sweep, Overlap。在游戏中查询往往用的比模拟更广泛,比如物体判定,人物被障碍物阻挡判定,FPS中子弹判定,空气墙,Trigger等。
查询使用纯粹的几何算法,和物理定律无关
基于物理引擎的各种上层实现:这里所有的功能都是用户可以使用物理引擎实现的。只不过有些实现是引擎自己就有的(比如PhysX对载具,破坏物体,布料模拟都支持)。常见的为:
- Ragdoll:布娃娃系统。一般只使用模拟
- 破坏系统:一般也只使用模拟,用来模拟碎块
- 布料/流体模拟
- 基于物理的动画:可能使用模拟(比如物理和动画融混)或者查询
- 载具:可以完全使用模拟,也可以模拟+查询(比如PhysX的载具轮子是用查询做的)
- CCT:人物控制器,一般是纯查询(但JoltPhysics也提供了基于模拟的CCT)
- 其他的游戏项目相关功能
本系列的路线
ToyPhysics(开发中)
Github地址:ToyPhysics
引擎自带一个sandbox,里面显示各种各样的例子。使用raylib创建可视化。
路线
从组成图的下往上实现。首先是几何和空间划分算法。然后是Query系统(因为Query只依赖几何不依赖模拟)。然后尝试各种模拟算法,主要是刚体模拟(不包含PBD)和约束求解等。然后实现PDB算法,并且实现布料模拟。然后反过来,使用PBD模拟刚体。最后做剩下的上层应用(CCT,载具,破坏物)。
整个架构和API应该会很像PhysX。因为PhysX是我用的最多的物理引擎。