アットウィキロゴ

AABB (Axis-Aligned Bounding Box)

AABB(Axis-Aligned Bounding Box:軸並行境界ボックス)は、ゲーム開発や3Dグラフィックスで物体を囲む、座標軸に平行な直方体(2Dは矩形)のことです。
計算が非常に軽量で、衝突判定(コリジョン)や物体検出を高速に行えるため、初期の高速な判定に最適です。


概要

Playdateの開発において、AABBは、衝突判定や描画最適化の基盤となる非常に重要な概念です。
Playdate SDKのコア機能であるスプライトシステムには、このAABBを利用した効率的な衝突判定アルゴリズムが組み込まれています。
1. PlaydateにおけるAABBの基本
AABBは、回転を考慮しない「常にX軸およびY軸と平行な辺を持つ矩形」です。Playdateの画面は400x240ピクセルと限られたリソースであるため、計算負荷の低いAABBは、多くのアクションゲームパズルゲームで標準的に使用されます。
SDKでの表現
通常、以下の4つのパラメータで定義されます。
  • x, y: 矩形の左上隅の座標
  • width, height: 矩形の幅と高さ

2. スプライトシステムでの衝突判定
Playdate SDKのplaydate.graphics.spriteは、内部的にAABBを用いた衝突判定アルゴリズム(具体的にはMinkowski Differenceを利用したスイープ判定)を採用しています。
setCollideRect(x, y, width, height)
スプライトに対して、スプライト自身のローカル座標系でAABBを設定します。
moveWithCollisions(x, y)
AABBに基づいた衝突判定を行いながらスプライトを移動させます。
  • 移動中に他のスプライト(AABB)と接触した際、重ならないように位置を補正したり、跳ね返りや滑りの処理を返り値として取得できます
checkCollisions(x, y)
実際に移動させずに、指定した座標にAABBを置いた場合の衝突状況を確認します。

3. AABBによる最適化(Culling)
Playdateの描画パフォーマンスを維持するために、AABBは「画面外の描画スキップ」に利用されます。
  • Dirty Rects: SDKは、画面の更新が必要な領域(AABB)を「Dirty Rects」として管理し、変更があった部分だけを再描画します
  • Visibility: playdate.graphics.sprite:getVisible() などを使用して、スプライトのAABBが現在の画面内(400x240)に含まれているかを判定し、画面外であれば更新処理をスキップする実装が推奨されます
4. 実装上の注意点とテクニック
高速な重なり判定
自前で単純な重なり判定(静的なチェック)を行う場合、以下の論理式が最も効率的です。
-- LuaによるAABB判定の例
function checkAABB(rect1, rect2)
    return rect1.x < rect2.x + rect2.width and
           rect1.x + rect1.width > rect2.x and
           rect1.y < rect2.y + rect2.height and
           rect1.y + rect1.height > rect2.y
end
回転体への対応
Playdate SDK標準の衝突判定は、スプライトがrotation(回転)を持っていても、そのスプライトを囲む最小のAABBで判定されます。
  • 回転するオブジェクトに対して精密な判定が必要な場合は、AABBを小さめに設定するか、複数の小さなAABBを組み合わせて「複合形状」をシミュレートする必要があります
タイルマップとの連携
playdate.graphics.tilemapを使用する場合、タイルのインデックスに基づいて特定のタイルを「壁」として扱い、スプライトのAABBとの衝突を高速に計算する機能が用意されています。

5. まとめ
特徴 内容
計算負荷 非常に低い(Playdateの168MHz CPUに最適)
用途 衝突判定、描画範囲の制限(Culling)、再描画領域の管理
SDKサポート spriteクラスに標準実装(moveWithCollisionsなど)
制限 オブジェクトの回転に対応した精密な判定は不可(別途SATなどの実装が必要)
Playdateのような低リソース環境では、複雑な物理エンジンを導入する前に、このAABBベースのスプライト機能を使い倒すことが、滑らかなフレームレート(30fps/50fps)を維持する鍵となります。

関連ページ

最終更新:2026年05月03日 08:46