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