UE4のUEGeoCoordinates PluginでGeocentricしてみる

はじめに

https://crssnky.hatenablog.jp/entry/2021/BMD

↑の子記事となっています。記事の背景を知る場合はこちらから参照ください。

UEGeoCoordinates Pluginとは

github.com

EpicGamesが作っているUE4の公式プラグインです。
最初に言うと、このプラグインUE4.26向けにプレビュー版として公開されており、次期バージョンのUE4.27では"GeoReference Plugin"として標準搭載されています。
もちろん、今回お話する内容はUE4.26向けのプレビュー版です。4.27ではたぶん違います。ソース見たら違ったし...

UEGeoCoordinates Pluginは、おそらく"Project Anywhere"のために作られたと予想します。現実の座標(緯度経度など)を表すためのクラスや倍精度浮動小数点を使った座標クラスなど、シミュレーション用途で必要そうなものが揃っているので。
このプラグインの使い方や現実での座標の考え方は、プラグインリポジトリにPDFがあるのでそれを見ると分かります。座標の考え方や座標参照系など、馴染みが薄いものが分かりやすい英語と図で解説されているのでここで書く必要は無いでしょう。

Geocentricしてみる①

Geocentric coordinate systemとは、いわゆる地心座標系です。
地球の中心を(0,0,0)とし、北極点をZ軸方向、本初子午線をX軸方向、東経90度方向をY軸方向とする座標系です。単位はmで、3D界隈の人にはとっつきやすいものかと思います。
(Y軸が上方向でしょ。など、軸に関しては言いたいこともあるかもですが...)

これをね、そのままUE4に適用しちゃえば良いって話ですよ。
BP関数はこちら↓
f:id:crssnky:20210711011839p:plain

Geographical coordinate systemは、いわゆる地理座標系です。ですので、この関数の入力は緯度, 経度, 高度(Lat, Lon, Alt)です。

プラグインのSubsystemからGeographic to Geocentric関数を呼び出すだけで変換できます。ただ、出力は倍精度浮動小数点を使った座標クラスであり、単精度浮動小数点数を使うVector3では使えません。自作の関数で、泣く泣く精度を下げています。

Geocentricしてみる②

Blueprint内で緯度経度からXYZに変換する方法は分かりました。しかし、Level内に原点を設定する必要があります。
f:id:crssnky:20210711012603p:plain

GeoreferecingActorをLevelに置きましょう。これ自体の座標は関係ありませんが、Origin Projected Coordinatesや各種CRS(座標参照系)を指定してあげる必要があります。
f:id:crssnky:20210711012839p:plain

Origin Projected Coordinatesは原点にしたいLevel内の座標を指定します。何も考えず、(0,0,0)でも問題ないです。
CRS(座標参照系)は、プラグインのPDFの通り、https://epsg.io/ で探しましょう。"CRS Tokyo"などでGoogleで調べても良いかもしれません。
入れたい緯度経度が日本周辺だったため、上記画像の値は東京となっています。

GeoreferencingSubsystemはこのActorの設定値を読み取り、適切な変換を行います。

おわりに

変換すれば、以下のように良い感じで緯度経度をUE4のワールド座標に変換することができます。
(これは発射点と着地点の間に最高点を入れて補間してるけどね)