从0开始制作游戏物理引擎(一)

这一章描述了物理引擎的结构,并对整个系列文章的路线进行介绍

游戏物理概述

常见的物理引擎由如下几部分组成:

PhysicsArch

最基础的:

  • 数学库:或者说线性代数库。基本上都需要支持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

使用Eigen作为数学库。spdlog作为日志输出库。

引擎自带一个sandbox,里面显示各种各样的例子。使用raylib创建可视化。

路线

从组成图的下往上实现。首先是几何和空间划分算法。然后是Query系统(因为Query只依赖几何不依赖模拟)。然后尝试各种模拟算法,主要是刚体模拟(不包含PBD)和约束求解等。然后实现PDB算法,并且实现布料模拟。然后反过来,使用PBD模拟刚体。最后做剩下的上层应用(CCT,载具,破坏物)。

整个架构和API应该会很像PhysX。因为PhysX是我用的最多的物理引擎。

updatedupdated2026-07-172026-07-17