MENU

Box2Dとは2Dゲームを支える定番物理エンジン

Box2D アイキャッチ
Box2D

Box2D(ボックス・ツーディー)は、2D空間に特化したオープンソースの物理シミュレーションライブラリで、2007年にErin Catto氏が公開したC++製のエンジンです。Angry Birds、Limbo、Crayon Physics Deluxeといった世界的ヒット作の挙動を支えており、2Dアクションやパズルゲームの物理表現を実装するときの事実上の標準として君臨してきました。MITライセンスで提供されており、商用利用にも制約がほとんどありません。多くの2Dゲームエンジン(Cocos2d-x、LibGDX、Defold、Godot 3など)が内部または外部接続でBox2Dを採用しています。

目次

この記事の目次

  1. Box2Dを構成する主要オブジェクト
  2. シミュレーションのステップとタイムステップ
  3. Box2Dが採用されたヒット作
  4. 他言語へのポートとモダンな後継
  5. まとめ

Box2Dを構成する主要オブジェクト

Box2Dを構成する主要オブジェクト

Box2Dの世界はb2Worldというコンテナから始まり、その中にb2Bodyを生成して物体を配置します。Bodyにはstatic(不動)、kinematic(外力に応答しないがプログラムで動かせる)、dynamic(力に応答する通常の物体)の三種があり、用途に応じて使い分けます。Bodyの形状や物理特性はb2Fixtureを介して定義し、b2PolygonShapeやb2CircleShape、b2EdgeShape、b2ChainShapeで形を、密度・摩擦・反発係数で挙動を表現します。

Jointは複数のBodyを結びつける拘束で、b2RevoluteJoint(回転ジョイント)、b2PrismaticJoint(直線拘束)、b2DistanceJoint(距離一定)、b2WeldJoint(剛結合)、b2PulleyJoint(滑車)、b2WheelJoint(車輪用)など多彩なバリエーションが用意されています。これらを組み合わせれば自動車、ロボットアーム、振り子、布のような連鎖剛体まで構築でき、Angry Birdsのような構造物の崩壊表現も実装できます。

シミュレーションのステップとタイムステップ

シミュレーションのステップとタイムステップ

Box2Dではb2World::Stepを呼び出すたびに、指定された時間刻みでシミュレーションが進みます。引数にはtimeStep(秒)、velocityIterations、positionIterationsを渡し、後者二つはソルバの反復回数を制御します。velocityIterationsを8、positionIterationsを3にする設定が公式ドキュメントで推奨されており、安定性とパフォーマンスのバランスが良いとされます。可変フレームレートでもtimeStepは固定値(例:1/60秒)にすることが安定動作の鍵です。

高速移動物体のすり抜けを防ぐためにContinuous Collision Detection(CCD)が用意されており、Bullet本体のように弾丸のような速い物を扱うときに有効です。Bodyに対してSetBullet(true)を設定すると、その物体だけCCD対象になります。スリープ機構(静止した物体を計算から除外する省力化)が自動で働くため、画面に多数の物体があっても動いていない物のコストは低く抑えられます。

Box2Dが採用されたヒット作

Box2Dが採用されたヒット作

Box2Dを世界的に有名にした作品といえばAngry Birdsで、ブタの城が崩れ落ちる破壊表現や鳥の放物線軌道はBox2Dの拘束と衝突を巧みに使ったものです。PlaydeadのLimboは陰影と物理パズルが融合したアートゲームの代表作で、Box2Dベースの挙動が独特の重みを表現しました。Crayon Physics Deluxeはユーザが描いた線をそのままBox2Dの剛体にする実験的な作品で、Independent Games Festival大賞を獲得しました。

ブラウザゲームの黎明期にはHappy Wheelsのような過激な物理表現の作品が話題を呼び、Flash時代の2D物理ゲームの多くがBox2Dを使っていました。インディー開発の象徴的なエンジンであるGameMakerやConstructにもBox2Dが組み込まれ、World of GoosやCut the Ropeのような有名作品の動きを内側から支えました。学習用のサンプルが豊富にあり、初学者が物理プログラミングを学ぶ題材としても最適です。

他言語へのポートとモダンな後継

他言語へのポートとモダンな後継

Box2Dの原作はC++ですが、ゲームエンジンや言語ごとに移植版が多数存在します。Javaに移植したJBox2D、JavaScriptに移植したBox2D.js(PlanckJSのようにモダン化したものも)、Pythonバインディングのpybox2d、Lua用のlove.physics(LÖVEエンジンに同梱)、C#用のFarseer Physicsなど、ほぼあらゆる言語環境で2D物理を扱う選択肢があります。一度Box2Dの概念を学べば、別言語のポートでも同じAPI設計でスムーズに使えるのも利点です。

近年Erin Catto氏はBox2Dの後継としてbox2d 3.0(旧称box2c)を開発しており、Cベースで書き直しSIMDなどの最適化を加えた次世代版を公開しています。一方Godot 4はサーバアーキテクチャを採用してBox2Dから内製のGodot Physics 2Dへ移行しました。それでもBox2Dの設計思想は2D物理の事実上のリファレンスとして残り、学習教材としての価値は色あせていません。AngryBirdsのような古典的な体験を作りたいなら、まず触ってみるべきライブラリです。

まとめ

Box2DはErin Catto氏の手による、2Dゲーム物理の歴史を作ったオープンソースエンジンです。剛体・関節・連続衝突検出といった基本を高品質に提供し、Angry BirdsからLimboまで多くのヒット作を支えてきました。MITライセンスで自由に使え、各言語へのポートも豊富で、2D物理プログラミングを学ぶ最初の教材としても最適です。後継版や代替エンジンが出てもなお、その設計思想は2D物理の標準として残り続けています。

※本記事はIT用語辞典の手書きドラフトです。公開前に最新情報・出典を確認のうえ加筆修正してください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次