WisdomSoft - for your serial experiences.

空間の範囲

3 次元空間内の範囲を表す方法について紹介します。空間内の範囲に対して、物体が含まれているかどうかや、交差しているかどうかなどの衝突判定に応用されます。

箱型の範囲

平面である 2 次元空間と範囲を長方形領域で荒らすことができたように、 3 次元空間上の範囲も 1 つの値で表せます。空間上の範囲は箱型と球体の 2 種類があり、これらの値を用いて衝突や交差を判定できます。

箱型の範囲は Microsoft.Xna.Framework.BoundingBox 構造体で表されます。

Microsoft.Xna.Framework.BoundingBox 構造体
[TypeConverterAttribute("typeof(Microsoft.Xna.Framework.Design.BoundingBoxConverter)")]
[SerializableAttribute]
public struct BoundingBox : IEquatable<BoundingBox>

この構造体は箱の範囲を最小点と最大点の 2 点を用いて表します。オーバーロードされたコンストラクタから、これらの値を初期化できます。

BoundingBox 構造体のコンストラクタ
public BoundingBox (Vector3 min, Vector3 max)

min パラメータにははこの最小点を、max パラメータには最大点を指定します。 例えば最小点 (0, 0, 0) から最大点 (1, 1, 1) までの箱を正の Z 軸から見たとき、箱の背面左下隅が最小点、箱の前面右上隅が最大点となります。

コード1
using System.Diagnostics;
using Microsoft.Xna.Framework;

public class TestGame : Game
{
    public static void Main(string[] args)
    {
        BoundingBox box1 = new BoundingBox();
        BoundingBox box2 = new BoundingBox(Vector3.Zero, Vector3.One);

        Debug.WriteLine("box1=" + box1);
        Debug.WriteLine("box2=" + box2);
    }
}
実行結果
コード1 実行結果

コード1は BoundingBox 構造体の値を生成し、出力しています。box1 は最小点と最大点が共に 0 にある空の箱です。box2 は最小点 (0, 0, 0) から最大点 (1, 1, 1)までの単純な箱です。

箱の最小点は Min フィールドから、最大点は Max フィールドから設定または取得できます。

BoundingBox 構造体 Min フィールド
public Vector3 Min
BoundingBox 構造体 Max フィールド
public Vector3 Max

箱の範囲は、これらのフィールドを通して任意で変更できます。

コード2
using System.Diagnostics;
using Microsoft.Xna.Framework;

public class TestGame : Game
{
    public static void Main(string[] args)
    {
        BoundingBox box;
        box.Min = new Vector3(-5, -5, -5);
        box.Max = new Vector3(5, 5, 5);

        Debug.WriteLine("Min=" + box.Min + ", Max=" + box.Max);
    }
}
実行結果
コード2 実行結果

コード2は BoundingBox 構造体を Min フィールドと Max フィールドから設定しています。

球体の範囲

空間の範囲を球体で表すには Microsoft.Xna.Framework.BoundingSphere 構造体を用います。 

Microsoft.Xna.Framework.BoundingSphere 構造体
[TypeConverterAttribute("typeof(Microsoft.Xna.Framework.Design.BoundingSphereConverter)")]
[SerializableAttribute]
public struct BoundingSphere : IEquatable<BoundingSphere>

この構造体は球体の中心と半径で範囲を表します。球体の中心と半径はコンストラクタから指定できます。 

BoundingSphere 構造体のコンストラクタ
public BoundingSphere (Vector3 center, float radius)

center パラメータには球の中心点を、radius パラメータには半径を指定します。

コード3
using System.Diagnostics;
using Microsoft.Xna.Framework;

public class TestGame : Game
{
    public static void Main(string[] args)
    {
        Vector3 center = new Vector3(5, 5, 5);
        BoundingSphere sphere1 = new BoundingSphere();
        BoundingSphere sphere2 = new BoundingSphere(center, 3);

        Debug.WriteLine("sphere1=" + sphere1);
        Debug.WriteLine("sphere2=" + sphere2);
    }
}
実行結果
コード3 実行結果

コード3は BoundingSphere 構造体の値を生成し、出力しています。コンストラクタで設定した中心と半径が正しく設定されています。

球の中心は Center フィールド、半径は Radius フィールドから設定または取得できます。 

BoundingSphere 構造体 Center フィールド
public Vector3 Center
BoundingSphere 構造体 Radius フィールド
public float Radius

球の範囲は、これらのフィールドを通して任意で変更できます。

コード4
using System.Diagnostics;
using Microsoft.Xna.Framework;

public class TestGame : Game
{
    public static void Main(string[] args)
    {
        BoundingSphere sphere;
        sphere.Center = Vector3.Zero;
        sphere.Radius = 1;

        Debug.WriteLine("Center=" + sphere.Center + ", Radius=" + sphere.Radius);
    }
}
実行結果
コード4 実行結果

コード4は BoundingSphere 構造体の中心と半径をフィールドから設定しています。