座標系

内部的には、Gameware Navigation は、以下のプロパティを持つ座標系を使用して、すべてのデータを作成し、内部計算を実行します。

この座標系の軸は、次の規則を使用して定義されます。Y軸(フロント)の正方向は、画面(読み手から離れる方向)向きです。

これは、次のような結果になります。

ゲーム エンジン内で異なる座標系を使用する場合は、値を変換する必要があります。次のセクションを参照してください。

注:いくつかの例外がありますが、関数またはメソッドの名前に ClientCoordinates があることでその旨が明示的に示されています。例: ClientInputConsumer::ConsumeTriangleFromPosInClientCoordinates()

CoordSystem ヘルパー クラス

CoordSystem クラスは、ゲームで使用する座標系と Gameware Navigation で使用される座標系の間で座標、ベクトル、距離、バウンディング ボックスを変換するために使用できるオプションのヘルパーです。

このクラスを使用するには、次の手順を実行します。

  1. CoordSystem クラスのインスタンスを作成し、CoordSystem::Setup() への呼び出しで初期化します。
  2. データを変換するために、そのクラスの任意のメソッドを呼び出します。

CoordSystem をセットアップする

次のコードは、アップ軸として Y 軸を使用し、センチメートル単位で距離を表しているゲームで使用するために CoordSystem を設定する方法を示します。

Kaim::CoordSystem coordSystem = Kaim::CoordSystem();
    KyFloat32 oneMeterInClientUnits = 100.f;
    Kaim::CoordSystem::ClientAxis clientRightAxis = Kaim::CLIENT_X;
    Kaim::CoordSystem::ClientAxis clientFrontAxis = Kaim::CLIENT_MINUS_Z;
    Kaim::CoordSystem::ClientAxis clientUpAxis = Kaim::CLIENT_Y;
 
    coordSystem.Setup(  oneMeterInClientUnits, 
                        clientRightAxis, 
                        clientFrontAxis, 
                        clientUpAxis ); 

座標とベクトルを変換する

たとえば、次の呼び出しでは、ゲーム エンジンで使用されている座標系から、指定された位置を Gameware Navigation 座標系に変換します。

Kaim::Vec3f navPos = coordSystem.ClientToNavigation_Pos(position);

同様に、次の呼び出しでは、Gameware Navigation 座標系から、指定されたディレクショナル ベクトルをゲーム エンジンで使用されている座標系に変換します。

Kaim::Vec3f navDir = coordSystem.NavigationToClient_Normal(dir);

CoordSystem クラスで提供されている変換メソッドでは、浮動小数点を使用して距離の測定値を表し、浮動小数点の配列を使用して座標を表します。倍精度の数値を使用する場合、データを変換するために追加の処理が必要になることがあります。

もちろん、ユーザ独自の関数を記述してデータ変換をカプセル化することができます。これにより、コードの重複が最小限に抑えられ、ゲームで使用する同じデータ型を関数が受け入れて返すようにすることで、タイプ セーフを確実にすることができます。

バウンディング ボックスを変換する

Gameware Navigation 座標系とゲーム エンジンで使用する座標系の間で、バウンディング ボックスの変換が必要になることがあります。複数の座標系の間でのバウンディング ボックスの変換は困難なことがあるため、この場合は、CoordSystem またはそのマクロを使用して変換を実行することを特にお勧めします。

通常、軸に合わせたバインディング ボックスは、ボックスの 2 つの極値を使用して定義します。

  • 最小値、つまり最小の X、Y、Z 値を持つコーナー。
  • 最大値、つまり最大の X、Y、Z 値を持つコーナー。

1 つの座標系から別の座標系に最小値と最大値の座標を個別に変換する場合、ターゲットの座標系で、2 つの異なるコーナーを持つボックスが発生する可能性があります。

たとえば、ゲーム ワールドで左手の Z アップ座標系を使用している場合、Gameware Navigation で使用される右手系の Z アップ座標系に座標をマッピングすると、(-X, Y, Z)のような変換も行われることがあります。最小値と最大値の座標が(minX, minY, minZ)および(maxX, maxY, maxZ)である場合、これらの座標を個別に変換すると、(–minX, minY, minZ)および(–maxX, maxY, maxZ)が作成されます。maxX は必ず元の minX よりも高いため、変換後、–maxX は –minX より低いことが保証されます。これら 2 セットの座標は、引き続きバウンディング ボックスの対角の反対側のコーナーを表しますが、極値は表していません。

具体的な場合として、最小値が原点(0, 0, 0)で、最大値がコーナー(100, 100, 100)である、軸に合わせた立方体のバウンディング ボックスがあるとします。これらの 2 つの座標系を個別に変換すると、座標(–0, 0, 0)および(–100, 100, 100)が作成されます。これらのコーナーは最小値(最小の X、Y、Z 値のコーナー)および最大値(最大の X、Y、Z 値のコーナー)を表していません。その代わり、変換されたバウンディング ボックスの最小値は(–100, 0, 0)となり、最大値は(–0, 100, 100)となります。

CoordSystem クラスは、バウンディング ボックスの変換時にはこれを考慮し、ボックスの定義に使用されるコーナーが、常にターゲットの座標系の最小値および最大値となるようにします。

たとえば、次の呼び出しでは、ゲーム エンジンで使用されている座標系から、バウンディング ボックスを Gameware Navigation 座標系に変換します。

Kaim::Box3f navAABB;
coordSystem.ClientToNavigation_Box(gameMinima, gameMaxima, navAABB);