Box2D とは|商用でも無料で使える2Dの物理演算ライブラリ
Box2D は、2Dゲームの中で物を現実に近い動きにするための剛体シミュレーションのライブラリです。無料で使えます。移植しやすい C17 で書かれています。
- 分類
- ゲームエンジン・フレームワーク
- 日本語対応
- 日本語非対応
- 費用
- 無料
- 公式サイト
- https://box2d.org/documentation/
このページの目次
Box2D の概要
Box2D は、ゲームのための2Dの剛体シミュレーションのライブラリです。プログラマーは、ゲームの中で物を現実に近い動きにし、ゲームの世界をよりインタラクティブにするために使えます。
剛体とは
物体のどの2点の距離も変わらないほど硬い塊のことです。
ゲームエンジンの側から見ると、物理エンジンは手続きによるアニメーションの仕組みです。手引き(Manual)は Box2D 3.2.0 の版に対応していて、main ブランチの最新の版には必ずしも当てはまりません。
Box2D は、Game Developer Conference での物理のチュートリアルの一部として作られました。このチュートリアルは、box2d.org の publications(刊行物)の区画から入手できます。
Box2D の特徴
Box2D が扱う次元
Box2D は、ゲームのための2Dの物理エンジンです。
剛体のシミュレーションを使わない場合でも使える当たり判定の機能が、いくつも用意されています。重なりの問い合わせと、投げかけ(キャスト)の問い合わせの関数があります。また、ゲームごとの空間の整理に使える境界ボリューム階層(動的木)もあります。
Box2D の使用言語
Box2D は、移植しやすい C17 で書かれています。定義されている型の名前の多くは b2 で始まります。
Box2D は C で書かれているため、C プログラミングの経験があることが想定されています。コンパイル・リンク・デバッグに慣れていることも想定されています。
Box2D の中心の考え方
中心となる用語には、たとえば次のものがあります。
| 用語 | 中身 |
|---|---|
| 剛体(rigid body) | どの2点の距離も変わらない、硬い塊 |
| 形(shape) | 当たり判定の形を物体に結びつけ、密度・摩擦・反発などの材質の性質を足します。形を当たり判定の仕組み(broad-phase)に載せる役目も持ちます |
| 拘束(constraint) | 物体の自由度を取り除く物理的なつながり。2Dの物体は3つの自由度(2つの移動の座標と1つの回転の座標)を持ちます |
| 接触の拘束(contact constraint) | 剛体がめり込まないようにし、摩擦と反発を再現する特別な拘束。自分で作るのではなく Box2D が自動で作ります |
| 関節の拘束(joint constraint) | 2つの物体をつなぎ留める拘束。回転(revolute)・直動(prismatic)・距離(distance)などの型があり、制限・モーター・ばねのうち1つまたは複数を持つことがあります |
| 世界(world) | 物体・形・関節・接触が互いに作用し合う集まり。互いに完全に独立した世界を複数作れます |
| ソルバー | 時間を進め、接触と関節の拘束を解く仕組み。拘束の数を N とすると、N のオーダーの時間で動きます |
関節の制限は、関節の動ける範囲を限定します。たとえば、人の肘は決まった範囲の角度しか曲がりません。関節のモーターは、つながった物体の動きを関節の自由度に応じて駆動します。モーターは目標の速さと、最大の力またはトルクを持ちます。シミュレーションは、その速さにするのに必要な力またはトルクを加えます。関節のばねは、硬さと減衰を持ちます。Box2D ではばねの硬さをヘルツ(1秒あたりのサイクルの数)で表すので、物体の質量に関わらず、ばねの反応の速さを設定できます。減衰比では、ばねが静止するまでの速さを指定できます。
Box2D が標準で使える機能
機能のうち、当たり判定・物理・システムの区分には、たとえば次のようなものがあります。
| 区分 | 中身 |
|---|---|
| 当たり判定 | 連続的な当たり判定、接触の出来事、凸多角形・カプセル・円・角の丸い多角形・線分・鎖の形、1つの物体に複数の形、当たり判定の絞り込み(フィルタリング)、レイキャスト・シェイプキャスト・重なりの問い合わせ、センサーの仕組み |
| 物理 | Soft Step の剛体ソルバー、速い移動と回転のための連続的な物理、島(アイランド)ごとの休止、回転・直動・距離・モーター・溶接・車輪のジョイント、ジョイントの制限とモーターとばねと摩擦、ジョイントと接触の力、物体の移動の出来事と休止の通知 |
| システム | データ指向の設計、移植しやすい C17、マルチスレッドと SIMD、大きな世界のための倍精度のサポートなど |
Box2D の連続的な当たり判定
ソルバーは、離散的な時間の刻みで物体を進めます。何もしないと、これが「すり抜け」(tunneling)を起こすことがあります。Box2D には、すり抜けに対処する専用のアルゴリズムがあります。1つめは、当たり判定のアルゴリズムが2つの物体の動きを補間して、最初に当たる時刻(TOI)を求めるものです。2つめは、物体が触れる前に接触の拘束を作る、投機的な当たり判定です。
Box2D の出来事の読み方
世界のシミュレーションを1ステップ進めると、そのステップの終わりに読める出来事が生まれます。出来事は次のとおりです。
- 物体の移動の出来事
- 接触の始まりと終わりの出来事
- センサーの始まりと終わりの出来事
- 接触の当たり(hit)の出来事
- 関節の力とトルクのしきい値の出来事
Box2D の単位
Box2D は浮動小数点の数で動くため、許容の幅を使って、うまく動くようにしています。この許容の幅は、メートル・キログラム・秒(MKS)の単位でうまく動くように調整されています。とくに、動く形の大きさが 0.1〜10 メートルの範囲のとき、うまく動くように調整されています。
Box2D の動作環境
ライブラリと見本は、Windows・Linux・Mac で組み立てて動かせます。ライブラリを組み立てるには C17 に対応したコンパイラ、見本を組み立てるには C++20 に対応したコンパイラが必要です。Box2D は速度のために SSE2・AVX2・Neon(AArch64)の SIMD 演算を使っていて、BOX2D_DISABLE_SIMD を定義すると無効にできます。CPU が AVX2 に対応していないときは、SSE2 が自動で代わりに使われます。
見本のアプリ(samples)は、OpenGL と GLFW を使い、グラフィカルユーザーインターフェースに imgui を使っています。
include ディレクトリの中にあるものは公開されたもの、src ディレクトリの中にあるものは内部のものとして扱われます。公開されたものは支援の対象で、Discord サーバーで相談できます。内部のコードを直接使うことは支援の対象外です。
Box2D の費用とライセンス
Box2D は無料で使えます。Erin Catto が開発していて、MITライセンスです。
MITライセンスとは
ソフトウェアの写しを手に入れた人に、使用・複製・改変・統合・公開・配布・サブライセンス・販売(いずれかまたは複数)を含め、制限なくソフトウェアを扱う許可を、無償で与えるライセンスです。ライセンスの文にある著作権表示と許諾表示を、ソフトウェアの写しのすべて、または主要な部分に含める必要があります。ソフトウェアは「現状のまま」で提供され、明示・黙示を問わず、いかなる保証もありません。
| 項目 | 内容 |
|---|---|
| 費用 | 無料で使えます |
| ライセンス | MITライセンスです |
| 開発 | Erin Catto が開発しています |
| 言語 | 移植しやすい C17 で書かれています |
| 動く環境 | Windows・Linux・Mac で組み立てて動かせます |
| 支援の仕組み | GitHub Sponsors で開発を支援できます |
プルリクエストを作れるのは共同作業者だけです。不具合または機能の要望の出し先は、GitHub の Issue です。
ソースコードは GitHub の erincatto/box2d にあります。組み立てでは、CMake と git を入れ、コマンドラインから動く状態にします。
ドキュメントは box2d.org にあります。GitHub のリポジトリのページには、手引き(Manual)と、コミュニティの Discord へのリンクがあります。
- Box2D の公式ドキュメントhttps://box2d.org/documentation/
情報源
- Box2D: Overview — 公式ドキュメント(何をするライブラリか・中心の用語・連続的な当たり判定・出来事・単位・公開の範囲)https://box2d.org/documentation/確認日 2026-10-20
- erincatto/box2d — GitHub(機能の一覧・動作環境・組み立てに要るもの・開発者とライセンスの名前)https://github.com/erincatto/box2d確認日 2026-10-20
- Box2D の LICENSE — GitHub(MITライセンスの本文)https://raw.githubusercontent.com/erincatto/box2d/main/LICENSE確認日 2026-10-20