← 返回信息流
GitHub 热榜GitHub Trending · 周·2 小时前

JoltPhysics —— 多核友好的刚体物理与碰撞检测库

原标题:jrouwe/JoltPhysics
C++10,910 stars+271 本周

速览

核心功能包括刚体物理模拟与碰撞检测,支持多线程并行计算,适用于AAA游戏如《地平线:西之绝境》和《死亡搁浅2》。

AI 深度解读

这是什么

JoltPhysics 是一个面向多核 CPU 的刚体物理与碰撞检测库,使用 C++ 编写,主仓库在 GitHub 上开源(jrouwe/JoltPhysics),目前拥有超过 10,900 颗星。它被用于《地平线:西之绝境》和《死亡搁浅 2:海滩》等大型游戏,定位是游戏与 VR 应用的物理引擎。与常见物理引擎不同,JoltPhysics 从设计之初便强调多线程友好、确定性模拟以及后台数据加载/卸载能力,核心只依赖 C++17 标准库,不依赖 RTTI 和异常。

解决的问题

大多数物理引擎在设计时假设物理模拟是主线程的唯一任务,但现代游戏需要同时处理大量系统(AI、渲染、网络、流式加载)。JoltPhysics 直接面对以下痛点:

  • 多线程竞争:游戏行为发生在多个线程上,物理数据需要被并发访问。JoltPhysics 允许在物理模拟主循环之外,多个线程安全地读取、添加或移除物理体,而不阻塞主模拟。
  • 后台加载/卸载:关卡流式加载时,需要在不锁住物理世界的前提下准备一批物理体。JoltPhysics 支持在后台线程上批量构建,然后以极小的性能开销插入模拟世界。
  • 碰撞查询与模拟并行:通常碰撞查询(如射线检测、形状投射)需要等物理模拟完成才能进行。JoltPhysics 允许在模拟步骤之前进行粗检测(broadphase),然后在后台线程进行细检测(narrowphase),使耗时的任务(如导航网格生成)可以跨帧分布。
  • 意外唤醒导致性能抖动:加载/卸载内容时,创建或删除物理体常常会意外唤醒相邻物体,导致性能毛刺。JoltPhysics 默认新物体创建时不自动唤醒,删除物体时也不唤醒邻居,可由开发者手动触发。
  • 确定性模拟:联网游戏需要客户端与服务器同步物理状态。JoltPhysics 提供确定性模拟,仅通过同步输入即可复现模拟结果(有明确限制,见文档)。

核心功能

  • 刚体形状支持:球体、盒子、胶囊、锥形胶囊、圆柱、锥形圆柱、凸包、平面、复合体、网格(三角形)、地形(高度场),并支持连续碰撞检测(CCD)。
  • 约束系统:固定、点、距离(含弹簧)、铰链、滑块(棱柱)、锥、齿条与齿轮、齿轮、滑轮、平滑样条路径、摆动-扭转(用于类人肩部)、6 自由度约束,以及驱动这些约束的电机。
  • 碰撞检测:射线投射、形状与形状测试、形状投射、粗检测(仅 broadphase)快速找出可能相交的物体、传感器(触发体积)。
  • 动画布娃娃(ragdoll):硬关键帧(仅运动学刚体)、软关键帧(设置动力学刚体速度)、驱动约束电机到动画姿势、高细节骨架与低细节骨架之间的映射。
  • 角色模拟:胶囊体刚体角色(物理模拟中移动,成本最低且与动态体碰撞最准确)、虚拟角色(无物理体,通过碰撞检测模拟,在物理更新外运行,控制更灵活但动态交互精度较低)。
  • 车辆模拟:轮式车辆、履带式车辆、摩托车。
  • 软体模拟:软球、布料等。包括边约束、二面角弯曲约束、Cosserat 杆约束(带方向的边,可定向几何体,如植物叶片)、四面体体积约束、远程附着约束(tether)、限制模拟在蒙皮顶点范围内、内部压力、与刚体碰撞、软体之间的碰撞检测。
  • 头发模拟(GPU):基于 Cosserat 杆的束状头发模拟,支持引导发和渲染发,利用网格累积平均速度处理发间碰撞,支持环境碰撞(目前仅凸包和复合体),发根可蒙皮到头骨网格。
  • 浮力计算:水体浮力。
  • 双精度模式:可选,用于大世界场景。
  • 跨平台支持:Windows(x86/x64/ARM64)、Linux(Ubuntu x86/x64/ARM32/ARM64/RISC-V64/LoongArch64/PowerPC64LE)、FreeBSD、Android(x86/x64/ARM32/ARM64)、Platform Blue(游戏主机,x64,需 NDA 提供平台头文件)、macOS(x86/ARM64)、iOS(x86/ARM64)、MSYS2 MinGW64、WebAssembly。
  • 指令集优化:x86/x64 最低要求 SSE2,可选 SSE4.1、SSE4.2、AVX、AVX2、AVX512;ARM64 使用 NEON 和 FP16。

亮点 / 与同类相比

与 Bullet、PhysX、Havok 等主流物理引擎相比,JoltPhysics 最突出的差异在于:

  1. 多线程数据访问的细粒度控制:不止是模拟并行,而是允许外部线程在模拟进行中并发地添加/删除/更新物理体,并保证一致的 before/after 状态。这种设计直接服务于现代游戏引擎的 job 系统,例如 Horizon Forbidden West 的流式加载。
  2. 确定性模拟:许多引擎宣称确定性,但实际受浮点精度和线程调度影响。JoltPhysics 明确给出限制条件和文档,方便复制到远程客户端。
  3. 后台批处理:批量构建物理体时不锁定主世界,插入时影响极小,非常适合开放世界关卡切换。
  4. 毛发模拟原生支持 GPU:大多数引擎将毛发作为独立插件或付费中间件,JoltPhysics 内置了 GPU 头发生成与模拟系统。
  5. 轻量依赖:只依赖 C++17 STL,无 RTTI,无异常,编译速度快,集成方便。
  6. 开源 MIT 许可:商业友好,可自由使用修改。

适合谁用 / 上手

  • 游戏引擎开发者:需要将物理集成到自有引擎中,且对多线程、大世界流式加载、确定性要求高。
  • VR 应用开发者:需要精确的碰撞反馈和低延迟,JoltPhysics 的 CCD 和传感器机制适合 VR 交互。
  • 独立游戏或小团队:希望避开 PhysX 的闭源限制或 Bullet 的线程模型不足,JoltPhysics 提供成熟、文档齐全的解决方案。
  • 研究或教学:代码结构清晰,单元测试完善,可作为学习物理引擎实现的参考。

上手方式:仓库中提供了 HelloWorld 示例(含 CMake FetchContent 版本),以及 Samples 应用(每个功能对应一个独立示例)。构建文档位于 Build 目录,支持 VS 2022+、Clang 16+、GCC 12+。官方文档包括架构说明和 API 参考,GDC 2022 演讲幻灯片详细解释了设计决策。

查看原文 →github.com