衝撃物理学
マルチコアフレンドリーなリジッドボディの物理学と衝突検出ライブラリ。ゲームやVRアプリケーションに適しています。 Horizon Forbidden Westが使用しています。
|
|---|
| Jolt PhysicsでシミュレートされたRagdoll Pileを示すYouTubeビデオ。 |
その他のデモとビデオについては、サンプルセクションをご覧ください。
設計上の考慮事項
なぜさらに別の物理エンジンを作成するのですか?第一に、それは個人的な学習プロジェクトでした。第二に、既存の物理エンジンで抱えていたいくつかの問題に対処したかった:
- ゲームは物理学をシミュレートするだけではありません。これらのことは複数のスレッドで起こります。メインシミュレーションアップデート以外で、物理学データに同時にアクセスすることを強調しています。
- シミュレーションのセクションは、バックグラウンドでロード /アンロードできます。シミュレーションにロックしたり影響を与えたりせずに、背景スレッドに物理学のバッチを準備します。パフォーマンスへの影響を最小限に抑えて、シミュレーションにバッチを挿入します。
- 衝突クエリは、ボディの追加 /削除または更新と並行して実行できます。同じスレッドで体の変更が発生した場合、変更はすぐに表示されます。別のスレッドで変更が発生した場合、クエリは状態の前後に一貫したものになります。別の方法は、世界の読み取りと書き込み版を持っていることです。これにより、変更がすぐに表示されないようにするため、これを避けます。
- 衝突クエリは、メインの物理シミュレーションと並行して実行できます。シミュレーションステップの前に粗いチェック(広い位相クエリ)を行い、バックグラウンドで微細なチェック(狭い位相クエリ)を行います。このようにして、長い実行プロセス(ナビゲーションメッシュ生成など)は、複数のフレームに広がることができます。
- ボディの偶発的な目覚めは、コンテンツをロード /アンロードするときにパフォーマンスの問題を引き起こします。したがって、体は作成時に自動的に目覚めません。体が除去されたとき、隣接する体は目覚めません。これは、必要に応じて手動でトリガーできます。
- シミュレーションは決定論的に実行されます。シミュレーションに入力を複製するだけで、シミュレーションをリモートクライアントに複製できます。限界を理解するには、決定論的シミュレーションセクションを読んでください。
- 現実の世界では、剛体の動作をシミュレートしようとしますが、近似を行います。したがって、このライブラリは主にゲームまたはVRシミュレーションに使用する必要があります。
特徴
- 連続衝突検出を使用したさまざまな形状の剛体のシミュレーション:
- 球
- 箱
- カプセル
- テーパーカプセル
- シリンダー
- テーパーシリンダー
- 凸式船体
- 飛行機
- 化合物
- メッシュ(三角形)
- 地形(高さフィールド)
- ボディ間の制約のシミュレーション:
- 修理済み
- ポイント
- 距離(スプリングを含む)
- ヒンジ
- スライダー(プリズムとも呼ばれます)
- 円錐
- ラックとピニオン
- ギヤ
- プーリー
- 滑らかなスプラインパス
- スイングツイスト(ヒューマノイドの肩用)
- 6 dof
- 制約を駆動するモーター。
- 衝突検出:
- 鋳造光線。
- 形状と形状のテスト。
- 形状と別の形状をキャストします。
- Broadhaseは、どのオブジェクトが交差する可能性があるかをすばやく決定するためにのみテストします。
- センサー(トリガーボリューム)。
- アニメーションラグドール:
- ハードキーイング(運動学のみの剛体のみ)。
- ソフトキー(動的剛体に速度を設定)。
- 制約モーターをアニメーションポーズに駆動します。
- 高いディテール(アニメーション)スケルトンを低いディテール(ラグドール)スケルトンにマッピングし、その逆も同様です。
- ゲームキャラクターシミュレーション(カプセル)
- 剛体のキャラクター。物理シミュレーション中に移動します。最も安価なオプションと、キャラクターとダイナミックボディの間の最も正確な衝突応答。
- 仮想文字。シミュレーションには剛体がありませんが、衝突チェックを使用してシミュレーションをシミュレートします。より多くのコントロールのために、物理学の更新以外で更新されました。動的な体とのより正確な相互作用。
- 車両
- ソフトボディシミュレーション(例えば、柔らかいボールまたは布片)。
- エッジの制約。
- 二面bendの制約。
- 四面体の体積の制約。
- 長距離アタッチメントの制約(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では、ライブラリはNeonとFP16を使用します。 ARM32では、特別なCPU命令なしでコンパイルできます。
ドキュメント
Joltの詳細については、最新のアーキテクチャとAPIのドキュメントをご覧ください。特定のリリースのドキュメントも利用できます。
開始するには、Helloworldの例をご覧ください。 Cmake FetchContentを使用したHelloWorldの例は、CMakeプロジェクトにJolt Physicsを統合する方法を示すためにも利用できます。
Joltが使用するいくつかのアルゴリズムについては、私のGDC 2022トーク:「Horizon Forbidden West」のJolt Physicsのアーキテクテクティック(スライド、スピーカーメモ付きのスライド、ビデオ)で詳細に説明されています。
コンパイル
- Visual Studio 2019+、Clang 10+、またはGCC 9+をコンパイルします。
- C ++ 17を使用します。
- 標準のテンプレートライブラリにのみ依存します。
- RTTIは使用しません。
- 例外を使用しません。
Platform Blueで実行したい場合は、NDAの要件のために、独自のビルド環境とPlatformBlue.hを提供する必要があります。このファイルは、プラットフォームBlue Developer Forumで入手できます。
ビルド手順については、ビルドセクションに移動します。ライブラリの古いバージョンからアップグレードするときは、リリースノートまたはAPIの変更セクションに移動します。
パフォーマンス
複数のCPUを備えたジョルトがどのようにスケーリングし、他の物理エンジンと比較するかに興味がある場合は、このドキュメントをご覧ください。
フォルダー構造
- アセット - このフォルダーには、TestFramework、Samples、Joltviewerが使用する資産が含まれています。
- ビルド - ライブラリの構築に必要なすべてが含まれています。ビルドセクションを参照してください。
- ドキュメント - ライブラリのドキュメントが含まれています。
- Helloworld- Jolt Physics Libraryの使用方法を示す簡単なアプリケーション。
- Jolt-ライブラリのすべてのソースコードはこのフォルダーにあります。
- JoltViewer-デビュガレンダーエレコダークラス(A .JORファイル)を使用して物理エンジンの出力を記録することができます。このフォルダーには、録音を視覚化できるアプリケーションにソースコードを含みます。これは、たとえば、さまざまなプラットフォームからのPerformanceTestの出力を視覚化するのに役立ちます。現在、Windowsでのみ利用可能です。
- PerformanceTest -Performanceテストを実行してタイミング情報を収集する簡単なアプリケーションが含まれています。
- サンプル - これにはサンプルアプリケーションが含まれています。サンプルセクションを参照してください。現在、Windowsでのみ利用可能です。
- TestFramework-物理エンジンの結果を視覚化するためのレンダリングフレームワーク。サンプルとjoltviewerで使用。現在、Windowsでのみ利用可能です。
- Unittests -Physics Engineの動作を検証するための一連の単体テスト。
- WebIncludes-物理エンジンの内部プロファイリングフレームワークで使用される多数のJavaScriptリソース。
他の言語のバインディング
- cこことこちら
- C#
- Java
- JavaScript
- ジグ
他のエンジンでの統合
ここでJolt Physicsを使用するプロジェクトのリストを参照してください。
ライセンス
このプロジェクトは、MITライセンスの下で配布されます。
貢献
すべての貢献は大歓迎です!より大きな変更を加えるつもりなら、最初にGitHubディスカッションセクションで話し合ってください。自明でない変更については、貢献者契約に同意する必要があります。 PRを作成すると、CLAアシスタントが署名するように求められます。