AABB衝突判定は高速ですが、回転するオブジェクトには不向きです。
「回転するオブジェクトの当たり判定をどう実装するの?」
「OBBって何?」
「AABBとの違いは?」
そんな疑問を抱えている方に向けて、OBB(Oriented Bounding Box)衝突判定について、初心者でも理解できるように詳しく解説します。
\読むだけで終わらせない!実際にゲームを作って実力をつけよう/
トレンド×入門に最適
Unity ノンフィールドRPG
+スレスパ風JRPG講座
Unity6対応・スマホ化対応の最新カリキュラム。今もっとも人気のデッキ構築型ゲームをJRPGと組み合わせて実装。初心者が最初に選ぶ一本として最適です。
王道アクションに挑戦
Unity 2Dアクションゲーム
の作り方講座(ロックマン風)
ロックマン風の本格横スクロールACTをスマホ化・広告実装まで対応。7ステージ+ラスボスという市販ゲームに近い本格構成で、リリースまで見据えて作れます。
3D入門に最適
ゼルダ風3Dアクションゲーム
の作り方講座
ゼルダの伝説・モンハン・原神のような3Dアクションをスマホ対応で作れる入門講座。初心者でも全16回でしっかり3D開発の基礎を習得できます。
あなたのオリジナルゲーム、今年こそ完成させませんか?
RPG・アクション・ホラー…Unityで本格ゲームを作りたい人のための学習サイトです。
実際に完成するゲームを題材に、
ソースコード・素材・プロジェクト一式をすべて公開。
仕事や学校の合間の1〜2時間でも、
「写経→改造」で自分のゲームまで作りきれる環境です。
OBBとは何か

OBB(Oriented Bounding Box)は、任意の方向を向いた直方体を使って行う衝突判定です。
日本語では「方向付き境界ボックス」と呼ばれ、AABBとは異なり、回転に対応できるのが特徴。
回転後の座標系で矩形・直方体を表現するため、回転するオブジェクトにも正確に判定できます。
OBBの構造
OBBは、以下の要素で構成されます。
- 中心点(Center):OBBの中心位置
- 3つの軸ベクトル(Axis):OBBの向きを表す単位ベクトル
- 3つのサイズ(Size):各軸方向の長さ(ハーフサイズ)
AABBが最小点と最大点の2点で表現されるのに対し、OBBは中心点と軸・サイズで表現されます。
AABBとの違い
AABBは軸に平行な矩形・直方体ですが、OBBは任意の方向を向いた矩形・直方体です。
回転するオブジェクトに対しては、OBBの方が正確な判定が可能。
ただし、計算コストはAABBより高くなります。
- 回転するオブジェクトに対応できる
- 中心点と軸・サイズで表現される
- 判定精度が高い
- 計算コストはAABBより高い
OBB衝突判定アルゴリズム

OBB同士の衝突判定は、分離軸定理(SAT:Separating Axis Theorem)を使用します。
これは、2つのOBBが衝突していない場合、必ず分離軸が存在するという原理に基づいています。
分離軸定理とは
2つの凸形状が衝突していない場合、それらを分離する軸(分離軸)が必ず存在します。
OBBの場合は、2つのOBBの軸を組み合わせた15本の軸(各OBBの3軸 × 2 + 9本の外積軸)をチェックします。
すべての軸で衝突が検出されれば、2つのOBBは衝突していると判定できます。
基本的な判定手順
OBB衝突判定の基本的な手順は以下の通りです。
- 2つのOBBの軸ベクトルを取得
- 15本の分離軸候補を計算
- 各軸に対して、OBBの投影範囲を計算
- 投影範囲が重なっていない軸があれば、衝突していない
- すべての軸で重なっていれば、衝突している
投影範囲の計算
OBBを軸に投影した範囲を計算するには、OBBの各頂点を軸に投影して、最小値と最大値を求めます。
ただし、効率化のため、軸ベクトルとサイズを使って直接計算する方法もあります。
- OBB衝突判定は計算コストが高い
- すべての軸をチェックする必要がある
- 最適化が重要(Broad Phaseとの組み合わせ)
- 実装が複雑になる場合がある
UnityでのOBB衝突判定の実装

UnityでOBB衝突判定を実装する方法を見ていきましょう。
OBB構造体の定義
まず、OBBを表現する構造体を定義します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
[System.Serializable] public struct OBB { public Vector3 center; public Vector3[] axes; // 3つの軸ベクトル public Vector3 size; // ハーフサイズ public OBB(Vector3 center, Vector3[] axes, Vector3 size) { this.center = center; this.axes = axes; this.size = size; } } |
この構造体で、OBBの中心点、軸ベクトル、サイズを管理します。
衝突判定関数の実装
OBB同士の衝突判定を実装します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
public static bool CheckOBBCollision(OBB obb1, OBB obb2) { // 15本の分離軸をチェック for (int i = 0; i < 3; i++) { if (!OverlapOnAxis(obb1, obb2, obb1.axes[i])) return false; if (!OverlapOnAxis(obb1, obb2, obb2.axes[i])) return false; } // 外積軸をチェック(9本) for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { Vector3 axis = Vector3.Cross(obb1.axes[i], obb2.axes[j]); if (axis.sqrMagnitude < 0.0001f) continue; // 平行な軸はスキップ axis.Normalize(); if (!OverlapOnAxis(obb1, obb2, axis)) return false; } } return true; // すべての軸で重なっている } static bool OverlapOnAxis(OBB obb1, OBB obb2, Vector3 axis) { float min1, max1, min2, max2; GetProjectionRange(obb1, axis, out min1, out max1); GetProjectionRange(obb2, axis, out min2, out max2); return (min1 <= max2) && (min2 <= max1); } static void GetProjectionRange(OBB obb, Vector3 axis, out float min, out float max) { float projection = Vector3.Dot(obb.center, axis); float radius = 0f; for (int i = 0; i < 3; i++) { radius += Mathf.Abs(Vector3.Dot(obb.axes[i] * obb.size[i], axis)); } min = projection - radius; max = projection + radius; } |
この実装では、15本の分離軸をすべてチェックして、衝突判定を行います。
TransformからOBBへの変換
UnityのTransformからOBBを生成する方法です。
|
1 2 3 4 5 6 7 8 9 10 11 12 |
public static OBB TransformToOBB(Transform transform, Vector3 size) { Vector3 center = transform.position; Vector3[] axes = new Vector3[3]; axes[0] = transform.right; axes[1] = transform.up; axes[2] = transform.forward; return new OBB(center, axes, size * 0.5f); // ハーフサイズに変換 } |
Transformのright、up、forwardを軸として使用します。
OBB衝突判定の実装手順

※この順番を守らずに作り始めると、だいたい後で全部作り直すことになります。
- STEP1OBB構造体の定義
OBBを表現する構造体を定義します。中心点、軸ベクトル、サイズを管理する構造を作りましょう。
- STEP2TransformからOBBへの変換
UnityのTransformからOBBを生成する関数を実装します。Transformのright、up、forwardを軸として使用。
- STEP3投影範囲の計算
OBBを軸に投影した範囲を計算する関数を実装します。中心点の投影と半径の計算が必要。
- STEP4分離軸のチェック
15本の分離軸に対して、投影範囲が重なっているかをチェックします。重なっていない軸があれば、衝突していないと判定。
- STEP5最適化
Broad Phaseとの組み合わせや、不要な計算の削減を行います。大量のオブジェクト間での判定には、最適化が重要。
AABBとOBBの使い分け

AABBとOBBの使い分けを理解しておくことが大切です。
AABBが適している場合
AABBは、回転しない固定オブジェクトに対して最適です。
- 床、壁、障害物などの固定オブジェクト
- Broad Phase(粗い判定)として使用
- 高速な判定が必要な場面
計算が速いため、大量のオブジェクト間での判定にも向いています。
OBBが適している場合
OBBは、回転するオブジェクトに対して最適です。
- プレイヤー、敵キャラクターなどの動的オブジェクト
- Narrow Phase(詳細な判定)として使用
- 正確な判定が必要な場面
精度が高いため、正確な衝突判定が必要な場面で有効です。
ハイブリッドアプローチ
実際のゲーム開発では、AABBとOBBを組み合わせるハイブリッドアプローチが一般的です。
- Broad Phase:AABBを使って遠く離れたオブジェクトを除外
- Narrow Phase:残ったオブジェクトに対してOBBで正確に判定
これにより、速度と精度のバランスを取れます。
- 回転しない固定オブジェクト → AABB
- 回転する動的オブジェクト → OBB
- 大量のオブジェクト間での判定 → AABB(Broad Phase)+ OBB(Narrow Phase)
よくある問題と解決方法

OBB衝突判定を実装する際によくある問題と、その解決方法を紹介します。
計算コストが高い
OBB衝突判定は、AABBよりも計算コストが高いです。
解決方法は、Broad PhaseとNarrow Phaseを分けること。
まずAABBで粗い判定を行い、衝突の可能性があるオブジェクトのみOBBで詳細判定を行います。
実装が複雑
OBB衝突判定の実装は、AABBより複雑です。
解決方法は、既存のライブラリやUnityの機能を活用すること。
Unityでは、Physics.ComputePenetrationなど、衝突判定に関連する機能も提供されています。
精度の問題
浮動小数点の誤差により、判定精度に問題が生じる場合があります。
解決方法は、小さな閾値を設定すること。
|
1 2 3 |
const float epsilon = 0.0001f; if (axis.sqrMagnitude < epsilon) continue; |
これにより、数値誤差による問題を回避できます。
- 計算コストが高い → Broad PhaseとNarrow Phaseを分ける
- 実装が複雑 → 既存のライブラリを活用する
- 精度の問題 → 小さな閾値を設定する
- パフォーマンスが悪い → 不要な計算を削減する

まずはシンプルな実装から始めて、徐々に最適化していきましょう。
OBB衝突判定の最適化

OBB衝突判定を最適化する方法を見ていきましょう。
Broad PhaseとNarrow Phaseの分離
Broad Phase(粗い判定)とNarrow Phase(詳細な判定)を分離することで、効率化できます。
|
1 2 3 4 5 6 7 8 9 |
// Broad Phase: AABBで粗い判定 if (!CheckAABBCollision(aabb1, aabb2)) { return false; // 衝突していない } // Narrow Phase: OBBで詳細な判定 return CheckOBBCollision(obb1, obb2); |
これにより、明らかに衝突していないオブジェクトを早期に除外できます。
空間分割の活用
空間を分割することで、判定の対象を絞り込めます。
グリッド分割やOctreeなどの手法を使えば、近くのオブジェクトのみを判定できます。
Unityでは、Physics.OverlapBoxなどの空間クエリ機能も活用可能です。
キャッシュの活用
OBBの軸ベクトルなどをキャッシュすることで、計算を削減できます。
オブジェクトの回転が変わった場合のみ、軸ベクトルを再計算するようにしましょう。
OBB衝突判定の学習を深めるには

OBB衝突判定の基礎を理解した後は、さらに深く学んでいくことが大切です。
Unity入門の森では、ゲーム開発に必要な数学と物理の知識を体系的に学べる環境が整っています。
特に、永久会員チケットでは、衝突判定だけでなく、物理演算やゲーム数学など、関連する知識も幅広くカバーしています。
また、2Dアクションゲーム講座では、実際にゲームを作りながら、衝突判定の実践的な使い方を身につけられます。
当たり判定の基礎から応用まで、実際のコードと紐付けて学べるので、理解が深まりやすいはずです。
- OBBとは何か、基本的な構造と特徴
- OBB衝突判定アルゴリズム(分離軸定理)
- Unityでの実装方法
- AABBとOBBの使い分け
- よくある問題と解決方法
記事を読んで「作ってみたい!」と思ったら!人気ゲームを題材にした講座で実力をつけよう
知識を読むだけで終わらせるのはもったいない。実際に手を動かしてゲームを1本完成させることで、理解が一気に深まります。人気タイトルをモデルにした講座で、ゲーム開発の第一歩を踏み出しましょう。
Unity ノンフィールドRPG+スレスパ風JRPG講座【Unity6対応!トレンドのデッキ構築×JRPGをスマホ向けに作れる!】

- Unity6対応・スマホ化対応で最新環境のゲーム開発が学べる
- Slay the Spire風のデッキ構築システム×JRPGの組み合わせを実装
- 初心者でも取り組みやすい丁寧な解説構成
- ノンフィールドRPGとデッキ構築JRPGの2つを合わせて学ぶのがおすすめ
Unity ノンフィールドRPGの作り方講座+Slay the Spire風デッキ構築JRPGの作り方講座は、今もっともトレンドのデッキ構築型ゲームシステムをJRPGと組み合わせて実装する方法を学べる講座です。
Unity6対応・スマホ化対応の最新カリキュラムで、コラムやTIPSで読んで「なるほど」と思った知識を、実際に動くゲームとして形にする体験ができます。
「Slay the Spireみたいなゲームを自分でも作ってみたい!」という人の最初の一歩として最適な講座です。
Unity6対応・スマホ化対応の最新カリキュラム
トレンドのデッキ構築×JRPGを最速で実装しよう
→ スレスパ風デッキ構築JRPG講座を見てみる
スマホ対応の最新環境で、ゲーム開発の第一歩を踏み出そう!
Unity 2Dアクションゲームの作り方講座(ロックマン風)【全16回!スマホ化・広告実装まで対応した本格横スクロールACTを作れる!】

- ロックマン・マリオ・カービィのような横スクロールACTをゼロから開発
- 7ステージ+ラスボスステージの市販ゲームに近い本格的なゲーム設計
- スマホ化・AdMob広告実装まで対応してリリースまで見据えた構成
- 敵AI15体・多彩なマップギミック・武器システムを完全実装
- 完全オリジナルゲームをアセット不使用で素材提供付きで制作
Unity 2Dアクションゲームの作り方講座(ロックマン風)は、ロックマン・スーパーマリオ・星のカービィのような2D横スクロールアクションゲームを開発できるようになる本格的な講座です。
TIPSやコラムで学んだ当たり判定・物理挙動・敵AIの知識を、実際のゲームコードとして実装する体験が全16回に凝縮されています。スマホ化・広告実装まで対応しているため、作って終わりではなくリリースまで見据えた実践スキルが身につきます。
「読んで理解した知識を、動くゲームとして形にしたい」という人に強くおすすめの一本です。
スマホ化・広告実装まで対応した本格横スクロールACT
ロックマン風の2Dアクションゲームをリリースまで作り上げよう
→ 2Dアクションゲームの作り方講座を見てみる
広告収益まで視野に入れた実践スキルを今すぐ手に入れよう!
ゼルダ風3Dアクションゲームの作り方講座【全16回!初心者でも3Dアクションがスマホ対応で作れる!】

- ゼルダの伝説・モンハン・原神のような3Dアクションをゼロから開発
- 初心者でも取り組みやすい丁寧な解説構成
- スマホ化対応で実機で動かせるゲームが完成
- アセットを使った実践的なゲーム開発手法が身につく
- 画像・動画・全ソースコード公開の充実したサポート
ゼルダ風3Dアクションゲームの作り方講座は、ゼルダの伝説・モンハン・原神のような本格的な3Dアクションゲームを作りたい人におすすめの入門講座です。
コラム・TIPSで「3Dゲームはなんとなく難しそう」と感じていた人でも、全16回の丁寧な解説で確実に完成まで到達できます。スマホ化対応で実機で動かせるため、作った達成感がひときわ大きい講座です。
「3Dゲームの仕組みを理解した次は、実際に自分で作ってみたい」という人の最初の一歩として最適です。
初心者でも3Dアクションがスマホ対応で完成する
ゼルダ風3Dアクションゲームで3D開発の第一歩を踏み出そう
→ ゼルダ風3Dアクションゲームの作り方講座を見てみる
3D開発の壁を一気に突破!スマホで動くオリジナルゲームを完成させよう!
まとめ

この記事では、OBB衝突判定の実装方法について解説しました。
OBBは、回転するオブジェクトに対応できる衝突判定手法で、AABBより精度が高いのが特徴です。
分離軸定理を使った実装は複雑ですが、回転オブジェクトの正確な判定には必要不可欠。
「OBBって難しそう💧」と感じる方もいるかもしれませんが、基本原理を理解すれば実装できます。
まずはシンプルな実装から始めて、徐々に最適化していきましょう。
- OBBは回転するオブジェクトに対応できる衝突判定手法
- 分離軸定理を使って15本の軸をチェックする
- AABBより精度が高いが、計算コストも高い
- Broad PhaseとNarrow Phaseを分けることで効率化できる
- 回転しないオブジェクトにはAABB、回転するオブジェクトにはOBBを使う
まずはシンプルな実装から始めて、徐々に応用的な使い方に挑戦していきましょう。
Unity入門の森では、衝突判定の基礎から応用まで、実践的な知識を体系的に学べる環境が整っています。
疑問があれば、ぜひ活用してみてください。
あなたのオリジナルゲーム、今年こそ完成させませんか?
RPG・アクション・ホラー…Unityで本格ゲームを作りたい人のための学習サイトです。
実際に完成するゲームを題材に、
ソースコード・素材・プロジェクト一式をすべて公開。
仕事や学校の合間の1〜2時間でも、
「写経→改造」で自分のゲームまで作りきれる環境です。





コメント