AABBの当たり判定は理解できたけど、回転した箱同士の衝突判定はどうすればいいのか。
回転を考慮しないと、正確な当たり判定ができない場面が出てくる。
そんな悩みを抱えていませんか。
回転した箱の当たり判定には、OBB(Oriented Bounding Box)を使います。
OBBは、回転を考慮した箱の当たり判定で、より正確な衝突検出が可能です。
この記事では、OBBの当たり判定の仕組みを、Unity実装例とともに見ていきましょう。
OBBとは何か(ゲーム制作目線)

OBBは、Oriented Bounding Boxの略で、向きを持つ境界ボックスという意味です。
AABBが軸に並行な(回転していない)箱なのに対し、OBBは任意の方向に回転した箱です。
Unityでは、BoxColliderが回転している状態が、まさにOBBに該当します。
OBBの特徴は、回転を考慮したより正確な当たり判定ができることです。
AABBでは、回転した箱を扱う際、箱全体を囲む大きなAABBを作る必要があり、判定が大雑把になります。
OBBを使えば、回転後の正確な形状で判定できるため、より精密な衝突検出が可能になりますね。
ゲームでの具体的な使い道

OBBがゲームでどう使われているか、具体例を確認してみましょう。
回転するオブジェクトの当たり判定
回転するドア、開閉する扉、回転する障害物など、回転を伴うオブジェクトの当たり判定にOBBが使われます。
AABBでは、回転しているオブジェクトを正しく判定できませんが、OBBなら回転後の正確な形状で判定できます。
複雑な形状の簡易判定
複雑な形状のオブジェクトに対して、OBBで大まかな当たり判定を行います。
その後、必要に応じてより精密な判定を行うという、2段階の判定方式で使われることが多いです。
物理演算との連携
Unityの物理演算では、BoxColliderが回転している場合、内部でOBBとして扱われます。
Rigidbodyと組み合わせることで、回転するオブジェクト同士の衝突を、物理エンジンが自動で処理してくれます。
カメラとの衝突判定
FPSゲームなどで、カメラが壁や障害物にめり込まないようにする際、OBBを使った判定が有効です。
カメラの視点方向に応じて判定を行うため、より自然な衝突回避が可能になりますね。
- OBB:回転した箱、より正確な判定が必要な場面
- AABB:回転していない箱、高速な判定が必要な場面
- OBBの計算はAABBより複雑だが、より正確な判定が可能
作り方は分かった。
でも完成まで行けない人へ
当たり判定・移動・カメラ・AIまで、
実装しながら学べる「永久会員チケット」です。
※ まずは内容を見るだけでOK
考え方・仕組みを図解イメージで説明

OBBの衝突判定は、「分離軸定理(SAT: Separating Axis Theorem)」という方法で実現されます。
分離軸定理の考え方
2つのOBBが衝突していない場合、必ず分離軸が存在するという定理です。
分離軸とは、2つのOBBを分離する方向の軸のことで、この軸に沿って2つのOBBを投影すると、重なりがありません。
逆に、すべての候補となる軸で重なっていれば、2つのOBBは衝突していると判定できます。
OBBの表現方法
OBBは、中心点、3つの軸方向(X軸、Y軸、Z軸)、各軸の長さ(ハーフサイズ)で表現されます。
回転行列やクォータニオンを使って、軸の方向を定義します。
投影による判定
各軸方向にOBBを投影し、投影後の範囲が重なっているかを調べます。
すべての軸方向で重なっていれば衝突、1つでも重なっていない軸があれば衝突していません。
- OBBの衝突判定には分離軸定理(SAT)が使われる
- すべての候補となる軸で投影を調べ、すべて重なっていれば衝突と判定
- OBBは中心点、軸方向、各軸の長さで表現される
- AABBより計算が複雑だが、より正確な判定が可能
Unityで実装する際の注意点(代表例)

UnityでOBBの衝突判定を実装する際の注意点を見ていきましょう。
BoxColliderを使ったOBB判定
Unityでは、BoxColliderコンポーネントが回転している場合、自動的にOBBとして扱われます。
物理演算を使う場合、Rigidbodyと組み合わせることで、回転する箱同士の衝突を自動で処理してくれます。
手動でOBB判定を実装する場合
物理演算を使わず、手動でOBBの衝突判定を実装する場合、分離軸定理を実装する必要があります。
以下のような関数を実装します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
bool IsOBBColliding( Vector3 center1, Vector3[] axes1, Vector3 halfSize1, Vector3 center2, Vector3[] axes2, Vector3 halfSize2 ) { // すべての軸方向で投影をチェック // 1つでも分離軸が見つかれば衝突していない // すべての軸で重なっていれば衝突している // 実装は複雑なため、ライブラリの使用を推奨 return false; } |
Bounds.boundsを使った簡易判定
UnityのBounds.boundsプロパティは、回転を考慮した境界ボックスを返します。
ただし、これはOBBを囲むAABB(Axis-Aligned Bounding Box)を返すため、完全に正確ではありません。
簡易的な判定には使えますが、より正確な判定には分離軸定理の実装が必要です。
パフォーマンスの考慮
OBBの衝突判定は、AABBより計算コストが高いです。
大量のオブジェクトで判定を行う場合、まずAABBで大まかな判定を行い、衝突の可能性がある場合のみOBBで詳細判定を行うという、2段階の判定方式が有効です。
物理エンジンの活用
Unityの物理エンジンを使えば、OBBの判定を自動で処理してくれます。
OnCollisionEnterやOnTriggerEnterなどのコールバック関数で、衝突を検出できます。
手動で実装するよりも、物理エンジンを使う方が確実で効率的です。

まとめ

この記事では、OBBの当たり判定について見てきました。
重要なポイントをおさらいします。
- OBBは回転を考慮した箱の当たり判定で、AABBより正確な判定が可能
- 衝突判定には分離軸定理(SAT)が使われ、すべての軸で重なっていれば衝突と判定
- ゲームでは、回転するオブジェクト、複雑な形状の簡易判定、物理演算との連携などに使われる
- UnityではBoxColliderが回転している場合、自動的にOBBとして扱われる
- OBBの計算はAABBより複雑だが、物理エンジンを活用することで効率的に実装できる
OBBは、回転するオブジェクトの当たり判定に必要な重要な技術です。
AABBを理解した後、次のステップとしてOBBを学ぶことで、より高度な当たり判定が可能です。
実際のゲーム実装とセットで学ぶことで、理解が深まるはずです。
Unity入門の森では、OBBを含む当たり判定を、実際のゲーム実装とともに体系的に学べます。
ぜひチェックしてみてください。
Unity入門の森をチェック Unity初心者でも安心。動画解説+完成サンプル付きで実装まで進められます





コメント