jrouwe/JoltPhysics
GitHub: jrouwe/JoltPhysics
Jolt Physics 是一个高性能、多核友好的 C++ 刚体物理与碰撞检测库,专为游戏和 VR 应用设计。
Stars: 9719 | Forks: 663
[](https://cla-assistant.io/jrouwe/JoltPhysics)
[](https://github.com/jrouwe/JoltPhysics/actions/)
[](https://sonarcloud.io/dashboard?id=jrouwe_JoltPhysics)
[](https://sonarcloud.io/dashboard?id=jrouwe_JoltPhysics)
[](https://sonarcloud.io/dashboard?id=jrouwe_JoltPhysics)
[](https://sonarcloud.io/dashboard?id=jrouwe_JoltPhysics)
# Jolt 物理
一个对多核心友好的刚体物理和碰撞检测库。适用于游戏和 VR 应用。被《地平线 西之绝境》 和《死亡搁浅 2:冥滩之上》 采用。
[](https://www.playstation.com/en-us/games/horizon-forbidden-west/)
[](https://www.playstation.com/en-us/games/death-stranding-2-on-the-beach/)
|[](https://www.youtube.com/watch?v=pwyCW0yNKMA)|
|:-|
|*一段展示使用 Jolt Physics 模拟布娃娃堆叠的 YouTube 视频。*|
欲了解更多演示和[视频](https://www.youtube.com/watch?v=pwyCW0yNKMA&list=PLYXVwtOr1CBxbA50jVg2dKUQvHW_5OOom),请访问[示例](Docs/Samples.md)部分。
## 设计考量
为什么还要创建一个物理引擎?首先,这是一个个人学习项目。其次,我想解决我在现有物理引擎中遇到的一些问题:
* 游戏不仅仅是模拟物理。这些事情发生在多个线程中。我们强调在主模拟更新之外并发访问物理数据:
* 模拟的部分可以在后台加载/卸载。我们在后台线程上准备一批物理体,而无需锁定或影响模拟。我们将这批物体插入模拟时,对性能的影响极小。
* 碰撞查询可以与添加/删除或更新物体并行运行。如果对物体的更改发生在同一线程上,则更改将立即可见。如果更改发生在另一个线程上,查询将看到一致的前一状态或后一状态。另一种方法是拥有世界的读取和写入版本。这会阻止更改立即可见,因此我们避免这样做。
* 碰撞查询可以与主物理模拟并行运行。我们在模拟步骤之前进行粗略检查(broad phase query),并在后台进行精细检查(narrow phase query)。这样,长时间运行的过程(如导航网格生成)可以分散在多帧中。
* 加载/卸载内容时,意外唤醒物体会导致性能问题。因此,物体在创建时不会自动唤醒。当物体被移除时,邻近的物体不会被唤醒。如果需要,可以手动触发。
* 模拟确定性地运行。您只需将模拟的输入复制到远程客户端即可复制模拟。阅读[确定性模拟](https://jrouwe.github.io/JoltPhysics/#deterministic-simulation)部分以了解限制。
* 我们尝试模拟刚体在现实世界中的行为,但会进行近似。因此,该库主要应用于游戏或 VR 模拟。
## 功能特性
* 使用连续碰撞检测模拟各种形状的刚体:
* Sphere (球体)
* Box (盒体)
* Capsule (胶囊体)
* Tapered-capsule (锥形胶囊体)
* Cylinder (圆柱体)
* Tapered-cylinder (锥形圆柱体)
* Convex hull (凸包)
* Plane (平面)
* Compound (复合体)
* Mesh (triangle) (网格/三角形)
* Terrain (height field) (地形/高度场)
* 模拟物体之间的约束:
* Fixed (固定)
* Point (点)
* Distance (including springs) (距离/包括弹簧)
* Hinge (铰链)
* Slider (also called prismatic) (滑块/也称为棱柱)
* Cone (锥形)
* Rack and pinion (齿条与齿轮)
* Gear (齿轮)
* Pulley (滑轮)
* Smooth spline paths (平滑样条路径)
* Swing-twist (for humanoid shoulders) (摆动-扭曲/用于人形肩膀)
* 6 DOF (六自由度)
* 用于驱动约束的马达。
* 碰撞检测:
* 射线投射。
* 形状与形状的测试。
* 形状与另一个形状的投射。
* 仅 Broadphase 测试,以快速确定哪些对象可能相交。
* 传感器(触发体积)。
* 动画布娃娃:
* 硬关键帧(仅运动学刚体)。
* 软关键帧(在动态刚体上设置速度)。
* 将约束马达驱动到动画姿势。
* 将高细节(动画)骨骼映射到低细节(布娃娃)骨骼,反之亦然。
* 游戏角色模拟(胶囊体)
* 刚体角色。在物理模拟期间移动。最便宜的选项,并且角色与动态物体之间的碰撞响应最准确。
* 虚拟角色。在模拟中没有刚体,而是使用碰撞检查模拟一个。在物理更新之外进行更新,以便进行更多控制。与动态物体的交互不太准确。
* 载具
* 轮式载具。
* 履带式载具。
* 摩托车。
* 软体模拟(例如软球或布料)。
* 边缘约束。
* 二面角弯曲约束。
* Cosserat rod 约束(具有方向的边缘,可用于定向几何体,例如植物叶子)。
* 四面体体积约束。
* 长范围附件约束(也称为系绳)。
* 限制模拟保持在蒙皮顶点的特定范围内。
* 内部压力。
* 与模拟刚体的碰撞。
* 针对软体的碰撞测试。
* 基于 GPU 的发丝模拟
* 系统基于 Cosserat rods。
* 可以使用长范围附件约束来限制头发的拉伸。
* 支持模拟(引导)和渲染(跟随)头发。
* 头发之间的碰撞是通过在网格中累积平均速度并使用这些速度来驱动头发来处理的。
* 支持与环境碰撞,但目前仅支持 ConvexHull 和 CompoundShapes。
* 头发的根部可以蒙皮到头皮网格上。
* 水浮力计算。
* 允许大世界的可选双精度模式。
## 支持的平台
* Windows (Desktop or UWP) x86/x64/ARM32/ARM64
* Linux (tested on Ubuntu) x86/x64/ARM32/ARM64/RISC-V64/LoongArch64/PowerPC64LE
* FreeBSD
* Android x86/x64/ARM32/ARM64
* Platform Blue (a popular game console) x64
* macOS x64/ARM64
* iOS x64/ARM64
* MSYS2 MinGW64
* WebAssembly,参见[这个](https://github.com/jrouwe/JoltPhysics.js)独立项目。
## 必需的 CPU 特性
* 在 x86/x64 上,最低要求是 SSE2。该库可以使用 SSE4.1、SSE4.2、AVX、AVX2 或 AVX512 编译。
* 在 ARM64 上,库使用 NEON 和 FP16。在 ARM32 上,它可以在没有任何特殊 CPU 指令的情况下编译。
## 文档
要开始使用,请查看 [HelloWorld](HelloWorld/HelloWorld.cpp) 示例。还提供了一个[使用 CMake FetchContent 的 HelloWorld 示例](https://github.com/jrouwe/JoltPhysicsHelloWorld),以展示如何将 Jolt Physics 集成到 CMake 项目中。
Jolt 中的每个功能都有自己的示例。[运行 Samples 应用程序](Docs/Samples.md)并浏览[代码](https://github.com/jrouwe/JoltPhysics/tree/master/Samples/Tests)是了解该库的好方法!
要了解有关 Jolt 的更多信息,请转到最新的[架构和 API 文档](https://jrouwe.github.io/JoltPhysics/)。也可以获取[特定版本的文档](https://jrouwe.github.io/JoltPhysicsDocs/)。
Jolt 使用的一些算法在我的 GDC 2022 演讲中有详细描述:为《地平线 西之绝境》构建 Jolt Physics 架构([幻灯片](https://gdcvault.com/play/1027560/Architecting-Jolt-Physics-for-Horizon),[带演讲者备注的幻灯片](https://jrouwe.nl/architectingjolt/ArchitectingJoltPhysics_Rouwe_Jorrit_Notes.pdf),[视频](https://gdcvault.com/play/1027891/Architecting-Jolt-Physics-for-Horizon))。
## 编译
* 使用 Visual Studio 2019+、Clang 10+ 或 GCC 9+ 编译。
* 使用 C++ 17。
* 仅依赖于标准模板库。
* 不使用 RTTI。
* 不使用异常。
如果你想在 Platform Blue 上运行,由于 NDA 要求,你需要提供自己的构建环境和 PlatformBlue.h。该文件可在 Platform Blue 开发者论坛上找到。
有关构建说明,请转到[构建](Build/README.md)部分。从旧版本的库升级时,请转到[发行说明](Docs/ReleaseNotes.md)或 [API 更改](Docs/APIChanges.md)部分。
## 性能
如果你对 Jolt 如何随多个 CPU 扩展以及与其他物理引擎的比较感兴趣,请查看[此文档](https://jrouwe.nl/jolt/JoltPhysicsMulticoreScaling.pdf)。
## 文件夹结构
* Assets - 此文件夹包含 TestFramework、Samples 和 JoltViewer 使用的资产。
* Build - 包含构建库所需的一切,请参阅[构建](Build/README.md)部分。
* Docs - 包含库的文档。
* HelloWorld - 一个演示如何使用 Jolt Physics 库的简单应用程序。
* Jolt - 库的所有源代码都在此文件夹中。
* JoltViewer - 可以使用 DebugRendererRecorder 类(一个 .jor 文件)记录物理引擎的输出,此文件夹包含可以可视化录制内容的应用程序的源代码。这对于例如可视化来自不同平台的 PerformanceTest 输出很有用。目前在 Windows、macOS 和 Linux 上可用。
* PerformanceTest - 包含一个运行[性能测试](Docs/PerformanceTest.md)并收集计时信息的简单应用程序。
* Samples - 包含示例应用程序,请参阅[示例](Docs/Samples.md)部分。目前在 Windows、macOS 和 Linux 上可用。
* TestFramework - 用于可视化物理引擎结果的渲染框架。由 Samples 和 JoltViewer 使用。目前在 Windows、macOS 和 Linux 上可用。
* UnitTests - 一组用于验证物理引擎行为的单元测试。
## 其他语言绑定
* C [这里](https://github.com/amerkoleci/joltc),[这里](https://github.com/zig-gamedev/zphysics/tree/main/libs/JoltC) 和 [这里](https://github.com/SecondHalfGames/JoltC/)
* [C#](https://github.com/amerkoleci/JoltPhysicsSharp)
* Java 或 Kotlin [这里](https://stephengold.github.io/jolt-jni-docs) 和 [这里](https://github.com/Morgoth398/JoltPhysics-JavaFFM)
* [JavaScript](https://github.com/jrouwe/JoltPhysics.js)
* [Rust](https://github.com/SecondHalfGames/jolt-rust)
* [Python](https://github.com/Evilpasture/Culverin)
* [Zig](https://github.com/zig-gamedev/zphysics)
## 在其他引擎中的集成
* [Godot](https://github.com/godotengine/godot)
* [Source Engine](https://github.com/Joshua-Ashton/VPhysics-Jolt)
* Unreal Plugin [这里](https://github.com/OversizedSunCoreDev/ArtilleryEco) 和 [这里](https://github.com/Yadhu-S/UnrealJolt)
请参阅[此处使用 Jolt Physics 的项目列表](Docs/ProjectsUsingJolt.md)。
## 许可证
该项目根据 [MIT 许可证](LICENSE) 分发。
## 贡献
欢迎所有贡献!如果你打算进行较大的更改,请先在 GitHub Discussion 部分进行讨论。对于非平凡的更改,我们要求你同意[贡献者协议](ContributorAgreement.md)。当你创建 PR 时,[CLA assistant](https://cla-assistant.io/) 会提示你签署它。
请注意,所有 PR 在合并前都会被压缩,因此无需强制推送到 git 以保持历史记录整洁。
标签:3D图形, Bash脚本, C++, Jolt Physics, VR开发, 刚体动力学, 地平线西之绝境, 多核计算, 实时模拟, 开源库, 搜索引擎爬虫, 数据擦除, 死搁2, 游戏开发, 游戏物理, 物理引擎, 物理模拟, 碰撞检测, 虚拟现实, 高性能计算