ammo.jsの以外の物理演算ライブラリ
ammo.jsはおそらく最も人気があり、よく知られたJavaScript物理エンジンです。高度に汎用性が高く、高精度シミュレーションを生成することができます。しかし、性能やメモリ要件が非常に高いため、アプリケーションに最適な選択肢かどうかを調査する必要があります。たとえば、2Dゲームを作成している場合、2D物理エンジンの方が適しているかもしれません。
実際、ammo.jsの代わりにはいくつかの選択肢があります。最も活発に開発されているものを先に、その後にほとんどメンテナンスされていないものの依然として使用可能な古いエンジンを記載しています。
| 物理エンジン | Language | JS Build | WASM Build | 2D | 3D | Determinism | PlayCanvas Integration |
|---|---|---|---|---|---|---|---|
| Rapier | Rust | ✔️ | ✔️ | ✔️ | ✔️ | ||
| Jolt | C++ | ✔️ | ✔️ | ✔️ | ✔️ | ||
| Box3D | C | ✔️ | ✔️ | ✔️ | |||
| PhysX | C++ | ✔️ | ✔️ | ||||
| box2d.js | C++ | ✔️ | ✔️ | ✔️ | |||
| Matter.js | JavaScript | ✔️ | ✔️ | ||||
| p2.js | JavaScript | ✔️ | ✔️ | Yes | |||
| cannon.js | JavaScript | ✔️ | ✔️ | ||||
| Oimo.js | JavaScript | ✔️ | ✔️ |
JavaScript以外で書かれたエンジンは、それぞれ別のバインディングプロジェクトによってブラウザ向けにコンパイルされています。Rapierは@dimforge/rapier2dと@dimforge/rapier3d、JoltはJoltPhysics.js、Box3Dはbox3d.js、PhysXはphysx-js-webidlを使用します。このうちエンジンの作者自身がメンテナンスしているバインディングは、RapierとJoltのみです。
これらの多くはWebAssemblyのビルドのみを提供しています。ただし、EmscriptenはWebAssemblyの代わりにasm.jsを出力できるため、Joltとbox2d.jsはJavaScriptのビルドも提供しています。asm.jsのビルドはJavaScriptが動作する環境であればどこでも実行でき、WebAssemblyのサポートを必要としませんが、同等のWebAssemblyビルドよりも低速でサイズも大きくなります。特別な理由がない限りWebAssemblyを選択してください。
上記のチェックマークはクロスプラットフォームでの決定性を意味します。つまり、どのデバイスでもシミュレーションが同一の結果を生成することであり、ロックステップ方式のネットワークマルチプレイやリプレイに必要です。これはエンジンのビルド方法に依存するため、依存する前に確認してください。
- Rapierの公式WebAssemblyパッケージは、標準でクロスプラットフォームな決定性に対応しています。
- Joltではコンパイル時に
CROSS_PLATFORM_DETERMINISTICを有効にする必要がありますが、ビルド済みのJoltPhysics.jsパッケージではこれが設定されていません。 - PhysXは特定のプラットフォームとビルドに限って決定性を保証しており、アーキテクチャをまたぐ決定性は明確にサポートしていません。
エンジンの物理コンポーネントは、ammo.jsを直接呼び出しているわけではありません。ボディ、形状、ジョイント、レイキャスト、接触の通知は、バックエンド層であるPhysicsWorldを経由し、組み込みのammo.jsバックエンドはその実装の1つです。この層はアルファ版とされており、APIはまだ変わる可能性がありますが、他のエンジンを統合するための接点として意図されています。RapierやJolt向けのバックエンドは同じクラスを実装すればよく、RigidBodyコンポーネントとCollisionコンポーネントはそのまま使えます。以前からあるPlayCanvas p2.jsインテグレーションはこの層より前に作られたもので、代わりに独自のスクリプトベースのコンポーネントでエンジンをラップしています。
関連情報
- 物理の基本 - エディター、エンジンのみのアプリ、React、Web Componentsでammo.jsを有効にする
- ammo.jsを直接呼び出す - コンポーネントが公開していないBulletの機能を利用する