ゲーム数学を「使える力」に変えよう!ゲーム講座PDF無料プレゼント中>>

AABBの当たり判定が分かる|軸並行ボックス同士の衝突判定を数学で理解する

当たり判定の仕組みを数学で理解する|ゲーム衝突判定入門

ゲーム開発で、オブジェクト同士がぶつかったかを判定する処理は頻繁に必要です。

2つの箱が衝突しているかを調べる方法として、AABB(Axis-Aligned Bounding Box)という手法があります。

AABBは、軸に並行な(回転していない)箱の当たり判定です。

ゲーム開発で最も基本的で、かつ高速な判定方法の1つとして使われています。

【ゲームの作り方講座もプレゼント中!】

AABBとは何か(ゲーム制作目線)

AABBの基本構造

AABBは、Axis-Aligned Bounding Boxの略で、軸に並行な境界ボックスという意味です。

つまり、X軸、Y軸、Z軸に沿った方向にしか広がらない、回転していない箱のことです。

2Dゲームなら四角形、3Dゲームなら直方体になります。

Unityでは、BoxColliderが回転していない状態が、まさにAABBに該当します。

AABBの最大の特徴は、計算がシンプルで高速なことです。

2つのAABBが衝突しているかは、各軸方向で重なっているかを調べるだけで判定できます。

これに対して、回転した箱の当たり判定(OBB)は、計算が複雑になりがちです。

ゲーム開発では、まずAABBで大まかな判定を行い、必要に応じてより精密な判定を行うという、2段階の判定方式がよく使われます。

ゲームでの具体的な使い道

AABBのゲームでの使用例

AABBがゲームでどう使われているか、具体例を確認してみましょう。

敵と弾の当たり判定

シューティングゲームで、プレイヤーの弾が敵に当たったかを判定する際、AABBがよく使われます。

敵と弾それぞれにAABBを設定し、2つのAABBが重なっていれば「当たった」と判定します。

計算が簡単なため、大量の弾と敵が存在する場面でも高速に処理できます。

マップとの衝突判定

プラットフォーマーゲームやアクションゲームで、プレイヤーが地面や壁にぶつかったかを判定する際も、AABBが有効です。

マップの各ブロック(タイル)をAABBとして扱い、プレイヤーのAABBとの衝突を調べることで、歩ける地面や登れる壁を判定できます。

アイテムの取得判定

プレイヤーがアイテムを取得したかを判定する場合も、AABBが使えます。

アイテムとプレイヤーのAABBが重なっていれば、「取得した」と判定します。

判定処理が軽いため、マップ上に大量のアイテムが散らばっていても、パフォーマンスを保てますね。

広域判定(粗い判定)

複雑な形状のオブジェクト同士の衝突判定を行う際、まずAABBで「だいたいぶつかっているか」を調べます。

AABBで衝突していなければ、詳細な判定はスキップできます。

これにより、不要な計算を省いて処理速度を向上させられますね。

AABBを使う場面と使わない場面

  • 使う場面:回転しない箱、高速な判定が必要な場面、大まかな衝突判定
  • 使わない場面:回転した箱、円形の当たり判定、複雑な形状の精密な判定

作り方は分かった。
でも完成まで行けない人へ

当たり判定・移動・カメラ・AIまで、
実装しながら学べる「永久会員チケット」です。

買い切り 全講座 今後追加も無料
永久会員チケットを見てみる

※ まずは内容を見るだけでOK

考え方・仕組みを図解イメージで説明

AABBの衝突判定の仕組み

AABBの衝突判定は、「各軸方向で重なっているか」を調べるだけです。

2次元の場合を例に説明します。

2次元でのAABBの表現

2Dゲームでは、AABBは四角形として表現されます。

この四角形は、最小X、最大X、最小Y、最大Yの4つの値で表せます。

例えば、左下の角が(10, 20)で、幅が30、高さが40の場合:
– 最小X = 10
– 最大X = 10 + 30 = 40
– 最小Y = 20
– 最大Y = 20 + 40 = 60

これで、AABBの範囲が定義できます。

衝突判定のロジック

2つのAABBが衝突しているかを判定するには、すべての軸方向で重なっているかを確認します。

2次元なら、X軸とY軸の両方で重なっていれば衝突です。

1つでも重なっていない軸があれば、衝突していません。

3次元への拡張

3Dゲームでは、X軸、Y軸、Z軸の3方向で重なっているかを調べます。

2次元の判定方法を、そのまま3次元に拡張できるのが、AABBの大きな利点です。

⚠️ 重要なポイント

  • AABBの衝突判定は、各軸方向での重なりを調べるだけ(シンプルで高速)
  • すべての軸で重なっていれば衝突、1つでも重なっていない軸があれば衝突していない
  • 回転した箱には適用できない(OBBが必要)

Unityで実装する際の注意点(代表例)

UnityでのAABBの実装

UnityでAABBの衝突判定を実装する際の注意点を見ていきましょう。

BoxColliderを使ったAABB判定

Unityには、BoxColliderコンポーネントが用意されています。

回転していないBoxColliderは、まさにAABBとして機能します。

ただし、Transformのrotationが(0, 0, 0)以外の場合、AABBではなくOBBになります

AABBとして扱いたい場合は、回転を0に保つ必要があります。

Bounds構造体の活用

UnityのBounds構造体は、AABBを表現するために使えます。

Boundsには、中心座標(center)とサイズ(size)が含まれており、衝突判定の計算に便利です。

手動で衝突判定を実装する場合

Unityの物理システムを使わず、手動でAABBの衝突判定を実装する場合のコード例です。

パフォーマンスの最適化

大量のオブジェクトでAABBの衝突判定を行う場合、空間分割(空間インデックス)を使うと効率的です。

画面内の領域を格子状に分割し、同じ格子内のオブジェクト同士だけ判定すれば、計算量を大幅に削減できます。

Unityには、Physics.OverlapBoxという関数もあり、指定した範囲内のコライダーを取得できます。

デバッグ時の可視化

開発中は、AABBの範囲を可視化すると便利ですね。

UnityのGizmos.DrawWireCubeを使えば、シーンビューでAABBの範囲を確認できます。

博士
博士
AABBは、ゲーム開発で最も基本的な当たり判定です。まずはAABBをしっかり理解して、徐々にOBBや球の当たり判定へとステップアップしていきましょう。実装しながら学ぶことで、理解が深まりますよ!

まとめ

AABBのまとめ

この記事では、AABBの当たり判定について見てきました。

重要なポイントをおさらいします。

重要なポイント:

  • AABBは軸に並行な(回転していない)箱の当たり判定で、計算がシンプルで高速
  • 衝突判定は、各軸方向で重なっているかを調べるだけで実現できる
  • ゲームでは、敵と弾、マップとの衝突、アイテム取得など、様々な場面で使われる
  • UnityではBoxColliderやBounds構造体でAABBを扱える
  • AABBを理解すれば、OBBや球の当たり判定への理解も深まる

AABBは、当たり判定の基礎となる重要な概念です。

シンプルながら、ゲーム開発の多くの場面で活用できます。

より複雑な形状の当たり判定(OBB、球、カプセルなど)を学ぶ前に、まずはAABBをしっかり理解しておくと、後の学習がスムーズになります。

当たり判定を実装とセットで学ぶことで、理解が深まるはずです。

Unity入門の森では、ゲーム開発で使う当たり判定を、実際のゲーム実装とともに体系的に学べます。

ぜひチェックしてみてください。

ゲーム制作を“理解しながら”始めたい方へ
Unity入門の森をチェック Unity初心者でも安心。動画解説+完成サンプル付きで実装まで進められます

【ゲームの作り方講座もプレゼント中!】

コメント

タイトルとURLをコピーしました