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

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

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

このガイドは、クイックスタートで紹介する Geospatial Creator の基本的なコンセプトを理解しており、Geospatial Creator のアンカーをシーンに追加する準備ができていることを前提としています。Geospatial Creator を有効にし、API キーとシーンの初期 AR セッション オブジェクトで構成する必要があります。ゼロから作成する場合は、クイックスタート ガイドに沿って Geospatial Creator を有効にするをご覧ください。

ご利用にあたって

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

アンカーを作成する前に、ARGeospatialCreatorOrigin を指定する必要があります。これは、緯度、経度、高度と Unity の世界座標を相互に変換するための基準点です。また、オリジンには CesiumGeoreference サブコンポーネントと Cesium3DTileset 子オブジェクトが含まれます。これにより、Cesium は Unity エディタのシーンビューに周辺領域をレンダリングできます。そのためには、クイックスタートで説明されている Google Map Tiles API キーが必要です。

オリジンを作成する

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 拡張機能にバンドルされている Geospatial サンプル アプリケーションを使用して開始した場合、Anchor Manager が「AR Session Origin」GameObject に接続されます。シーンにアンカー マネージャーが 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 m の立方体を地面に配置するとします。次のコードは、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 に従ってすでに指定されているため、エディタ専用の高度オーバーライドを使用する必要はありません。もちろん、エディタ内の Map Tiles ジオメトリの高さが現実世界と比べて不正確であることが判明した場合でも、エディタのオーバーライドを使用してシーンビュー内のアンカーの位置を変更できます。

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