[Unity] バウンディングボックス(AABB)について調べてみた

[Unity] バウンディングボックス(AABB)について調べてみた

ゲームにおいて衝突判定を行う際、AABB(軸平行境界ボックス)を定義して無駄な計算を削減するアルゴリズムがよく用いられます。
AABBはxyzの各軸に平行な直方体です。
軸に平行であるため、当たり判定の計算が非常に軽くなります。

aabb-area

複雑なメッシュ形状に対する衝突判定を行う際、メッシュ形状を包含するAABBを事前に定義し、まずAABBとの衝突判定(軽い計算)を行います。
AABBと衝突している場合のみ、メッシュ形状に対する衝突判定(重たい計算)を行います。
こうすることで、AABBに衝突しなかった場合は重たい計算は行わずに済みます。

このアルゴリズムはUnityのColliderでも使用されています。
Collider.boundsがワールド座標のAABBを表しています。

このAABBを次のスクリプトを用いて表示してみました。

using UnityEngine;

/// <summary>
/// バウンディングボックス表示
/// </summary>
public class DrawBounds : MonoBehaviour {
    /// <summary>
    /// 表示用のバウンディングボックス(Prefab)
    /// </summary>
    [SerializeField]
    private GameObject bounds;

    /// <summary>
    /// 表示用のバウンディングボックス
    /// </summary>
    private GameObject newBounds;

    /// <summary>
    /// 初期化
    /// </summary>
    private void Start() {
        newBounds = Instantiate(bounds, transform.position, Quaternion.identity) as GameObject;
    }

    /// <summary>
    /// バウンディングボックスの表示更新
    /// </summary>
    private void Update() {
        var col = GetComponent<Collider>();
        if ( col == null ) {
            newBounds.SetActive(false);
        } else {
            newBounds.SetActive(true);
            newBounds.transform.localScale = col.bounds.size;
        }
    }
}

実行結果は以下の通り。

uniaabb1

オブジェクトを回転すると、リアルタイムにバウンディングボックスが更新されます。

uniaabb2

内部処理の詳細は不明ですが、回転するたびにバウンディングボックスの再計算が行われていると思われるため、パフォーマンスへの影響は確実に出るでしょう。
拡大縮小時も同様です。
実際にどれくらい影響が出るかについては後日調査しようと思います。