震动物理
多核友好的刚性身体物理和碰撞检测库。适用于游戏和VR应用程序。 Horizon禁止西部使用。
|
|---|
| YouTube视频显示了用震动物理模拟的Ragdoll桩。 |
有关更多演示和视频,请转到“样本”部分。
设计注意事项
为什么要创建另一个物理引擎?首先,这是一个个人学习项目。其次,我想解决现有物理引擎遇到的一些问题:
- 游戏所做的不仅仅是模拟物理学。这些事情发生在多个线程中。我们强调在主要模拟更新之外同时访问物理数据:
- 模拟部分可以在后台加载 /卸载。我们在背景线上准备一批物理机构,而无需锁定或影响模拟。我们将批次插入模拟中,对性能的影响最小。
- 碰撞查询可以平行于添加 /删除或更新车身。如果对身体的更改发生在同一线程上,则将立即看到更改。如果更改发生在另一个线程上,则查询将在状态之前或之后看到一致的。另一种选择是拥有世界的读写版。这样可以防止立即看到变化,因此我们避免这种情况。
- 碰撞查询可以平行于主要物理模拟。在模拟步骤之前,我们进行了粗糙的检查(广泛的查询),并在后台进行精细检查(窄相查询)。这样,可以在多个帧中分散长期运行的过程(例如导航网格生成)。
- 加载 /卸载内容时,意外唤醒身体会导致性能问题。因此,创建时身体不会自动醒来。移除尸体时,邻近的尸体不会被唤醒。如果需要,可以手动触发。
- 模拟确定性地运行。您可以通过仅将输入复制到仿真来将仿真复制到远程客户端。阅读确定性模拟部分以了解限制。
- 我们试图模拟现实世界中刚体的行为,但进行近似。因此,该库应主要用于游戏或VR模拟。
特征
- 使用连续碰撞检测对各种形状的刚体模拟:
- 领域
- 盒子
- 胶囊
- 锥形胶囊
- 圆柱
- 锥形缸
- 凸船体
- 飞机
- 化合物
- 网格(三角形)
- 地形(高度场)
- 模拟身体之间的约束:
- 固定的
- 观点
- 距离(包括弹簧)
- 合页
- 滑块(也称为棱镜)
- 锥体
- 架子和小齿轮
- 齿轮
- 滑轮
- 光滑的样条路径
- 扭动扭动(用于人形肩膀)
- 6 dof
- 驱动约束的电动机。
- 碰撞检测:
- 铸造光线。
- 测试形状与形状。
- 施放形状与另一种形状。
- Broadphase仅测试快速确定哪些对象可能相交。
- 传感器(触发量)。
- 动画ragdolls:
- 硬键键(仅运动学仅刚体)。
- 软键(在动态刚体上设置速度)。
- 驱动约束电动机到动画姿势。
- 将高细节(动画)骨骼映射到一个低细节(Ragdoll)骨骼上,反之亦然。
- 游戏角色模拟(胶囊)
- 僵硬的身体特征。在物理模拟过程中移动。最便宜的选择和最准确的角色和动态物体之间的碰撞响应。
- 虚拟字符。在模拟中没有刚体的身体,但使用碰撞检查模拟一个体。在物理更新之外更新以获得更多控制。与动态体的相互作用较少。
- 车辆
- 柔软的身体模拟(例如,软球或一块布)。
- 边缘约束。
- 二面弯约束。
- 四面体体积约束。
- 远程附件约束(也称为Tethers)。
- 限制模拟以保持在皮肤顶点的一定范围内。
- 内部压力。
- 与模拟的刚体碰撞。
- 针对软体的碰撞测试。
- 水浮力计算。
- 可选的双精度模式,可允许大世界。
支持的平台
- Windows(桌面或UWP)X86/X64/ARM32/ARM64
- Linux(在Ubuntu上测试)x64/arm64
- freebsd
- Android X86/X64/ARM32/ARM64
- 平台蓝色(流行游戏机)x64
- MACOS X64/ARM64
- iOS X64/ARM64
- msys2 mingw64
- WebAssembly,请参阅此单独的项目。
所需的CPU功能
- 在x86/x64上,最小要求是SSE2。可以使用SSE4.1,SSE4.2,AVX,AVX2或AVX512编译该库。
- 在ARM64上,图书馆使用霓虹灯和FP16。在ARM32上,它可以不用任何特殊的CPU说明进行编译。
文档
要了解有关JOLT的更多信息,请转到最新的体系结构和API文档。还提供特定版本的文档。
要开始,请查看Helloworld示例。也可以使用Cmake FetchContent的Helloworld示例来展示如何将震动物理集成到CMAKE项目中。
我的GDC 2022谈话中详细介绍了jolt使用的某些算法:为“ Horizon Forbidden Forbidden West”进行震撼物理学(幻灯片,带有扬声器笔记的幻灯片,视频)。
编译
- 与Visual Studio 2019+,Clang 10+或GCC 9+一起编译。
- 使用C ++ 17。
- 仅取决于标准模板库。
- 不使用RTTI。
- 不使用异常。
如果您想在平台蓝色上运行,则由于NDA要求,需要提供自己的构建环境和PlatformBlue.h。该文件可在平台蓝色开发人员论坛上找到。
对于构建说明,请转到“构建”部分。从较旧版本的库升级时,请转到发行说明或API更改部分。
表现
如果您对使用多个CPU的震动缩放并与其他物理引擎进行比较感兴趣,请查看此文档。
文件夹结构
- 资产 - 此文件夹包含TestFramework,样本和JoltViewer使用的资产。
- 构建 - 包含构建库所需的一切,请参阅“构建”部分。
- 文档 - 包含图书馆的文档。
- Helloworld-一个简单的应用程序,演示了如何使用Jolt Physics库。
- JOLT-库的所有源代码都在此文件夹中。
- JoltViewer-可以使用debugrendererrecorder类(a .jor文件)记录物理引擎的输出,此文件夹将源代码包含到可以可视化录制的应用程序的源代码。这对于例如从不同平台可视化performAtest的输出很有用。目前仅在Windows上可用。
- PerformAncEtest-包含一个简单的应用程序,该应用程序运行性能测试并收集定时信息。
- 样本 - 其中包含样本应用程序,请参见“样本”部分。目前仅在Windows上可用。
- TestFramework-一个可视化物理引擎结果的渲染框架。由样本和Joltviewer使用。目前仅在Windows上可用。
- Unitests-一组单元测试,以验证物理引擎的行为。
- Webincludes-物理引擎内部分析框架使用的许多JavaScript资源。
其他语言的绑定
- C在这里和这里
- C#
- 爪哇
- JavaScript
- ZIG
其他引擎集成
在此处查看使用震动物理的项目列表。
执照
该项目是根据麻省理工学院许可证分发的。
贡献
欢迎所有贡献!如果您打算进行更大的更改,请先在GitHub讨论部分中讨论。对于非平凡的变化,我们要求您同意撰写贡献者协议。创建PR时,CLA助手会提示您签名。