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