レベルでジオリファレンスを使用する

Georeferencing プラグインを使用して、UE4 のレベル マップ上の位置を、物理空間の位置に関連付ける方法です。

Choose your operating system:

Windows

macOS

Linux

コンテンツ

ジオリファレンス とは、ある環境を、物理空間の位置に関連付けることを意味します。この用語は位置情報システムの分野で一般的に使用され、物理マップやマップのラスタ画像を、空間位置に関連付けるプロセスを説明します。環境でジオリファレンスを行うと、Unreal Engine は実際の位置座標 (緯度/経度や UTM 座標など) を表現できます。

前提条件

  • ここで説明する機能を使用する際は Georeferencing プラグインの有効化が必須です。

理論的な背景

Coordinate Reference Systems (CRS) と楕円体

惑星上にオブジェクトを配置する場合、その位置を表現するために Coordinate Reference System (CRS) の選択が必要です。

この処理が複雑になる理由は、この惑星が平面でも球体でもなく、楕円体であることです。データムと呼ばれる楕円体モデルは複数ありがますが、地球に用いる WGS84 が良く知られています。

ellipsoid 3D model, axes relation diagram, and formula

たとえば WGS84 楕円体を用いると、両軸の長さには約 22km もの差が生じます。

  • a = 6 378 137.0 m

  • b = 6 356 752.314 245 m

  • 1/f = 298.257 223 563

それぞれの Coordinate Reference System は、それぞれが基準とする楕円体モデルを使用して位置を定義します。そして CRS にはさまざまな種類があり、それぞれが独自のプロパティを持ちます。

Geographic CRS

Geographic CRS は、極座標を使用して惑星上にある点の位置を表現します。

Geographic CRS representation

  • Latitude (緯度) = 赤道に対する仰角度

  • Longitude (経度) = 本初子午線 (グリニッチ) に対する方位角度

  • Altitude (高度) = メートル単位で表した準拠となる楕円体からの高さ。

角度は 10 進数や DMS (度、分、秒) で表現します。

実は緯度の定義には 2 種類あり、データムが球体でない場合は楕円体モデルのローカル法線を含みますが、ここでは解説しません。

Geocentric CRS

Geocentric CRS はデカルト座標を使用し、惑星の中心に置いた原点を基準にして、惑星上の点の位置を定義します。

以下の画像は Earth-Centered, Earth-Fixed (ECEF) CRS を示し、これは DIS/HLA など、分散シミュレーション プロトコルで使用する標準参照 CRS です。

Geocentric CRS representation

  • Origin (原点) = 地球の中心

  • X 軸は赤道と本初子午線 (グリニッジ) の交点を指します。

  • Z 軸は地球の自転軸と一致します。

  • Y 軸は上記 2 軸と直交します。

座標の単位はメートルを使用します。

Projected CRS

投影座標系とは、地図投影法で惑星を「平坦化」する Geographic Coordinate System です。この方法は紙の地図で日常的に目にするものです。球体を平面に投影する方法は複数存在するため、マップする領域ごとに多少の変形を伴う、利用できるマップ投影法がたくさんあります。

基本的な投影のほとんどは、平面、円錐、円筒などの形状を使用します。

planar-projection-1.png

cone-projection-1.png

cylinder-projection-1.png

planar-projection-2.png

cone-projection-2.png

cylinder-projection-2.png

最も頻繁に使用する投影法の 1 つはメルカトル図法で、これには複数のバリエーションがあります。

たとえばユニバーサル横メルカトル図法は、シミュレーション業界で広く使用されています。 この CRS では地球を 60 の部分、つまり「ゾーン」に分割し、各ゾーンの中央子午線に接する円筒投影を使用して、これらの南北方向のゾーンをそれぞれ投影します。

Earth showing meridian zones Cylinder mapping to earth for the projection

これは XYZ 座標に基づいたデカルト座標系であり、原点の定義にゾーンと半球の識別子が必要です。すべての座標を明確にするためには特定の前提が求められます。

6° の幅を持つ各 UTM ゾーンには、定義上 X = 500,000 メートルの位置に中央子午線があります。この中央子午線は、負の座標を回避するための任意の値です。この中央の値と比較して、東向きの値はすべて大きくなり、西向きの値はすべて小さくなりますが、すべて正の値です。

北半球にいる場合、赤道の値は北向きに 0 メートルです。一方、南半球では赤道が 10,000,000 メートルから始まります。これは赤道の南にある値はすべて、正の値を維持したまま、この値から減算するためです。これを疑似北向き座標と呼び、南半球の Y 座標が負の値になることを回避します。

また、軍用方眼地点指示方式 (MGRS) など、このシステムから派生した方法も存在します。

CRS を表現する方法

利用できる投影システムは非常にたくさん存在し、こうした規則は、楕円体、単位、子午線、投影など、特定の設定を宣言するために定義されます。このデータを保存する形式も多様ですが、最もよく使用されるのは Well-Known-Text (WKT) と European Petroleum Survey Group (EPSG) コードです。

たとえば http://epsg.io/ のような Web サイトが各 CRS に関する情報を提供していますが、詳細はこのドキュメントの範囲外です。

それでも、座標を正しい値に変換する際に使用するため、CRS に関する理解は非常に重要です。

参考画像

測地学 (地球の形状と領域を扱う数学の分野) の詳細については以下のリンクをご参照ください。

Georeferencing プラグイン

Unreal Engine で利用できる Georeferencing プラグインは、ある特定の CRS でレベルの原点座標を定義して、異なる CRS ごとに座標を変換する関数を提供します。Unreal の各 アクタ は、このレベルの原点を基準にして定義した座標を持つため、任意の参照位置を把握するためにエンジンの原点を地球上で特定する必要があります。

ここでは異なる 2 つ場合を検討します。

  • 平面の惑星 :Unreal Engine の環境が平らな地面で近似できるほど小さい (数百キロ未満) 場合、地面を「投影モード」でモデル化したものと考えます。つまり、すべての座標は、単純な変換オフセットを 1 つ使用して Projected CRS で定義できます。

  • 球形の惑星 :Unreal Engine の環境が非常に大きく、惑星の曲率を考慮すべき場合は、球形や楕円形で惑星全体をカバーするジオメトリが必要です。この場合は、惑星シェイプの中心、またはサーフェス上の任意の点という、2 つの方法で原点を配置できます。後者では、上を向いた Z 軸が、この点で楕円体に対して垂直だと仮定します。

これらの状態を、以下の画像で説明します。

  • 平面の惑星の場合、環境は緑色の四角形で表現でき、レベルで選択したモデルの原点は点 P です。これは惑星上の任意の位置で、地理座標 (緯度と経度) またはデカルト座標の上に、特定の Projected CRS で定義できます。この XYZ 座標は CRS で「東/北/上」の方向として表現します。

  • 球形の惑星での選択肢は 2 つあります。

    • 惑星の中心にレベルの原点を配置する場合。これは ECEF ケースであり、原点にジオメトリがありませんが、代わりに座標には惑星の半径に基づく大きな値があります。ECEF CRS はデカルト座標系を使用し、その軸はエンジンの軸と一致します。

    • 惑星サーフェスの任意の点にレベルの原点を配置する場合。平面の惑星の場合と同様に、こうした座標は Geographic CRS や Projected CRS で表現します。レベルの上方向を、楕円体のこの位置での法線と一致させると便利なので、平面ジオメトリの「前」と「右」ベクターの方向が、「北」と「東」ベクトルになるように設定します。

Flat plane mapped to a round planet

地理空間の分野では、ほとんどの座標を右手系フレームで表現しますが、Unreal Engine の座標系は左手系です。Georeferencing プラグインは地理空間での使用方法と一貫性を保つため、右手系のロジックで座標を表現します。つまり、座標を変換する際は、ある地点で Y 座標が反転します (これをエンド ユーザーが意識することはありません)。

選択した軸規則を以下に示します。

flat coordinate axes convention

ecef coordinate axes convention

Unreal のフレームが接線のフレームと一致する場合

Unreal のフレームが ECEF のフレームと一致する場合

別の規則を使用する場合は、Georeferencing の関数を使用する前に座標変換の実行が必要です。

ワールド コンポジションの使用時や、手動再設定の実行時にアクティブになるワールド基点オフセットのシフトを、このシステムは自動的に処理します。

Georeferencing システムを設定する

メインメニューから [Edit (編集)] > [Plugins (プラグイン)] に移動して Georeferencing プラグインを有効化します。

Georeferencing plugin

このプラグインを有効化すると、座標の変換に 4 つの方式を使用できます。

  • Unreal Engine 座標系

  • 任意の Projected CRS

  • 任意の Geographic CRS

  • 標準 ECEF CRS

[Place Actors (アクタを配置)] パネルから [Geo Referencing System] アクタ を見つけてレベルにドラッグし、それを選択して [Details (詳細)] パネルでプロパティを確認します。

Geo Referencing System Actor

プロパティ

説明

Geo Referencing

Planet Shape

平面か球形か。これはプロジェクトで使用するジオメトリのシェイプ/スケールにのみ依存します。

Projected CRS

文字列で指定します。PROJ ライブラリがサポートする任意の CRS を指定できます。Web サイト「 https://epsg.io/ 」を参照して適切な CRS 定義を探します。

Geographic CRS

文字列で指定します。PROJ ライブラリがサポートする任意の CRS を指定できます。Web サイト「 https://epsg.io/ 」を参照して適切な CRS 定義を探します。

原点の位置

Origin Location in Projected CRS

原点を定義する座標系について Projected CRS または Geographic CRS を選択します。

Origin at Planet Center

球形の惑星のみ。惑星の中心を原点として定義するかどうかを決定します。

Origin Projected Coordinates Easting

Projected CRS 座標系を使用する場合の、原点の東西座標。

Origin Projected Coordinates Northing

Projected CRS 座標系を使用する場合の、原点の南北座標。

Origin Projected Coordinates Up

Projected CRS 座標系を使用する場合の、原点の上下座標。

Origin Latitude

Geographic CRS 座標系を使用する場合の、原点の南北座標。

Origin Longitude

Geographic CRS 座標系を使用する場合の、原点の東西座標。

Origin Altitude

Geographic CRS 座標系を使用する場合の、原点の上下座標。

CRS 投影 ID に無効な文字列を使用するとエラー メッセージを生成します。「 https://epsg.io/ 」で定められた適切な CRS 定義を、必ず使用します。

Editor error message

Log error message

以下のスクリーンショットでは、ジオメトリに平面、モデル化に Projected CRS を設定しています。EPSG コード 32617 は UTM North Zone 17 を意味し、この座標は Epic Games 本社付近と一致します。また EPSG:4326 は WGS84 楕円体を意味し、緯度、経度、高度の地理座標は、すべてこれと相対的に定義されます。

Origin Location in Projected CRS enabled Origin Location in Projected CRS disabled

浮動小数点の精度の観点から不適切な切り捨てを避けるために、こうした原点の値は必ず整数で指定します。このコンストレイントを考慮して環境をモデル化します。Georeferencing プラグインは内部的な計算をすべて倍精度で実行し、惑星上のすべての位置で精度を維持します。

[Round Planet] を選択する場合、原点の位置を設定するチェックボックスがさらに表示されます。

  • [Origin at Planet Center] にチェックを入れると ECEF ケースを使用するものと見なされます。前述した通り、明示的に原点を定義するため、これ以上の情報は必要ありません。

  • または、選択した CRS を使用して楕円体上の任意の位置に レベルの原点 を設定できます。

Origin at Planet Center enabled Origin at Planet Center disabled

座標を変換する

座標を変換する際は、まず Georeferencing システムにアクセスしてから Georeferencing カテゴリの関数の 1 つを呼び出します。

Find georeferencing Blueprint node

Georeferencing output function nodes 1 Georeferencing output function nodes 2

次の図で、実行できる変換について説明します。

留意すべき要点として、Georeferencing システムの動作は倍精度を使用しますが、単精度浮動小数点値のみをサポートするブループリント システムの座標に、これを直接公開できません。このシステムは特定の構造体 ( FCartesianCoordinates FGeographicCoordinates ) を出力するので、すべての計算でこうした構造体を使用し、最後のステップで float 近似値を取得することを推奨します。

Conversion paths

Unreal Engine CRS とはレベルの座標系で、すべてのアクタはこの座標を FVector 変数に保持しています。最初のステップは、こうした座標を Georeferenced CRS に変換することですが、必要に応じて引き続きデカルト座標 (ECEF や Projected) を使用します。そして次に、この位置を地理座標に変換できます。

Unreal Engine 座標を Projected や ECEF の座標に変換する際の計算方式は、Flat Planet/Round Planet のプロパティに依存します。

たとえば Round Planet を選択して Engine to Projected の変換を行う場合、まず最初に座標を ECEF に変換してから (基本変換)、Projected に変換します (複雑な投影)。こうした中間ステップは緑と赤の円形矢印で示します。 つまり、目的が地理座標の取得のみである場合、パフォーマンスに関して最適な順序は、球形の惑星に対しては UE > ECEF > Geographic 、平面の惑星に対しては UE > Projected > Geographic です。

Optimal Blueprint paths for conversions

値を取得する

FCartesianCoordinates FGeographicCoordinates を取得したら、さまざまな方法で値を取得できます。

  • ブループリントで ToFloatApproximation を呼び出します。この近似は、倍精度からブループリントの単精度への変換に対応します。

  • カスタム C++ コードを使用して独自の処理を行います。倍精度を完全に維持する場合は、 FCartesianCoordinates FGeographicCoordinates の構造体を直接受け取る関数を記述して、こうした値を取得することを推奨します。

  • 適切な切り捨てオプションを使用して、取得した値を表示テキストに変換します。

Blueprint node options for obtaining values

形式

FCartesianCoordinates

FGeographicCoordinates

To Compact Text

({X}, {Y}, {Z})

({Latitude}, {Longitude}) {Altitude}m

緯度や経度は次のように記述できます: {Degree}° {Minutes}' {Seconds}"

To Full Text

X={X}, Y={Y}, Z={Z}

Latitude={Latitude} Longitude={Longitude} Altitude={Altitude}m

緯度や経度は次のように記述できます: {Degree}° {Minutes}' {Seconds}"

To Separate Texts

{X}
{Y}
{Z}

{Latitude}
{Longitude}
{Altitude}

接線ベクターと変換

Georeferencing システムの Get ENUVectors at Geographic Location ノードを使用して、Unreal Engine CRS で表現した 接線 ベクター (East、North、Up) を取得できます。たとえばこれは、惑星のサーフェスに沿ったポーンの移動に使用できます。

Get ENUVectors at Geographic Location Blueprint node

同様に Get Tangent Transform at Geographic Location ノードを使用して、惑星上の任意の位置に対する 接線トランスフォーム を取得できます。このトランスフォームを、ローカル オブジェクトのトランスフォームと組み合わせることで、オブジェクトのワールド空間トランスフォームを Unreal Engine CRS で取得します。

Get Tangent Transform at Geographic Location Blueprint node

非常に特殊な機能ノード Get Planet Center Transform も利用できます。 Georeferencing の設定で宣言した原点に対して、接するように配置する独自の楕円体惑星メッシュを使用する場合、この関数を呼び出して、このアクタのトランスフォーメーションを設定すると、その定義した位置に対して向きを指定できます。

Get Planet Center Transform Blueprint node

追加のツールとコンテンツ

Georeferencing システムに付属する追加のツールは、 コンテンツ ブラウザ の「 Georeferencing Content 」フォルダから利用できます。 [View Options (表示オプション)] ドロップダウン メニューから [Show Plugin Content (プラグイン コンテンツの表示)] を選択すると、これらを表示できます。

Georeferencing のステータス バー

「/ GeoReferencing/UI/UMG_GeoStatusBar 」にある UMG ウィジェット のサンプルをビューポートに追加すると、現在のビューの位置を Projected、Geographic、ECEF の各 CRS で表示します。

Georeferencing widget

これを複製して必要に応じたカスタマイズを加えることができます。

Georeferencing widget in action in Viewport

Coordinates Inspector Utility ウィジェット

特殊な エディタ ユーティリティ ウィジェット を「 /GeoReferencing/UtilityWidgets/EUW_CoordinatesInspector 」から利用できます。これをエディタで実行すると、Georeferencing を適用したビューの座標を制御するパネルが表示され、カウス カーソルの下にある位置を示します。

Coordinates Inspector widget

Coordinates Inspector widget in action in Viewport

位置プローブと再設定アクタ

GeoReferencing/Models/LocationProbe/BP_LocationProbe 」フォルダにある「 BP_Location Probe 」ブループリントを利用するとゲーム内の座標測定を実行できます。

これをレベルにドロップして任意の位置に追加すると、それぞれの CRS で座標を表示します。

さらに、提供されたスポナー ブループリントの 1 つを使用してプローブ グリッドをスポーンすると、このプロセスを自動化できます。

Location Probe and Rebasing Actors Location Probe Blueprints

Location Probes in action in Viewport

大きな座標を処理する際に精度を確保するため、Unreal Engine は原点をシフトできます。

この再設定システムは、ワールド コンポジション中に自動で使用されますが、直接制御することもできます。この目的のためにシステムを制御する方法を示す例として「 BP_Rebasing 」アクタを提供します。

Georeferencing システムの計算では常に現在の原点オフセットを考慮します。

Unreal Engine のドキュメントを改善するために協力をお願いします!どのような改善を望んでいるかご意見をお聞かせください。
調査に参加する
キャンセル