Unity の Geospatial Creator でプログラムでアンカーを作成、編集する

このガイドでは、Geospatial Creator を使用して C# スクリプトを記述し、Unity の編集モードで ARGeospatialCreatorAnchor オブジェクトの作成や移動などの一般的なタスクをすばやく行う方法について説明します。これは、スプレッドシートや KML ファイルなどの事前定義されたリストから複数のアンカーを作成する場合に便利です。

Unity の Geospatial Creator を使用すると、Unity エディタでジオ空間コンテンツをプレビューできます。クイックスタート ガイドでは、Geospatial Creator について説明します。また、Unity エディタ UI を使用して、最小限のプログラミングで最初の Geospatial 対応 AR エクスペリエンスを構築する方法についても説明します。高度なプロジェクトでは、Unity エディタの UI を使用する代わりに、Geospatial Creator GameObject をプログラムで作成して操作することをおすすめします。

このガイドでは、クイックスタートで説明した Geospatial Creator の基本コンセプトを理解しており、Geospatial Creator アンカーをシーンに追加する準備ができていることを前提としています。Geospatial Creator を有効にして API キーで構成し、シーンに初期 AR セッション オブジェクトを配置する必要があります。最初から作成する場合は、クイックスタート ガイドの「Geospatial Creator を有効にする」セクションまで進んでから、続行してください。

スタートガイド

この例では、米国カリフォルニア州サンフランシスコの市庁舎の周辺に、AR コンテンツを配置する既知の場所がいくつかあるとします。これらの各場所にアンカー オブジェクトを作成し、それらのアンカーに基本ジオメトリを接続する必要があります。

アンカーを作成する前に、ARGeospatialCreatorOrigin を指定する必要があります。これは、緯度、経度、高度を Unity ワールド座標との間で変換するための参照ポイントです。オリジンには、CesiumGeoreference サブコンポーネントと Cesium3DTileset 子オブジェクトも含まれます。これにより、Cesium は Unity エディタのシーンビューで周囲の領域をレンダリングできます。これには、クイックスタートで説明されている Google マップ タイル API キーが必要です。

Origin を作成する

Geospatial Creator の API には、シーンに ARGeospatialCreatorOrigin を作成し、必要な Cesium コンポーネントを追加するファクトリー メソッドが含まれています。次のコードは、指定された Map Tiles API キーを使用して、近くの緯度、経度、高度に起点を作成します。

ARGeospatialCreatorOrigin origin =
  GeospatialCreatorCesiumAdapter.CreateOriginWithCesiumGeoreference(
    37.77954, -122.417581, 0.0, "<MAP_TILES_KEY>");

デフォルトでは、このオブジェクトは Unity ワールド座標の(0, 0, 0)に配置されます。これはこの例に適しています。

ARAnchorManager 参照を取得する

ランタイムで地理空間アンカーを解決するには ARAnchorManager が必要であるため、シーン内の ARAnchorManager への参照も必要です。ARCore Extensions にバンドルされている Geospatial サンプル アプリケーションから始めた場合、アンカー マネージャーは「AR Session Origin」ゲームオブジェクトに接続されています。シーンにアンカー マネージャーが 1 つしかないと仮定すると、次のようにアンカー マネージャーへの参照を取得できます。

ARAnchorManager anchorManager =
    Resources.FindObjectsOfTypeAll<ARAnchorManager>()[0];

オリジンとアンカー マネージャーが作成できたので、ARGeospatialCreatorAnchor オブジェクトの作成を開始できます。

地形アンカーを作成する

次の double 値の 2 次元配列について考えてみましょう。これは、米国カリフォルニア州サンフランシスコの市庁舎の東側にある 3 つのポイントの正確な緯度と経度を表しています。

double[,] _cityHallEastPoints = {
    { 37.77936, -122.418617 }, // in front of city hall
    { 37.77965, -122.418680 }, // right of city hall
    { 37.77917, -122.418577 }}; // left of city hall

AR アプリで、これらの場所の各所に 1 メートルの立方体を地面レベルに配置するとします。次のコードは、ARGeospatialCreatorAnchor オブジェクトを作成し、そのプロパティを適切な値に割り当てます。

for (int i = 0; i < _cityHallEastPoints.GetLength(0); i++)
{
  ARGeospatialCreatorAnchor anchor =
    new GameObject("City Hall " + i).AddComponent<ARGeospatialCreatorAnchor>();
  anchor.Origin = origin;
  anchor.AnchorManager = anchorManager;
  anchor.Latitude = _cityHallEastPoints[i, 0];
  anchor.Longitude = _cityHallEastPoints[i, 1];
  anchor.AltitudeType = AnchorAltitudeType.Terrain;

  GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
  cube.transform.parent = anchor.transform;
}

これにより、各ポイントに地形アンカーが作成されます。Geospatial Creator は、ARGeospatialCreatorOrigin オブジェクトを基準とした位置を計算して、適切な Unity ワールド座標にアンカーを自動的に配置します。地形アンカーの標高を調整するには、Altitude プロパティを地形サーフェスの上または下にメートル単位で設定します。

実行時に、地形アンカーは実行中のアプリの地表レベルで解決され、Altitude プロパティでオフセットされます。ただし、エディタのシーンのビューでは、3D タイル ジオメトリではなく、デフォルトで WGS84 高度 0 でレンダリングされます。多くの場合、この位置は希望する位置とは異なります。この場合、エディタのシーンのビューでアンカーのデフォルトの高度をオーバーライドできます。UseEditorAltitudeOverride プロパティを true に設定し、EditorAltitudeOverride プロパティを使用して高度を WGS84 メートルで指定します。

anchor.UseEditorAltitudeOverride = true;
anchor.EditorAltitudeOverride = -13.5; // WGS84 altitude at ground level for City Hall plaza

これらの 2 つのプロパティは、エディタ モード以外では効果がなく、実行中のアプリにコンパイルされません。

市庁舎広場の地理空間アンカー

屋上アンカーを作成する

次のアンカーとして、市庁舎の屋上にアンカーを配置するとします。アンカーは、AltitudeType プロパティが AnchorAltitudeType.Rooftop に設定されていることを除き、まったく同じ方法で作成できます。

ARGeospatialCreatorAnchor cityHallRoofAnchor =
  new GameObject("City Hall Roof").AddComponent<ARGeospatialCreatorAnchor>();
cityHallRoofAnchor.Origin = origin;
cityHallRoofAnchor.AnchorManager = anchorManager;
cityHallRoofAnchor.Latitude = 37.77959;
cityHallRoofAnchor.Longitude = -122.419006;
cityHallRoofAnchor.AltitudeType = AnchorAltitudeType.Rooftop;

GameObject roofCube = GameObject.CreatePrimitive(PrimitiveType.Cube);
roofCube.transform.parent = cityHallRoofAnchor.transform;

地形アンカーと同様に、エディタのシーンのビューで UseEditorAltitudeOverride プロパティと EditorAltitudeOverride プロパティを使用して、屋上アンカーの高さを微調整できます。この例では、屋根の WGS84 高度は約 10.7 メートルです。

屋根上の地理空間アンカー

特定の高度でアンカーを作成する

最後のアンカーは、市庁舎のドームの一番上に設置されます。このアンカーでは正確な高度が重要であるため、地形アンカーや屋上アンカーではなく、WGS84 アンカーを使用して明示的に設定します。

ARGeospatialCreatorAnchor cityHallDomeAnchor =
  new GameObject("City Hall Dome").AddComponent<ARGeospatialCreatorAnchor>();
cityHallDomeAnchor.Origin = origin;
cityHallDomeAnchor.AnchorManager = anchorManager;
cityHallDomeAnchor.Latitude = 37.77928;
cityHallDomeAnchor.Longitude = -122.419241;
cityHallDomeAnchor.AltitudeType = AnchorAltitudeType.WGS84;
cityHallDomeAnchor.Altitude = 73;

GameObject domeCube = GameObject.CreatePrimitive(PrimitiveType.Cube);
domeCube.transform.parent = cityHallDomeAnchor.transform;

高度は WGS84 に従ってすでに指定されているため、エディタ専用の高度のオーバーライドを使用する必要はありません。もちろん、エディタで地図タイル ジオメトリの高さが現実世界と比較して正しくない場合でも、エディタのオーバーライドを使用して、シーンビュー内のアンカーの位置を変更できます。

ドームの地理空間アンカー